mirror of
https://github.com/julia-actions/setup-julia.git
synced 2026-02-13 03:26:53 +08:00
Compare commits
100 Commits
releases/v
...
v2.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
780022b48d | ||
|
|
3bc2a872da | ||
|
|
0c4130534d | ||
|
|
5956f5ed17 | ||
|
|
a9e17d5c78 | ||
|
|
f2f2b89a9f | ||
|
|
f9eef78196 | ||
|
|
3511533b57 | ||
|
|
8db9e52340 | ||
|
|
1da1716a18 | ||
|
|
7653693003 | ||
|
|
e1580df3b6 | ||
|
|
ba42af3a54 | ||
|
|
4778d3d0c8 | ||
|
|
c7aa298e32 | ||
|
|
cae3c21ea1 | ||
|
|
389de5c0df | ||
|
|
42e03d3446 | ||
|
|
e62bf8c418 | ||
|
|
30038810d2 | ||
|
|
0e4b558b25 | ||
|
|
3599cbd45f | ||
|
|
16b01270a4 | ||
|
|
ed4a842dbe | ||
|
|
63a26ece8c | ||
|
|
4581e12ce4 | ||
|
|
4212b2587b | ||
|
|
a515f9fb49 | ||
|
|
5fb759db5c | ||
|
|
90754937ed | ||
|
|
f5b61b79e1 | ||
|
|
ae2b920dd5 | ||
|
|
699547385f | ||
|
|
85c0672686 | ||
|
|
b96a5725f5 | ||
|
|
437a175294 | ||
|
|
e9d953d306 | ||
|
|
4190528a8c | ||
|
|
9acd04fccc | ||
|
|
e61a30fa06 | ||
|
|
0f702cc7c1 | ||
|
|
bb12998da7 | ||
|
|
9c6e4ea02e | ||
|
|
b69305e71d | ||
|
|
83ec284724 | ||
|
|
afda220f43 | ||
|
|
abbe9013bd | ||
|
|
27b547a6da | ||
|
|
a1c40e9691 | ||
|
|
ffd1649f9b | ||
|
|
f3d4142aa8 | ||
|
|
d3d61d99d5 | ||
|
|
a46a85f797 | ||
|
|
15b8728ec6 | ||
|
|
82b8fbfebd | ||
|
|
0affa9ffb0 | ||
|
|
e27a7638ca | ||
|
|
67c6198a06 | ||
|
|
2c0c1c0f24 | ||
|
|
2e04bcf2ea | ||
|
|
de4ef5e2fd | ||
|
|
c7ecd325d5 | ||
|
|
3961cd13d2 | ||
|
|
e16483e859 | ||
|
|
472a0c3588 | ||
|
|
0644643060 | ||
|
|
c629ec2fb8 | ||
|
|
69754702fb | ||
|
|
e0c860ed1a | ||
|
|
b0ddaa0f3f | ||
|
|
7e992845db | ||
|
|
a86c40a7ef | ||
|
|
5ee76acf71 | ||
|
|
aa55906904 | ||
|
|
3fd1872eb1 | ||
|
|
022282ae13 | ||
|
|
3d2a9887ca | ||
|
|
56e107761d | ||
|
|
8a5ee44838 | ||
|
|
84c4368e8a | ||
|
|
9c1e77be1e | ||
|
|
0e1e5daf3b | ||
|
|
23a5f339d0 | ||
|
|
6b19329a6c | ||
|
|
5ed2862b88 | ||
|
|
431db78ca5 | ||
|
|
400582c979 | ||
|
|
87851b8730 | ||
|
|
c21388676f | ||
|
|
9179217812 | ||
|
|
9ddbd3e829 | ||
|
|
ac49140569 | ||
|
|
ca4f81e332 | ||
|
|
90d78ece70 | ||
|
|
7c41900d93 | ||
|
|
54863dca42 | ||
|
|
2960172124 | ||
|
|
f132be810e | ||
|
|
6d60bc8709 | ||
|
|
152b85e982 |
1
.github/ISSUE_TEMPLATE/bug_report.md
vendored
1
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -3,7 +3,6 @@ name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: "[BUG] "
|
||||
labels: bug
|
||||
assignees: SaschaMann
|
||||
|
||||
---
|
||||
|
||||
|
||||
16
.github/dependabot.yml
vendored
16
.github/dependabot.yml
vendored
@@ -3,5 +3,17 @@ updates:
|
||||
- package-ecosystem: gitsubmodule
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: daily
|
||||
open-pull-requests-limit: 10
|
||||
interval: monthly
|
||||
open-pull-requests-limit: 99
|
||||
|
||||
- package-ecosystem: 'github-actions'
|
||||
directory: '/'
|
||||
schedule:
|
||||
interval: 'monthly'
|
||||
open-pull-requests-limit: 99
|
||||
|
||||
- package-ecosystem: npm
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: monthly
|
||||
open-pull-requests-limit: 99
|
||||
|
||||
11
.github/scripts/common-tests.jl
vendored
Normal file
11
.github/scripts/common-tests.jl
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
if !occursin("hostedtoolcache", Sys.BINDIR)
|
||||
error("the wrong julia is being used: $(Sys.BINDIR)")
|
||||
end
|
||||
if VERSION >= v"1.7.0" # pkgdir was introduced here, and before then mtime wasn't a problem so just skip
|
||||
using Pkg
|
||||
src = pkgdir(Pkg, "src", "Pkg.jl")
|
||||
# mtime is when it's compressed, ctime is when the file is extracted
|
||||
if mtime(src) >= ctime(src)
|
||||
error("source mtime ($(mtime(src))) is not earlier than ctime ($(ctime(src)))")
|
||||
end
|
||||
end
|
||||
34
.github/workflows/backup.yml
vendored
34
.github/workflows/backup.yml
vendored
@@ -1,34 +0,0 @@
|
||||
name: Backup
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '5 4 * * 0'
|
||||
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
backup:
|
||||
runs-on: ubuntu-20.04
|
||||
timeout-minutes: 60
|
||||
|
||||
steps:
|
||||
- name: Configure cache
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: |
|
||||
${{ env.GITHUB_WORKSPACE }}
|
||||
~/.cache/restic
|
||||
key: ${{ runner.os }}
|
||||
|
||||
- name: Install the correct Python version
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: '3.x'
|
||||
|
||||
- name: Run backup action
|
||||
uses: julia-actions/restic-action@main
|
||||
env: # Options: https://restic.readthedocs.io/en/latest/040_backup.html#environment-variables
|
||||
RESTIC_REPOSITORY: b2:${{ secrets.B2_BUCKET }}:${{ github.repository }}
|
||||
RESTIC_PASSWORD: ${{ secrets.RESTIC_PASSWORD }}
|
||||
B2_ACCOUNT_ID: ${{ secrets.B2_ACCOUNT_ID }}
|
||||
B2_ACCOUNT_KEY: ${{ secrets.B2_ACCOUNT_KEY }}
|
||||
10
.github/workflows/checkin.yml
vendored
10
.github/workflows/checkin.yml
vendored
@@ -12,10 +12,14 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 60
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: '.tool-versions'
|
||||
|
||||
- name: "npm ci"
|
||||
run: npm ci --legacy-peer-deps
|
||||
run: npm ci
|
||||
|
||||
- name: "npm run build"
|
||||
run: npm run build
|
||||
@@ -27,6 +31,6 @@ jobs:
|
||||
# Ensure no changes, but ignore node_modules dir since dev/fresh ci deps installed.
|
||||
run: |
|
||||
git diff --exit-code --stat -- . ':!node_modules' \
|
||||
|| (echo "##[error] found changed files after build. please 'npm run build && npm run format'" \
|
||||
|| (echo "##[error] found changed files after build. please 'npm ci && npm run build'" \
|
||||
"and check in all changes" \
|
||||
&& exit 1)
|
||||
|
||||
8
.github/workflows/codeql-analysis.yml
vendored
8
.github/workflows/codeql-analysis.yml
vendored
@@ -42,11 +42,11 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
@@ -57,7 +57,7 @@ jobs:
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
uses: github/codeql-action/autobuild@v3
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
@@ -71,4 +71,4 @@ jobs:
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
||||
uses: github/codeql-action/analyze@v3
|
||||
|
||||
12
.github/workflows/example-builds-defaultarch.yml
vendored
12
.github/workflows/example-builds-defaultarch.yml
vendored
@@ -23,11 +23,17 @@ jobs:
|
||||
os: [ubuntu-latest, macOS-latest, windows-latest]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1.0.0
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
||||
with:
|
||||
node-version-file: '.tool-versions'
|
||||
|
||||
- name: "Install dependencies"
|
||||
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
||||
run: |
|
||||
npm install --legacy-peer-deps
|
||||
npm install
|
||||
npm run build
|
||||
npm run pack
|
||||
|
||||
@@ -38,3 +44,5 @@ jobs:
|
||||
version: ${{ matrix.julia-version }}
|
||||
- run: julia --version
|
||||
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
||||
- name: "Check that the correct julia is used and that archive mtimes are maintained"
|
||||
run: julia --startup-file=no --color=yes ./.github/scripts/common-tests.jl
|
||||
|
||||
@@ -18,15 +18,28 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
julia-version: [nightly, 1.8-nightly]
|
||||
os: [ubuntu-latest, macOS-latest, windows-latest]
|
||||
julia-version: [nightly, 1.10-nightly]
|
||||
os:
|
||||
- ubuntu-latest
|
||||
- windows-latest
|
||||
# - macos-11 # Intel
|
||||
- macos-12 # Intel
|
||||
- macos-13 # Intel
|
||||
- macos-14 # Apple Silicon
|
||||
- macos-latest # Currently Intel, but will probably point to Apple Silicon in the future
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1.0.0
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
||||
with:
|
||||
node-version-file: '.tool-versions'
|
||||
|
||||
- name: "Install dependencies"
|
||||
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
||||
run: |
|
||||
npm install --legacy-peer-deps
|
||||
npm install
|
||||
npm run build
|
||||
npm run pack
|
||||
|
||||
@@ -36,3 +49,5 @@ jobs:
|
||||
version: ${{ matrix.julia-version }}
|
||||
- run: julia --version
|
||||
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
||||
- name: "Check that the correct julia is used and that archive mtimes are maintained"
|
||||
run: julia --startup-file=no --color=yes ./.github/scripts/common-tests.jl
|
||||
|
||||
14
.github/workflows/example-builds-nightly.yml
vendored
14
.github/workflows/example-builds-nightly.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
julia-version: [nightly, 1.8-nightly]
|
||||
julia-version: [nightly, 1.10-nightly]
|
||||
julia-arch: [x64, x86]
|
||||
os: [ubuntu-latest, macOS-latest, windows-latest]
|
||||
# 32-bit Julia binaries are not available on macOS
|
||||
@@ -29,11 +29,17 @@ jobs:
|
||||
julia-arch: x86
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1.0.0
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
||||
with:
|
||||
node-version-file: '.tool-versions'
|
||||
|
||||
- name: "Install dependencies"
|
||||
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
||||
run: |
|
||||
npm install --legacy-peer-deps
|
||||
npm install
|
||||
npm run build
|
||||
npm run pack
|
||||
|
||||
@@ -44,3 +50,5 @@ jobs:
|
||||
arch: ${{ matrix.julia-arch }}
|
||||
- run: julia --version
|
||||
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
||||
- name: "Check that the correct julia is used and that archive mtimes are maintained"
|
||||
run: julia --startup-file=no --color=yes ./.github/scripts/common-tests.jl
|
||||
|
||||
15
.github/workflows/example-builds.yml
vendored
15
.github/workflows/example-builds.yml
vendored
@@ -19,7 +19,8 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
julia-version: ['1.0.5', '1.2', '^1.5.0-beta1', '1']
|
||||
# include '1.6' here to test info message about lts tag existing
|
||||
julia-version: ['1.0.5', '1.2', '^1.5.0-beta1', '1', '1.6', 'lts', 'pre']
|
||||
julia-arch: [x64, x86]
|
||||
os: [ubuntu-latest, macOS-latest, windows-latest]
|
||||
# 32-bit Julia binaries are not available on macOS
|
||||
@@ -28,11 +29,17 @@ jobs:
|
||||
julia-arch: x86
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1.0.0
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
||||
with:
|
||||
node-version-file: '.tool-versions'
|
||||
|
||||
- name: "Install dependencies"
|
||||
if: ${{ ! startsWith(github.ref, 'refs/heads/releases') }}
|
||||
run: |
|
||||
npm install --legacy-peer-deps
|
||||
npm install
|
||||
npm run build
|
||||
npm run pack
|
||||
|
||||
@@ -44,3 +51,5 @@ jobs:
|
||||
arch: ${{ matrix.julia-arch }}
|
||||
- run: julia --version
|
||||
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
||||
- name: "Check that the correct julia is used and that archive mtimes are maintained"
|
||||
run: julia --startup-file=no --color=yes ./.github/scripts/common-tests.jl
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,3 +1,3 @@
|
||||
node_modules/
|
||||
__tests__/runner/*
|
||||
dist/
|
||||
!dist/
|
||||
|
||||
1
.tool-versions
Normal file
1
.tool-versions
Normal file
@@ -0,0 +1 @@
|
||||
nodejs 20.11.1
|
||||
@@ -1,11 +1,3 @@
|
||||
# Dev docs / Contributing guide
|
||||
# Contributing
|
||||
|
||||
## Building and tagging a release (requires write access)
|
||||
|
||||
1. Test your changes, merge into `master`.
|
||||
2. Checkout `master`.
|
||||
3. Bump the version number in [`package.json`](package.json).
|
||||
4. Run `./bin/build-release julia-actions/setup-julia` to create a release branch and build a release.
|
||||
5. Push the branch (**without tags**) and verify that CI is passing on it.
|
||||
6. Run `git push --tags --force` to update the tags.
|
||||
7. Create a release for the `vX.Y.Z` tag.
|
||||
Please see the README in the [`devdocs/`](devdocs/) folder.
|
||||
|
||||
114
README.md
114
README.md
@@ -1,29 +1,36 @@
|
||||
# setup-julia Action
|
||||
|
||||
[](https://securitylab.github.com/tools/codeql)
|
||||
[](https://dependabot.com)
|
||||
|
||||
This action sets up a Julia environment for use in actions by downloading a specified version of Julia and adding it to PATH.
|
||||
|
||||
## Table of Contents
|
||||
- [Table of Contents](#table-of-contents)
|
||||
- [Usage](#usage)
|
||||
- [Inputs](#inputs)
|
||||
- [Outputs](#outputs)
|
||||
- [Basic](#basic)
|
||||
- [Julia Versions](#julia-versions)
|
||||
- [Matrix Testing](#matrix-testing)
|
||||
- [versioninfo](#versioninfo)
|
||||
- [Versioning](#versioning)
|
||||
- [Debug logs](#debug-logs)
|
||||
- [Third party information](#third-party-information)
|
||||
- [setup-julia Action](#setup-julia-action)
|
||||
- [Table of Contents](#table-of-contents)
|
||||
- [Usage](#usage)
|
||||
- [Inputs](#inputs)
|
||||
- [Outputs](#outputs)
|
||||
- [Basic](#basic)
|
||||
- [Julia Versions](#julia-versions)
|
||||
- [Examples](#examples)
|
||||
- [Prereleases](#prereleases)
|
||||
- [Recently released versions](#recently-released-versions)
|
||||
- [Matrix Testing](#matrix-testing)
|
||||
- [64-bit Julia only](#64-bit-julia-only)
|
||||
- [32-bit Julia](#32-bit-julia)
|
||||
- [versioninfo](#versioninfo)
|
||||
- [Versioning](#versioning)
|
||||
- [Using Dependabot version updates to keep your GitHub Actions up to date](#using-dependabot-version-updates-to-keep-your-github-actions-up-to-date)
|
||||
- [Debug logs](#debug-logs)
|
||||
- [Third party information](#third-party-information)
|
||||
- [Contributing to this repo](#contributing-to-this-repo)
|
||||
|
||||
## Usage
|
||||
|
||||
### Inputs
|
||||
|
||||
```yaml
|
||||
- uses: julia-actions/setup-julia@v1
|
||||
- uses: julia-actions/setup-julia@v2
|
||||
with:
|
||||
# The Julia version that will be installed and added as `julia` to the PATH.
|
||||
# See "Julia Versions" below for a list of valid values.
|
||||
@@ -31,7 +38,7 @@ This action sets up a Julia environment for use in actions by downloading a spec
|
||||
# Warning: It is strongly recommended to wrap this value in quotes.
|
||||
# Otherwise, the YAML parser used by GitHub Actions parses certain
|
||||
# versions as numbers which causes the wrong version to be selected.
|
||||
# For example, `1.0` may be parsed as `1`.
|
||||
# For example, `1.10` may be parsed as `1.1`.
|
||||
#
|
||||
# Default: '1'
|
||||
version: ''
|
||||
@@ -87,10 +94,10 @@ outputs:
|
||||
|
||||
```yaml
|
||||
steps:
|
||||
- uses: actions/checkout@v1.0.0
|
||||
- uses: julia-actions/setup-julia@v1
|
||||
- uses: actions/checkout@v4
|
||||
- uses: julia-actions/setup-julia@v2
|
||||
with:
|
||||
version: 1.0.4
|
||||
version: '1.10'
|
||||
- run: julia -e 'println("Hello, World!")'
|
||||
```
|
||||
|
||||
@@ -98,18 +105,22 @@ steps:
|
||||
|
||||
You can either specify specific Julia versions or version ranges. If you specify a version range, the **highest** available Julia version that matches the range will be selected.
|
||||
|
||||
**Warning:** It is strongly recommended to wrap versions in quotes. Otherwise, the YAML parser used by GitHub Actions parses certain versions as numbers which causes the wrong version to be selected. For example, `1.0` may be parsed as `1`.
|
||||
> **Warning**
|
||||
>
|
||||
> It is strongly recommended to wrap versions in quotes. Otherwise, the YAML parser used by GitHub Actions parses certain versions as numbers which causes the wrong version to be selected. For example, `1.0` may be parsed as `1`.
|
||||
|
||||
#### Examples
|
||||
|
||||
- `1.2.0` is a valid semver version. The action will try to download exactly this version. If it's not available, the build step will fail.
|
||||
- `1.0` is a version range that will match the highest available Julia version that starts with `1.0`, e.g. `1.0.5`, excluding pre-releases.
|
||||
- `^1.3.0-rc1` is a **caret** version range that includes pre-releases of `1.3.0` starting at `rc1`. It matches all versions `≥ 1.3.0-rc1` and `< 2.0.0`.
|
||||
- `~1.3.0-rc1` is a **tilde** version range that includes pre-releases of `1.3.0` starting at `rc1`. It matches all versions `≥ 1.3.0-rc1` and `< 1.4.0`.
|
||||
- `^1.3.0-0` is a **caret** version range that includes _all_ pre-releases of `1.3.0`. It matches all versions `≥ 1.3.0-` and `< 2.0.0`.
|
||||
- `~1.3.0-0` is a **tilde** version range that includes _all_ pre-releases of `1.3.0`. It matches all versions `≥ 1.3.0-` and `< 1.4.0`.
|
||||
- `nightly` will install the latest nightly build.
|
||||
- `1.7-nightly` will install the latest nightly build for the upcoming 1.7 release. This version will only be available during certain phases of the Julia release cycle.
|
||||
- `'1.2.0'` is a valid semver version. The action will try to download exactly this version. If it's not available, the build step will fail.
|
||||
- `'1.0'` is a version range that will match the highest available Julia version that starts with `1.0`, e.g. `1.0.5`, excluding pre-releases.
|
||||
- `'^1.3.0-rc1'` is a **caret** version range that includes pre-releases of `1.3.0` starting at `rc1`. It matches all versions `≥ 1.3.0-rc1` and `< 2.0.0`.
|
||||
- `'~1.3.0-rc1'` is a **tilde** version range that includes pre-releases of `1.3.0` starting at `rc1`. It matches all versions `≥ 1.3.0-rc1` and `< 1.4.0`.
|
||||
- `'^1.3.0-0'` is a **caret** version range that includes _all_ pre-releases of `1.3.0`. It matches all versions `≥ 1.3.0-` and `< 2.0.0`.
|
||||
- `'~1.3.0-0'` is a **tilde** version range that includes _all_ pre-releases of `1.3.0`. It matches all versions `≥ 1.3.0-` and `< 1.4.0`.
|
||||
- `'lts'` will install the latest LTS build.
|
||||
- `'pre'` will install the latest prerelease build (RCs, betas, and alphas).
|
||||
- `'nightly'` will install the latest nightly build.
|
||||
- `'1.7-nightly'` will install the latest nightly build for the upcoming 1.7 release. This version will only be available during certain phases of the Julia release cycle.
|
||||
|
||||
Internally the action uses node's semver package to resolve version ranges. Its [documentation](https://github.com/npm/node-semver#advanced-range-syntax) contains more details on the version range syntax. You can test what version will be selected for a given input in this JavaScript [REPL](https://repl.it/@SaschaMann/setup-julia-version-logic).
|
||||
|
||||
@@ -117,7 +128,7 @@ Internally the action uses node's semver package to resolve version ranges. Its
|
||||
|
||||
There are two methods of including pre-releases in version matching:
|
||||
|
||||
1. Including the pre-release tag in the version itself, e.g. `^1.3.0-rc1`.
|
||||
1. Including the pre-release tag in the version itself, e.g. `'^1.3.0-rc1'`.
|
||||
2. Setting the input `include-all-prereleases` to `true`.
|
||||
|
||||
These behave slightly differently.
|
||||
@@ -132,7 +143,7 @@ With `include-all-prereleases: true`, it would match `1.3.0-rc1`, `1.3.0-rc2`, `
|
||||
If you want to run tests against the latest tagged version, no matter what version that is, you can use
|
||||
|
||||
```yaml
|
||||
- uses: julia-actions/setup-julia@v1
|
||||
- uses: julia-actions/setup-julia@v2
|
||||
with:
|
||||
version: '1'
|
||||
include-all-prereleases: true
|
||||
@@ -158,9 +169,9 @@ jobs:
|
||||
os: [ubuntu-latest, windows-latest, macOS-latest]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1.0.0
|
||||
- uses: actions/checkout@v4
|
||||
- name: "Set up Julia"
|
||||
uses: julia-actions/setup-julia@v1
|
||||
uses: julia-actions/setup-julia@v2
|
||||
with:
|
||||
version: ${{ matrix.julia-version }}
|
||||
- run: julia -e 'println("Hello, World!")'
|
||||
@@ -184,9 +195,9 @@ jobs:
|
||||
julia-arch: x86
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1.0.0
|
||||
- uses: actions/checkout@v4
|
||||
- name: "Set up Julia"
|
||||
uses: julia-actions/setup-julia@v1
|
||||
uses: julia-actions/setup-julia@v2
|
||||
with:
|
||||
version: ${{ matrix.julia-version }}
|
||||
arch: ${{ matrix.julia-arch }}
|
||||
@@ -211,9 +222,9 @@ jobs:
|
||||
julia-arch: x86
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1.0.0
|
||||
- uses: actions/checkout@v4
|
||||
- name: "Set up Julia"
|
||||
uses: julia-actions/setup-julia@v1
|
||||
uses: julia-actions/setup-julia@v2
|
||||
with:
|
||||
version: ${{ matrix.julia-version }}
|
||||
- run: julia -e 'println("Hello, World!")'
|
||||
@@ -236,23 +247,44 @@ This action follows [GitHub's advice](https://help.github.com/en/articles/about-
|
||||
|
||||
If you don't want to deal with updating the version of the action, similiarly to how Travis CI handles it, use `latest` or major version branches. [Dependabot](https://dependabot.com/) can also be used to automatically create Pull Requests to update actions used in your workflows.
|
||||
|
||||
It's unlikely, but not impossible, that there will be breaking changes post-v1.0.0 unless a new major version of Julia is introduced.
|
||||
It's unlikely, but not impossible, that there will be breaking changes post-v2.0.0 unless a new major version of Julia is introduced.
|
||||
|
||||
You can specify commits, branches or tags in your workflows as follows:
|
||||
|
||||
```yaml
|
||||
steps:
|
||||
- uses: julia-actions/setup-julia@d3ce119a16594ea9e5d7974813970c73b6ab9e94 # commit SHA of the tagged 1.4.1 commit
|
||||
- uses: julia-actions/setup-julia@f2258781c657ad9b4b88072c5eeaf9ec8c370874 # commit SHA of the tagged 2.0.0 commit
|
||||
- uses: julia-actions/setup-julia@latest # latest version tag (may break existing workflows)
|
||||
- uses: julia-actions/setup-julia@v1 # major version tag
|
||||
- uses: julia-actions/setup-julia@v1.4 # minor version tag
|
||||
- uses: julia-actions/setup-julia@v1.4.1 # specific version tag
|
||||
- uses: julia-actions/setup-julia@v2 # major version tag
|
||||
- uses: julia-actions/setup-julia@v2.0 # minor version tag
|
||||
- uses: julia-actions/setup-julia@v2.0.0 # specific version tag
|
||||
```
|
||||
|
||||
If your workflow requires access to secrets, you should always pin it to a commit SHA instead of a tag.
|
||||
This will protect you in case a bad actor gains access to the setup-julia repo.
|
||||
You can find more information in [GitHub's security hardening guide](https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/security-hardening-for-github-actions#using-third-party-actions).
|
||||
|
||||
## Using Dependabot version updates to keep your GitHub Actions up to date
|
||||
|
||||
We highly recommend that you set up Dependabot version updates on your repo to keep your GitHub Actions up to date.
|
||||
|
||||
To set up Dependabot version updates, create a file named `.github/dependabot.yml` in your repo with the following contents:
|
||||
|
||||
```yaml
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "monthly"
|
||||
open-pull-requests-limit: 99
|
||||
labels:
|
||||
- "dependencies"
|
||||
- "github-actions"
|
||||
```
|
||||
|
||||
For more details on Dependabot version updates, see the [GitHub Dependabot documentation](https://docs.github.com/en/code-security/dependabot/dependabot-version-updates).
|
||||
|
||||
## Debug logs
|
||||
|
||||
You can enable [Step Debug Logs](https://github.com/actions/toolkit/blob/main/docs/action-debugging.md#step-debug-logs) for more detailed logs.
|
||||
@@ -261,3 +293,7 @@ Note that when debug logs are enabled, a request will be sent to `https://httpbi
|
||||
## Third party information
|
||||
Parts of this software have been derived from other open source software.
|
||||
See [THIRD_PARTY_NOTICE.md](THIRD_PARTY_NOTICE.md) for details.
|
||||
|
||||
## Contributing to this repo
|
||||
|
||||
Please see the README in the [`devdocs/`](devdocs/) folder.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -4,30 +4,30 @@
|
||||
import * as path from 'path'
|
||||
|
||||
import * as io from '@actions/io'
|
||||
|
||||
import nock = require('nock')
|
||||
import * as semver from 'semver'
|
||||
|
||||
import nock = require('nock')
|
||||
|
||||
const testVersions = [
|
||||
'0.1.2', '0.2.0', '0.2.1', '0.3.0',
|
||||
'0.3.1', '0.3.10', '0.3.11', '0.3.12',
|
||||
'0.3.2', '0.3.3', '0.3.4', '0.3.5',
|
||||
'0.3.6', '0.3.7', '0.3.8', '0.3.9',
|
||||
'0.4.0', '0.4.0-rc1', '0.4.0-rc2', '0.4.0-rc3',
|
||||
'0.4.0-rc4', '0.4.1', '0.4.2', '0.4.3',
|
||||
'0.4.4', '0.4.5', '0.4.6', '0.4.7',
|
||||
'0.5.0', '0.5.0-rc0', '0.5.0-rc1', '0.5.0-rc2',
|
||||
'0.5.0-rc3', '0.5.0-rc4', '0.5.1', '0.5.2',
|
||||
'0.6.0', '0.6.0-pre.alpha', '0.6.0-pre.beta', '0.6.0-rc1',
|
||||
'0.6.0-rc2', '0.6.0-rc3', '0.6.1', '0.6.2',
|
||||
'0.6.3', '0.6.4', '0.7.0', '0.7.0-alpha',
|
||||
'0.7.0-beta', '0.7.0-beta2', '0.7.0-rc1', '0.7.0-rc2',
|
||||
'0.7.0-rc3', '1.0.0', '1.0.0-rc1', '1.0.1',
|
||||
'1.0.2', '1.0.3', '1.0.4', '1.0.5',
|
||||
'1.1.0', '1.1.0-rc1', '1.1.0-rc2', '1.1.1',
|
||||
'1.2.0', '1.2.0-rc1', '1.2.0-rc2', '1.2.0-rc3',
|
||||
'1.3.0-alpha', '1.3.0-rc1', '1.3.0-rc2', '1.3.0-rc3',
|
||||
'1.3.0-rc4'
|
||||
'0.1.2',
|
||||
'0.2.0', '0.2.1',
|
||||
'0.3.0', '0.3.1', '0.3.10', '0.3.11', '0.3.12', '0.3.2', '0.3.3', '0.3.4', '0.3.5', '0.3.6', '0.3.7', '0.3.8', '0.3.9',
|
||||
'0.4.0', '0.4.0-rc1', '0.4.0-rc2', '0.4.0-rc3', '0.4.0-rc4', '0.4.1', '0.4.2', '0.4.3', '0.4.4', '0.4.5', '0.4.6', '0.4.7',
|
||||
'0.5.0', '0.5.0-rc0', '0.5.0-rc1', '0.5.0-rc2', '0.5.0-rc3', '0.5.0-rc4', '0.5.1', '0.5.2',
|
||||
'0.6.0', '0.6.0-pre.alpha', '0.6.0-pre.beta', '0.6.0-rc1', '0.6.0-rc2', '0.6.0-rc3', '0.6.1', '0.6.2', '0.6.3', '0.6.4',
|
||||
'0.7.0', '0.7.0-alpha', '0.7.0-beta', '0.7.0-beta2', '0.7.0-rc1', '0.7.0-rc2', '0.7.0-rc3',
|
||||
'1.0.0', '1.0.0-rc1', '1.0.1', '1.0.2', '1.0.3', '1.0.4', '1.0.5',
|
||||
'1.1.0', '1.1.0-rc1', '1.1.0-rc2', '1.1.1',
|
||||
'1.2.0', '1.2.0-rc1', '1.2.0-rc2', '1.2.0-rc3',
|
||||
'1.3.0', '1.3.0-alpha', '1.3.0-rc1', '1.3.0-rc2', '1.3.0-rc3', '1.3.0-rc4', '1.3.0-rc5', '1.3.1',
|
||||
'1.4.0', '1.4.0-rc1', '1.4.0-rc2', '1.4.1', '1.4.2',
|
||||
'1.5.0', '1.5.0-beta1', '1.5.0-rc1', '1.5.0-rc2', '1.5.1', '1.5.2', '1.5.3', '1.5.4',
|
||||
'1.6.0', '1.6.0-beta1', '1.6.0-rc1', '1.6.0-rc2', '1.6.0-rc3', '1.6.1', '1.6.2', '1.6.3', '1.6.4', '1.6.5', '1.6.6', '1.6.7',
|
||||
'1.7.0', '1.7.0-beta1', '1.7.0-beta2', '1.7.0-beta3', '1.7.0-beta4', '1.7.0-rc1', '1.7.0-rc2', '1.7.0-rc3', '1.7.1', '1.7.2', '1.7.3',
|
||||
'1.8.0', '1.8.0-beta1', '1.8.0-beta2', '1.8.0-beta3', '1.8.0-rc1', '1.8.0-rc2', '1.8.0-rc3', '1.8.0-rc4', '1.8.1', '1.8.2', '1.8.3', '1.8.4', '1.8.5',
|
||||
'1.9.0', '1.9.0-alpha1', '1.9.0-beta1', '1.9.0-beta2', '1.9.0-beta3', '1.9.0-beta4', '1.9.0-rc1', '1.9.0-rc2', '1.9.0-rc3', '1.9.1', '1.9.2', '1.9.3', '1.9.4',
|
||||
'1.10.0', '1.10.0-alpha1', '1.10.0-beta1', '1.10.0-beta2', '1.10.0-beta3', '1.10.0-rc1', '1.10.0-rc2', '1.10.0-rc3', '1.10.1', '1.10.2',
|
||||
'1.11.0-alpha1', '1.11.0-alpha2', '1.11.0-beta1'
|
||||
]
|
||||
|
||||
const toolDir = path.join(__dirname, 'runner', 'tools')
|
||||
@@ -55,22 +55,33 @@ describe('version matching tests', () => {
|
||||
expect(installer.getJuliaVersion([], 'nightly')).toEqual('nightly')
|
||||
expect(installer.getJuliaVersion(testVersions, 'nightly')).toEqual('nightly')
|
||||
})
|
||||
|
||||
it('LTS', () => {
|
||||
// Update test when LTS is updated
|
||||
expect(installer.getJuliaVersion(testVersions, 'lts')).toEqual(installer.getJuliaVersion(testVersions, '1.6'))
|
||||
expect(installer.getJuliaVersion(testVersions, 'lts')).toEqual('1.6.7')
|
||||
})
|
||||
|
||||
it('pre', () => {
|
||||
expect(installer.getJuliaVersion(testVersions, 'pre')).toEqual('1.11.0-beta1')
|
||||
})
|
||||
})
|
||||
|
||||
describe('version ranges', () => {
|
||||
it('Chooses the highest available version that matches the input', () => {
|
||||
expect(installer.getJuliaVersion(testVersions, '1')).toEqual('1.2.0')
|
||||
expect(installer.getJuliaVersion(testVersions, '1')).toEqual('1.10.2')
|
||||
expect(installer.getJuliaVersion(testVersions, '1.0')).toEqual('1.0.5')
|
||||
expect(installer.getJuliaVersion(testVersions, '^1.3.0-rc1')).toEqual('1.3.0-rc4')
|
||||
expect(installer.getJuliaVersion(testVersions, '^1.2.0-rc1')).toEqual('1.2.0')
|
||||
expect(installer.getJuliaVersion(testVersions, '^1.3.0-rc1')).toEqual('1.10.2')
|
||||
expect(installer.getJuliaVersion(testVersions, '^1.2.0-rc1')).toEqual('1.10.2')
|
||||
expect(installer.getJuliaVersion(testVersions, '^1.10.0-rc1')).toEqual('1.10.2')
|
||||
})
|
||||
})
|
||||
|
||||
describe('include-prereleases', () => {
|
||||
it('Chooses the highest available version that matches the input including prereleases', () => {
|
||||
expect(installer.getJuliaVersion(testVersions, '^1.2.0-0', true)).toEqual('1.3.0-rc4')
|
||||
expect(installer.getJuliaVersion(testVersions, '1', true)).toEqual('1.3.0-rc4')
|
||||
expect(installer.getJuliaVersion(testVersions, '^1.2.0-0', false)).toEqual('1.2.0')
|
||||
expect(installer.getJuliaVersion(testVersions, '^1.2.0-0', true)).toEqual('1.11.0-beta1')
|
||||
expect(installer.getJuliaVersion(testVersions, '1', true)).toEqual('1.11.0-beta1')
|
||||
expect(installer.getJuliaVersion(testVersions, '^1.2.0-0', false)).toEqual('1.10.2')
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
name: 'Setup Julia environment'
|
||||
description: 'Setup a Julia environment and add it to the PATH'
|
||||
author: 'Sascha Mann'
|
||||
inputs:
|
||||
inputs:
|
||||
version:
|
||||
description: 'The Julia version to download (if necessary) and use. Example: 1.0.4'
|
||||
description: 'The Julia version to download (if necessary) and use. Use a string input to avoid unwanted decimal conversion e.g. 1.10 without quotes will be interpreted as 1.1. Examples: "1", "1.10", "lts", "pre"'
|
||||
default: '1'
|
||||
include-all-prereleases:
|
||||
description: 'Include prereleases when matching the Julia version to available versions.'
|
||||
@@ -12,7 +12,7 @@ inputs:
|
||||
arch:
|
||||
description: 'Architecture of the Julia binaries. Defaults to the architecture of the runner executing the job.'
|
||||
required: false
|
||||
default: '${{ runner.arch }}'
|
||||
default: 'default'
|
||||
show-versioninfo:
|
||||
description: 'Display InteractiveUtils.versioninfo() after installing'
|
||||
required: false
|
||||
@@ -23,7 +23,7 @@ outputs:
|
||||
julia-bindir:
|
||||
description: 'Path to the directory containing the Julia executable. Equivalent to JULIA_BINDIR: https://docs.julialang.org/en/v1/manual/environment-variables/#JULIA_BINDIR'
|
||||
runs:
|
||||
using: 'node16'
|
||||
using: 'node20'
|
||||
main: 'dist/index.js'
|
||||
branding:
|
||||
icon: 'download'
|
||||
|
||||
2
bin
2
bin
Submodule bin updated: 31b4b500a3...874bfe398c
7
devdocs/README.md
Normal file
7
devdocs/README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Devdocs for the `setup-julia` repo
|
||||
|
||||
If you want to make a pull request to this repo, please read the following:
|
||||
1. [Local development](local_setup.md)
|
||||
|
||||
If you have commit access to this repo, you may be interested in the following:
|
||||
1. [Making a new release of this action](making_a_new_release.md)
|
||||
47
devdocs/local_setup.md
Normal file
47
devdocs/local_setup.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# Local development
|
||||
|
||||
## 1. Clone the repo
|
||||
|
||||
```bash
|
||||
git clone git@github.com:julia-actions/setup-julia.git
|
||||
cd setup-julia
|
||||
```
|
||||
|
||||
## 2. Install NodeJS
|
||||
|
||||
### Unix, using `asdf` (recommended, but not required)
|
||||
|
||||
First, make sure that you have installed [`asdf`](https://asdf-vm.com/) on your local machine.
|
||||
|
||||
Then, `cd` to your clone of the repo and run the following commands:
|
||||
|
||||
```bash
|
||||
asdf plugin add nodejs
|
||||
asdf install
|
||||
```
|
||||
|
||||
This will use `asdf` to install the correct version of NodeJS.
|
||||
|
||||
### Unix, but not using `asdf`
|
||||
|
||||
Instead of using `asdf`, you can instead choose to install NodeJS manually.
|
||||
|
||||
First, check the `.tool-versions` file in this repo, and see what version of NodeJS you need. Then, install that same version of NodejS on your local machine.
|
||||
|
||||
### Windows
|
||||
|
||||
`asdf` does not (currently) support Windows. So on Windows, you have to install NodeJS manually.
|
||||
|
||||
First, check the `.tool-versions` file in this repo, and see what version of NodeJS you need. Then, install that same version of NodejS on your local machine.
|
||||
|
||||
## 3. Working locally
|
||||
|
||||
First, `cd` to your clone of the repo. Now you can run the following commands:
|
||||
|
||||
```bash
|
||||
npm ci
|
||||
|
||||
npm run build
|
||||
```
|
||||
|
||||
When you are ready, you can commit your changes and push them to your PR.
|
||||
128
devdocs/making_a_new_release.md
Normal file
128
devdocs/making_a_new_release.md
Normal file
@@ -0,0 +1,128 @@
|
||||
# Making a new release of this action (requires commit access)
|
||||
|
||||
If you have commit access to this repo, you can make a new release.
|
||||
|
||||
Here are the instructions.
|
||||
|
||||
## Step 1: Clone a fresh copy of the repo
|
||||
|
||||
We intentionally work in a brand-new copy of the repo.
|
||||
|
||||
```bash
|
||||
git clone git@github.com:julia-actions/setup-julia.git
|
||||
cd setup-julia
|
||||
git checkout master
|
||||
git submodule init
|
||||
git submodule update
|
||||
```
|
||||
|
||||
## Step 2: Make sure you have the right version of NodeJS
|
||||
|
||||
If you use [`asdf`](https://asdf-vm.com/), this is as simple as:
|
||||
|
||||
```bash
|
||||
asdf plugin add nodejs
|
||||
asdf install
|
||||
```
|
||||
|
||||
If you don't use `asdf`, then you need to:
|
||||
1. Open the `./tool-versions` file in the root of the repo.
|
||||
2. Make note of the NodeJS version listed in the `.tool-versions` file.
|
||||
3. Install that same version of NodeJS on your machine.
|
||||
4. Make sure that you are currently using that version of NodeJS (i.e. it is at the front of your PATH).
|
||||
|
||||
## Step 3: Edit the `version` field in `package.json`
|
||||
|
||||
```bash
|
||||
vim package.json
|
||||
|
||||
# Edit the `version` number (should be line 2)
|
||||
# Save your changes in Vim. Then exit Vim.
|
||||
|
||||
# For the remaining of this guide, let MAJOR.MINOR.PATCH refer
|
||||
# to the new version number that you set.
|
||||
|
||||
git add package.json
|
||||
|
||||
# No need to commit yet.
|
||||
# The release script will run `git commit`.
|
||||
```
|
||||
|
||||
## Step 4: Remove the `dist/` line from the `.gitignore` file
|
||||
|
||||
```bash
|
||||
vim .gitignore
|
||||
# Delete the line that says `dist/` (it should be line 3)
|
||||
# Save your changes in Vim. Then exit Vim.
|
||||
|
||||
git add .gitignore
|
||||
|
||||
# No need to commit yet.
|
||||
# The release script will run `git commit`.
|
||||
```
|
||||
|
||||
## Step 5: Make sure you have the necessary dependencies
|
||||
|
||||
The `build-release.sh` script requires the following dependencies:
|
||||
|
||||
1. Bash
|
||||
2. `curl`
|
||||
3. `git`
|
||||
4. `jq`
|
||||
5. `sed`
|
||||
|
||||
## Step 6: Run the `build-release.sh` script
|
||||
|
||||
```bash
|
||||
ls -l bin/build-release.sh
|
||||
chmod +x bin/build-release.sh
|
||||
ls -l bin/build-release.sh
|
||||
|
||||
./bin/build-release.sh julia-actions/setup-julia
|
||||
```
|
||||
|
||||
Wait a minute or two. The script will build everything and will create a new release branch named `releases/vMAJOR.MINOR.PATCH`.
|
||||
|
||||
## Step 7: Push ONLY the `releases/vMAJOR.MINOR.PATCH` branch
|
||||
|
||||
Only push the `releases/` branch. Do NOT push any tags yet.
|
||||
|
||||
```bash
|
||||
git push origin releases/vMAJOR.MINOR.PATCH
|
||||
```
|
||||
|
||||
Now you need to go to https://github.com/julia-actions/setup-julia/tree/releases/vMAJOR.MINOR.PATCH and wait for CI to finish running.
|
||||
|
||||
Do NOT proceed to the next step until CI is all green on the `releases/vMAJOR.MINOR.PATCH` branch.
|
||||
|
||||
## Step 8: Push the tags (only after CI is all green)
|
||||
|
||||
Once CI is all green on the `releases/vMAJOR.MINOR.PATCH` branch, you can push the tags.
|
||||
|
||||
You need to force-push.
|
||||
|
||||
```bash
|
||||
git push --tags --force
|
||||
```
|
||||
|
||||
## Step 9: Use the GitHub web UI to create a new GitHub Release
|
||||
|
||||
Go to https://github.com/julia-actions/setup-julia/releases and create a new release for the now-existant `vMAJOR.MINOR.PATCH` tag using the GitHub web interface.
|
||||
|
||||
## Step 10: Clean up your local repo
|
||||
|
||||
```bash
|
||||
git submodule deinit --force .
|
||||
git submodule update --init
|
||||
git fetch --all --prune
|
||||
git checkout master
|
||||
git reset --hard origin/master
|
||||
```
|
||||
|
||||
## Step 11: Delete your local repo
|
||||
|
||||
```bash
|
||||
cd ..
|
||||
ls setup-julia
|
||||
rm -rf setup-julia
|
||||
```
|
||||
@@ -1,4 +1,4 @@
|
||||
# Contributors
|
||||
# Misc notes for contributors
|
||||
|
||||
### Checkin
|
||||
|
||||
@@ -19,4 +19,4 @@ git commit -m "Informative commit message" # Commit. This will run Husky
|
||||
```
|
||||
|
||||
During the commit step, Husky will take care of formatting all files with [Prettier](https://github.com/prettier/prettier) as well as pruning out devDependencies using `npm prune --production`.
|
||||
It will also make sure these changes are appropriately included in your commit (no further work is needed)
|
||||
It will also make sure these changes are appropriately included in your commit (no further work is needed)
|
||||
10162
dist/index.js
vendored
Normal file
10162
dist/index.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
169
lib/installer.js
generated
169
lib/installer.js
generated
@@ -1,20 +1,44 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||
result["default"] = mod;
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.getJuliaVersionInfo = getJuliaVersionInfo;
|
||||
exports.getJuliaVersions = getJuliaVersions;
|
||||
exports.getJuliaVersion = getJuliaVersion;
|
||||
exports.getFileInfo = getFileInfo;
|
||||
exports.getDownloadURL = getDownloadURL;
|
||||
exports.installJulia = installJulia;
|
||||
exports.showVersionInfo = showVersionInfo;
|
||||
const core = __importStar(require("@actions/core"));
|
||||
const exec = __importStar(require("@actions/exec"));
|
||||
const tc = __importStar(require("@actions/tool-cache"));
|
||||
@@ -24,6 +48,8 @@ const os = __importStar(require("os"));
|
||||
const path = __importStar(require("path"));
|
||||
const retry = require("async-retry");
|
||||
const semver = __importStar(require("semver"));
|
||||
const LTS_VERSION = '1.6';
|
||||
const MAJOR_VERSION = '1'; // Could be deduced from versions.json
|
||||
// Translations between actions input and Julia arch names
|
||||
const osMap = {
|
||||
'win32': 'winnt',
|
||||
@@ -66,14 +92,14 @@ function getJuliaVersionInfo() {
|
||||
const versionsFile = yield retry((bail) => __awaiter(this, void 0, void 0, function* () {
|
||||
return yield tc.downloadTool('https://julialang-s3.julialang.org/bin/versions.json');
|
||||
}), {
|
||||
retries: 5,
|
||||
onRetry: (err) => {
|
||||
core.debug(`Download of versions.json failed, trying again. Error: ${err}`);
|
||||
core.info(`Download of versions.json failed, trying again. Error: ${err}`);
|
||||
}
|
||||
});
|
||||
return JSON.parse(fs.readFileSync(versionsFile).toString());
|
||||
});
|
||||
}
|
||||
exports.getJuliaVersionInfo = getJuliaVersionInfo;
|
||||
/**
|
||||
* @returns An array of all Julia versions available for download
|
||||
*/
|
||||
@@ -86,12 +112,17 @@ function getJuliaVersions(versionInfo) {
|
||||
return versions;
|
||||
});
|
||||
}
|
||||
exports.getJuliaVersions = getJuliaVersions;
|
||||
function getJuliaVersion(availableReleases, versionInput, includePrerelease = false) {
|
||||
if (semver.valid(versionInput) == versionInput || versionInput.endsWith('nightly')) {
|
||||
// versionInput is a valid version or a nightly version, use it directly
|
||||
return versionInput;
|
||||
}
|
||||
if (versionInput == 'lts') {
|
||||
return getJuliaVersion(availableReleases, LTS_VERSION, false);
|
||||
}
|
||||
if (versionInput == 'pre') {
|
||||
return getJuliaVersion(availableReleases, MAJOR_VERSION, true);
|
||||
}
|
||||
// Use the highest available version that matches versionInput
|
||||
let version = semver.maxSatisfying(availableReleases, versionInput, { includePrerelease });
|
||||
if (version == null) {
|
||||
@@ -101,15 +132,14 @@ function getJuliaVersion(availableReleases, versionInput, includePrerelease = fa
|
||||
version = version.replace(/^v/, '');
|
||||
return version;
|
||||
}
|
||||
exports.getJuliaVersion = getJuliaVersion;
|
||||
function getDesiredFileExts() {
|
||||
let fileExt1;
|
||||
let hasFileExt2;
|
||||
let fileExt2;
|
||||
if (osPlat == 'win32') {
|
||||
fileExt1 = 'exe';
|
||||
hasFileExt2 = false;
|
||||
fileExt2 = '';
|
||||
fileExt1 = 'tar.gz';
|
||||
hasFileExt2 = true;
|
||||
fileExt2 = 'exe';
|
||||
}
|
||||
else if (osPlat == 'darwin') {
|
||||
fileExt1 = 'tar.gz';
|
||||
@@ -131,16 +161,46 @@ function getNightlyFileName(arch) {
|
||||
let fileExt1;
|
||||
[fileExt1, ,] = getDesiredFileExts();
|
||||
if (osPlat == 'win32') {
|
||||
versionExt = arch == 'x64' ? '-win64' : '-win32';
|
||||
if (arch == 'x86') {
|
||||
versionExt = '-win32';
|
||||
}
|
||||
else if (arch == 'aarch64') {
|
||||
throw new Error('Aarch64 Julia is not available on Windows');
|
||||
}
|
||||
else if (arch == 'x64') {
|
||||
versionExt = '-win64';
|
||||
}
|
||||
else {
|
||||
throw new Error(`Architecture ${arch} is not supported on Windows`);
|
||||
}
|
||||
}
|
||||
else if (osPlat == 'darwin') {
|
||||
if (arch == 'x86') {
|
||||
throw new Error('32-bit Julia is not available on macOS');
|
||||
throw new Error('32-bit (x86) Julia is not available on macOS');
|
||||
}
|
||||
else if (arch == 'aarch64') {
|
||||
versionExt = '-macaarch64';
|
||||
}
|
||||
else if (arch == 'x64') {
|
||||
versionExt = '-mac64';
|
||||
}
|
||||
else {
|
||||
throw new Error(`Architecture ${arch} is not supported on macOS`);
|
||||
}
|
||||
versionExt = '-mac64';
|
||||
}
|
||||
else if (osPlat === 'linux') {
|
||||
versionExt = arch == 'x64' ? '-linux64' : '-linux32';
|
||||
if (arch == 'x86') {
|
||||
versionExt = '-linux32';
|
||||
}
|
||||
else if (arch == 'aarch64') {
|
||||
versionExt = '-linux-aarch64';
|
||||
}
|
||||
else if (arch == 'x64') {
|
||||
versionExt = '-linux64';
|
||||
}
|
||||
else {
|
||||
throw new Error(`Architecture ${arch} is not supported on Linux`);
|
||||
}
|
||||
}
|
||||
else {
|
||||
throw new Error(`Platform ${osPlat} is not supported`);
|
||||
@@ -157,6 +217,7 @@ function getFileInfo(versionInfo, version, arch) {
|
||||
return null;
|
||||
}
|
||||
if (!versionInfo[version]) {
|
||||
core.error(`Encountered error: ${err}`);
|
||||
throw err;
|
||||
}
|
||||
for (let file of versionInfo[version].files) {
|
||||
@@ -175,10 +236,35 @@ function getFileInfo(versionInfo, version, arch) {
|
||||
}
|
||||
}
|
||||
}
|
||||
// The following block is just to provide improved log messages in the CI logs.
|
||||
// We specifically want to improve the case where someone is trying to install
|
||||
// Julia 1.6 or 1.7 on Apple Silicon (aarch64) macOS.
|
||||
{
|
||||
const one_fileext_is_targz = (fileExt1 == "tar.gz") || (fileExt2 == "tar.gz");
|
||||
const one_fileext_is_dmg = (fileExt1 == "dmg") || (fileExt2 == "dmg");
|
||||
const one_fileext_is_targz_and_other_is_dmg = one_fileext_is_targz && one_fileext_is_dmg;
|
||||
// We say that "this Julia version does NOT have native binaries for Apple Silicon"
|
||||
// if and only if "this Julia version is < 1.8.0"
|
||||
const this_julia_version_does_NOT_have_native_binaries_for_apple_silicon = semver.lt(version, '1.8.0');
|
||||
const this_is_macos = osPlat == 'darwin';
|
||||
if (this_is_macos && one_fileext_is_targz_and_other_is_dmg && this_julia_version_does_NOT_have_native_binaries_for_apple_silicon) {
|
||||
const msg = `It looks like you are trying to install Julia 1.6 or 1.7 on ` +
|
||||
`the "macos-latest" runners.\n` +
|
||||
`"macos-latest" now resolves to "macos-14", which run on Apple ` +
|
||||
`Silicon (aarch64) macOS machines.\n` +
|
||||
`Unfortunately, Julia 1.6 and 1.7 do not have native binaries ` +
|
||||
`available for Apple Silicon macOS.\n` +
|
||||
`Therefore, it is not possible to install Julia with the current ` +
|
||||
`constraints.\n` +
|
||||
`For instructions on how to fix this error, please see the following Discourse post: ` +
|
||||
`https://discourse.julialang.org/t/how-to-fix-github-actions-ci-failures-with-julia-1-6-or-1-7-on-macos-latest-and-macos-14/117019`;
|
||||
core.error(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
core.error(`Encountered error: ${err}`);
|
||||
throw err;
|
||||
}
|
||||
exports.getFileInfo = getFileInfo;
|
||||
function getDownloadURL(fileInfo, version, arch) {
|
||||
const baseURL = `https://julialangnightlies-s3.julialang.org/bin/${osMap[osPlat]}/${arch}`;
|
||||
// release branch nightlies, e.g. 1.6-nightlies should return .../bin/linux/x64/1.6/julia-latest-linux64.tar.gz
|
||||
@@ -196,8 +282,7 @@ function getDownloadURL(fileInfo, version, arch) {
|
||||
}
|
||||
return fileInfo.url;
|
||||
}
|
||||
exports.getDownloadURL = getDownloadURL;
|
||||
function installJulia(versionInfo, version, arch) {
|
||||
function installJulia(dest, versionInfo, version, arch) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
// Download Julia
|
||||
const fileInfo = getFileInfo(versionInfo, version, arch);
|
||||
@@ -208,8 +293,9 @@ function installJulia(versionInfo, version, arch) {
|
||||
const juliaDownloadPath = yield retry((bail) => __awaiter(this, void 0, void 0, function* () {
|
||||
return yield tc.downloadTool(downloadURL);
|
||||
}), {
|
||||
retries: 5,
|
||||
onRetry: (err) => {
|
||||
core.debug(`Download of ${downloadURL} failed, trying again. Error: ${err}`);
|
||||
core.info(`Download of ${downloadURL} failed, trying again. Error: ${err}`);
|
||||
}
|
||||
});
|
||||
// Verify checksum
|
||||
@@ -223,40 +309,46 @@ function installJulia(versionInfo, version, arch) {
|
||||
else {
|
||||
core.debug('Skipping checksum check for nightly binaries.');
|
||||
}
|
||||
const tempInstallDir = fs.mkdtempSync(`julia-${arch}-${version}-`);
|
||||
// Install it
|
||||
switch (osPlat) {
|
||||
case 'linux':
|
||||
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
||||
yield exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', tempInstallDir]);
|
||||
return tempInstallDir;
|
||||
yield exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', dest]);
|
||||
return dest;
|
||||
case 'win32':
|
||||
if (version.endsWith('nightly') || semver.gtr(version, '1.3', { includePrerelease: true })) {
|
||||
// The installer changed in 1.4: https://github.com/JuliaLang/julia/blob/ef0c9108b12f3ae177c51037934351ffa703b0b5/NEWS.md#build-system-changes
|
||||
yield exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/SILENT /dir=${path.join(process.cwd(), tempInstallDir)}" -NoNewWindow -Wait`]);
|
||||
if (fileInfo !== null && fileInfo.extension == 'exe') {
|
||||
if (version.endsWith('nightly') || semver.gtr(version, '1.3', { includePrerelease: true })) {
|
||||
// The installer changed in 1.4: https://github.com/JuliaLang/julia/blob/ef0c9108b12f3ae177c51037934351ffa703b0b5/NEWS.md#build-system-changes
|
||||
yield exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/SILENT /dir=${path.join(process.cwd(), dest)}" -NoNewWindow -Wait`]);
|
||||
}
|
||||
else {
|
||||
yield exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/S /D=${path.join(process.cwd(), dest)}" -NoNewWindow -Wait`]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
yield exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/S /D=${path.join(process.cwd(), tempInstallDir)}" -NoNewWindow -Wait`]);
|
||||
// This is the more common path. Using .tar.gz is much faster
|
||||
// don't use the Git bash provided tar. Issue #205
|
||||
// https://github.com/julia-actions/setup-julia/issues/205
|
||||
yield exec.exec('powershell', ['-Command', `& "$env:WINDIR/System32/tar" xf ${juliaDownloadPath} --strip-components=1 -C ${dest}`]);
|
||||
}
|
||||
return tempInstallDir;
|
||||
return dest;
|
||||
case 'darwin':
|
||||
if (fileInfo !== null && fileInfo.extension == 'dmg') {
|
||||
core.debug(`Support for .dmg files is deprecated and may be removed in a future release`);
|
||||
yield exec.exec('hdiutil', ['attach', juliaDownloadPath]);
|
||||
yield exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${tempInstallDir}`]);
|
||||
return path.join(tempInstallDir, 'julia');
|
||||
yield exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${dest}`]);
|
||||
return path.join(dest, 'julia');
|
||||
}
|
||||
else {
|
||||
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
||||
yield exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', tempInstallDir]);
|
||||
return tempInstallDir;
|
||||
yield exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', dest]);
|
||||
return dest;
|
||||
}
|
||||
default:
|
||||
throw new Error(`Platform ${osPlat} is not supported`);
|
||||
}
|
||||
});
|
||||
}
|
||||
exports.installJulia = installJulia;
|
||||
/**
|
||||
* Test if Julia has been installed and print the version.
|
||||
*
|
||||
@@ -293,4 +385,3 @@ function showVersionInfo(showVersionInfoInput, version) {
|
||||
}
|
||||
});
|
||||
}
|
||||
exports.showVersionInfo = showVersionInfo;
|
||||
|
||||
92
lib/setup-julia.js
generated
92
lib/setup-julia.js
generated
@@ -1,33 +1,52 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||
result["default"] = mod;
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const core = __importStar(require("@actions/core"));
|
||||
const tc = __importStar(require("@actions/tool-cache"));
|
||||
const fs = __importStar(require("fs"));
|
||||
const https = __importStar(require("https"));
|
||||
const os = __importStar(require("os"));
|
||||
const path = __importStar(require("path"));
|
||||
const installer = __importStar(require("./installer"));
|
||||
// Note: before we index into this dict, we always first do `.toLowerCase()` on
|
||||
// the key.
|
||||
//
|
||||
// Therefore, this dict does not need to account for differences in case.
|
||||
const archSynonyms = {
|
||||
'x86': 'x86',
|
||||
'X86': 'x86',
|
||||
'x64': 'x64',
|
||||
'X64': 'x64',
|
||||
'aarch64': 'aarch64',
|
||||
'ARM64': 'aarch64',
|
||||
'arm64': 'aarch64'
|
||||
};
|
||||
function run() {
|
||||
@@ -48,22 +67,39 @@ function run() {
|
||||
core.debug(`ERROR: Could not retrieve runner IP: ${err}`);
|
||||
});
|
||||
}
|
||||
// Inputs
|
||||
const versionInput = core.getInput('version');
|
||||
const includePrereleases = core.getInput('include-all-prereleases') == 'true';
|
||||
const originalArchInput = core.getInput('arch');
|
||||
// Inputs.
|
||||
// Note that we intentionally strip leading and lagging whitespace by using `.trim()`
|
||||
const versionInput = core.getInput('version').trim();
|
||||
const includePrereleases = core.getInput('include-all-prereleases').trim() == 'true';
|
||||
const originalArchInput = core.getInput('arch').trim();
|
||||
// It can easily happen that, for example, a workflow file contains an input `version: ${{ matrix.julia-version }}`
|
||||
// while the strategy matrix only contains a key `${{ matrix.version }}`.
|
||||
// In that case, we want the action to fail, rather than trying to download julia from an URL that's missing parts and 404ing.
|
||||
// We _could_ fall back to the default but that means that builds silently do things differently than they're meant to, which
|
||||
// is worse than failing the build.
|
||||
if (!versionInput) {
|
||||
if (!versionInput) { // if `versionInput` is an empty string
|
||||
throw new Error('Version input must not be null');
|
||||
}
|
||||
if (!originalArchInput) {
|
||||
if (versionInput == '1.6') {
|
||||
core.notice('[setup-julia] If you are testing 1.6 as a Long Term Support (lts) version, consider using the new "lts" version specifier instead of "1.6" explicitly, which will automatically resolve the current lts.');
|
||||
}
|
||||
if (!originalArchInput) { // if `originalArchInput` is an empty string
|
||||
throw new Error(`Arch input must not be null`);
|
||||
}
|
||||
const arch = archSynonyms[originalArchInput];
|
||||
let processedArchInput;
|
||||
if (originalArchInput == "default") {
|
||||
// If the user sets the `arch` input to `default`, then we use the
|
||||
// architecture of the machine that we are running on.
|
||||
processedArchInput = os.arch();
|
||||
core.debug(`The "arch" input is "default", so we will use the machine arch: ${processedArchInput}`);
|
||||
}
|
||||
else {
|
||||
processedArchInput = originalArchInput;
|
||||
}
|
||||
// Note: we convert the key `processedArchInput` to lower case
|
||||
// before we index into the `archSynonyms` dict.
|
||||
const arch = archSynonyms[processedArchInput.toLowerCase()];
|
||||
core.debug(`Mapped the "arch" from ${processedArchInput} to ${arch}`);
|
||||
const versionInfo = yield installer.getJuliaVersionInfo();
|
||||
const availableReleases = yield installer.getJuliaVersions(versionInfo);
|
||||
const version = installer.getJuliaVersion(availableReleases, versionInput, includePrereleases);
|
||||
@@ -74,12 +110,18 @@ function run() {
|
||||
juliaPath = tc.find('julia', version, arch);
|
||||
if (!juliaPath) {
|
||||
core.debug(`could not find Julia ${arch}/${version} in cache`);
|
||||
const juliaInstallationPath = yield installer.installJulia(versionInfo, version, arch);
|
||||
// Add it to cache
|
||||
juliaPath = yield tc.cacheDir(juliaInstallationPath, 'julia', version, arch);
|
||||
// https://github.com/julia-actions/setup-julia/pull/196
|
||||
// we want julia to be installed with unmodified file mtimes
|
||||
// but `tc.cacheDir` uses `cp` internally which destroys mtime
|
||||
// and `tc` provides no API to get the tool directory alone
|
||||
// so hack it by installing a empty directory then use the path it returns
|
||||
// and extract the archives directly to that location
|
||||
const emptyDir = fs.mkdtempSync('empty');
|
||||
juliaPath = yield tc.cacheDir(emptyDir, 'julia', version, arch);
|
||||
yield installer.installJulia(juliaPath, versionInfo, version, arch);
|
||||
core.debug(`added Julia to cache: ${juliaPath}`);
|
||||
// Remove temporary dir
|
||||
fs.rmdirSync(juliaInstallationPath, { recursive: true });
|
||||
// Remove empty dir
|
||||
fs.rmdirSync(emptyDir);
|
||||
}
|
||||
else {
|
||||
core.debug(`using cached version of Julia: ${juliaPath}`);
|
||||
|
||||
18241
package-lock.json
generated
18241
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
37
package.json
37
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "setup-julia",
|
||||
"version": "1.9.1",
|
||||
"version": "2.3.0",
|
||||
"private": true,
|
||||
"description": "setup Julia action",
|
||||
"main": "lib/setup-julia.js",
|
||||
@@ -21,24 +21,25 @@
|
||||
"author": "Sascha Mann <git@mail.saschamann.eu>",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.10.0",
|
||||
"@actions/exec": "^1.0.0",
|
||||
"@actions/io": "^1.0.0",
|
||||
"@actions/tool-cache": "^1.0.0",
|
||||
"async-retry": "^1.3.1",
|
||||
"semver": "^6.3.0"
|
||||
"@actions/core": "^1.10.1",
|
||||
"@actions/exec": "^1.1.1",
|
||||
"@actions/io": "^1.1.3",
|
||||
"@actions/tool-cache": "^2.0.1",
|
||||
"async-retry": "^1.3.3",
|
||||
"semver": "^7.6.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/async-retry": "^1.4.2",
|
||||
"@types/jest": "^24.0.13",
|
||||
"@types/node": "^12.12.7",
|
||||
"@types/semver": "^6.0.0",
|
||||
"@zeit/ncc": "^0.22.0",
|
||||
"jest": "^24.8.0",
|
||||
"jest-circus": "^24.7.1",
|
||||
"nock": "^11.7.2",
|
||||
"prettier": "^1.17.1",
|
||||
"ts-jest": "^26.0.0",
|
||||
"typescript": "^3.5.1"
|
||||
"@types/async-retry": "^1.4.8",
|
||||
"@types/jest": "^29.5.12",
|
||||
"@types/node": "^20.14.11",
|
||||
"@types/retry": "^0.12.5",
|
||||
"@types/semver": "^7.5.8",
|
||||
"@vercel/ncc": "^0.38.1",
|
||||
"jest": "^29.7.0",
|
||||
"jest-circus": "^29.7.0",
|
||||
"nock": "^13.5.4",
|
||||
"prettier": "^3.3.3",
|
||||
"ts-jest": "^29.2.3",
|
||||
"typescript": "^5.5.3"
|
||||
}
|
||||
}
|
||||
|
||||
117
src/installer.ts
117
src/installer.ts
@@ -10,6 +10,9 @@ import retry = require('async-retry')
|
||||
|
||||
import * as semver from 'semver'
|
||||
|
||||
const LTS_VERSION = '1.6'
|
||||
const MAJOR_VERSION = '1' // Could be deduced from versions.json
|
||||
|
||||
// Translations between actions input and Julia arch names
|
||||
const osMap = {
|
||||
'win32': 'winnt',
|
||||
@@ -54,8 +57,9 @@ export async function getJuliaVersionInfo(): Promise<object> {
|
||||
const versionsFile = await retry(async (bail: Function) => {
|
||||
return await tc.downloadTool('https://julialang-s3.julialang.org/bin/versions.json')
|
||||
}, {
|
||||
retries: 5,
|
||||
onRetry: (err: Error) => {
|
||||
core.debug(`Download of versions.json failed, trying again. Error: ${err}`)
|
||||
core.info(`Download of versions.json failed, trying again. Error: ${err}`)
|
||||
}
|
||||
})
|
||||
|
||||
@@ -81,6 +85,14 @@ export function getJuliaVersion(availableReleases: string[], versionInput: strin
|
||||
return versionInput
|
||||
}
|
||||
|
||||
if (versionInput == 'lts') {
|
||||
return getJuliaVersion(availableReleases, LTS_VERSION, false)
|
||||
}
|
||||
|
||||
if (versionInput == 'pre') {
|
||||
return getJuliaVersion(availableReleases, MAJOR_VERSION, true)
|
||||
}
|
||||
|
||||
// Use the highest available version that matches versionInput
|
||||
let version = semver.maxSatisfying(availableReleases, versionInput, {includePrerelease})
|
||||
if (version == null) {
|
||||
@@ -99,9 +111,9 @@ function getDesiredFileExts(): [string, boolean, string] {
|
||||
let fileExt2: string
|
||||
|
||||
if (osPlat == 'win32') {
|
||||
fileExt1 = 'exe'
|
||||
hasFileExt2 = false
|
||||
fileExt2 = ''
|
||||
fileExt1 = 'tar.gz'
|
||||
hasFileExt2 = true
|
||||
fileExt2 = 'exe'
|
||||
} else if (osPlat == 'darwin') {
|
||||
fileExt1 = 'tar.gz'
|
||||
hasFileExt2 = true
|
||||
@@ -123,14 +135,35 @@ function getNightlyFileName(arch: string): string {
|
||||
[fileExt1, , ] = getDesiredFileExts()
|
||||
|
||||
if (osPlat == 'win32') {
|
||||
versionExt = arch == 'x64' ? '-win64' : '-win32'
|
||||
if (arch == 'x86') {
|
||||
versionExt = '-win32'
|
||||
} else if (arch == 'aarch64') {
|
||||
throw new Error('Aarch64 Julia is not available on Windows')
|
||||
} else if (arch == 'x64') {
|
||||
versionExt = '-win64'
|
||||
} else {
|
||||
throw new Error(`Architecture ${arch} is not supported on Windows`)
|
||||
}
|
||||
} else if (osPlat == 'darwin') {
|
||||
if (arch == 'x86') {
|
||||
throw new Error('32-bit Julia is not available on macOS')
|
||||
throw new Error('32-bit (x86) Julia is not available on macOS')
|
||||
} else if (arch == 'aarch64') {
|
||||
versionExt = '-macaarch64'
|
||||
} else if (arch == 'x64') {
|
||||
versionExt = '-mac64'
|
||||
} else {
|
||||
throw new Error(`Architecture ${arch} is not supported on macOS`)
|
||||
}
|
||||
versionExt = '-mac64'
|
||||
} else if (osPlat === 'linux') {
|
||||
versionExt = arch == 'x64' ? '-linux64' : '-linux32'
|
||||
if (arch == 'x86') {
|
||||
versionExt = '-linux32'
|
||||
} else if (arch == 'aarch64') {
|
||||
versionExt = '-linux-aarch64'
|
||||
} else if (arch == 'x64') {
|
||||
versionExt = '-linux64'
|
||||
} else {
|
||||
throw new Error(`Architecture ${arch} is not supported on Linux`)
|
||||
}
|
||||
} else {
|
||||
throw new Error(`Platform ${osPlat} is not supported`)
|
||||
}
|
||||
@@ -151,6 +184,7 @@ export function getFileInfo(versionInfo, version: string, arch: string) {
|
||||
}
|
||||
|
||||
if (!versionInfo[version]) {
|
||||
core.error(`Encountered error: ${err}`)
|
||||
throw err
|
||||
}
|
||||
|
||||
@@ -171,8 +205,39 @@ export function getFileInfo(versionInfo, version: string, arch: string) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The following block is just to provide improved log messages in the CI logs.
|
||||
// We specifically want to improve the case where someone is trying to install
|
||||
// Julia 1.6 or 1.7 on Apple Silicon (aarch64) macOS.
|
||||
{
|
||||
const one_fileext_is_targz = (fileExt1 == "tar.gz") || (fileExt2 == "tar.gz");
|
||||
const one_fileext_is_dmg = (fileExt1 == "dmg") || (fileExt2 == "dmg");
|
||||
const one_fileext_is_targz_and_other_is_dmg = one_fileext_is_targz && one_fileext_is_dmg;
|
||||
|
||||
// We say that "this Julia version does NOT have native binaries for Apple Silicon"
|
||||
// if and only if "this Julia version is < 1.8.0"
|
||||
const this_julia_version_does_NOT_have_native_binaries_for_apple_silicon = semver.lt(
|
||||
version,
|
||||
'1.8.0',
|
||||
);
|
||||
const this_is_macos = osPlat == 'darwin';
|
||||
if (this_is_macos && one_fileext_is_targz_and_other_is_dmg && this_julia_version_does_NOT_have_native_binaries_for_apple_silicon) {
|
||||
const msg = `It looks like you are trying to install Julia 1.6 or 1.7 on ` +
|
||||
`the "macos-latest" runners.\n` +
|
||||
`"macos-latest" now resolves to "macos-14", which run on Apple ` +
|
||||
`Silicon (aarch64) macOS machines.\n` +
|
||||
`Unfortunately, Julia 1.6 and 1.7 do not have native binaries ` +
|
||||
`available for Apple Silicon macOS.\n` +
|
||||
`Therefore, it is not possible to install Julia with the current ` +
|
||||
`constraints.\n` +
|
||||
`For instructions on how to fix this error, please see the following Discourse post: ` +
|
||||
`https://discourse.julialang.org/t/how-to-fix-github-actions-ci-failures-with-julia-1-6-or-1-7-on-macos-latest-and-macos-14/117019`
|
||||
core.error(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
core.error(`Encountered error: ${err}`)
|
||||
throw err
|
||||
}
|
||||
|
||||
@@ -197,7 +262,7 @@ export function getDownloadURL(fileInfo, version: string, arch: string): string
|
||||
return fileInfo.url
|
||||
}
|
||||
|
||||
export async function installJulia(versionInfo, version: string, arch: string): Promise<string> {
|
||||
export async function installJulia(dest: string, versionInfo, version: string, arch: string): Promise<string> {
|
||||
// Download Julia
|
||||
const fileInfo = getFileInfo(versionInfo, version, arch)
|
||||
const downloadURL = getDownloadURL(fileInfo, version, arch)
|
||||
@@ -208,8 +273,9 @@ export async function installJulia(versionInfo, version: string, arch: string):
|
||||
const juliaDownloadPath = await retry(async (bail: Function) => {
|
||||
return await tc.downloadTool(downloadURL)
|
||||
}, {
|
||||
retries: 5,
|
||||
onRetry: (err: Error) => {
|
||||
core.debug(`Download of ${downloadURL} failed, trying again. Error: ${err}`)
|
||||
core.info(`Download of ${downloadURL} failed, trying again. Error: ${err}`)
|
||||
}
|
||||
})
|
||||
|
||||
@@ -224,32 +290,37 @@ export async function installJulia(versionInfo, version: string, arch: string):
|
||||
core.debug('Skipping checksum check for nightly binaries.')
|
||||
}
|
||||
|
||||
const tempInstallDir = fs.mkdtempSync(`julia-${arch}-${version}-`)
|
||||
|
||||
// Install it
|
||||
switch (osPlat) {
|
||||
case 'linux':
|
||||
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
||||
await exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', tempInstallDir])
|
||||
return tempInstallDir
|
||||
await exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', dest])
|
||||
return dest
|
||||
case 'win32':
|
||||
if (version.endsWith('nightly') || semver.gtr(version, '1.3', {includePrerelease: true})) {
|
||||
// The installer changed in 1.4: https://github.com/JuliaLang/julia/blob/ef0c9108b12f3ae177c51037934351ffa703b0b5/NEWS.md#build-system-changes
|
||||
await exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/SILENT /dir=${path.join(process.cwd(), tempInstallDir)}" -NoNewWindow -Wait`])
|
||||
if (fileInfo !== null && fileInfo.extension == 'exe') {
|
||||
if (version.endsWith('nightly') || semver.gtr(version, '1.3', {includePrerelease: true})) {
|
||||
// The installer changed in 1.4: https://github.com/JuliaLang/julia/blob/ef0c9108b12f3ae177c51037934351ffa703b0b5/NEWS.md#build-system-changes
|
||||
await exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/SILENT /dir=${path.join(process.cwd(), dest)}" -NoNewWindow -Wait`])
|
||||
} else {
|
||||
await exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/S /D=${path.join(process.cwd(), dest)}" -NoNewWindow -Wait`])
|
||||
}
|
||||
} else {
|
||||
await exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/S /D=${path.join(process.cwd(), tempInstallDir)}" -NoNewWindow -Wait`])
|
||||
// This is the more common path. Using .tar.gz is much faster
|
||||
// don't use the Git bash provided tar. Issue #205
|
||||
// https://github.com/julia-actions/setup-julia/issues/205
|
||||
await exec.exec('powershell', ['-Command', `& "$env:WINDIR/System32/tar" xf ${juliaDownloadPath} --strip-components=1 -C ${dest}`])
|
||||
}
|
||||
return tempInstallDir
|
||||
return dest
|
||||
case 'darwin':
|
||||
if (fileInfo !== null && fileInfo.extension == 'dmg') {
|
||||
core.debug(`Support for .dmg files is deprecated and may be removed in a future release`)
|
||||
await exec.exec('hdiutil', ['attach', juliaDownloadPath])
|
||||
await exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${tempInstallDir}`])
|
||||
return path.join(tempInstallDir, 'julia')
|
||||
await exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${dest}`])
|
||||
return path.join(dest, 'julia')
|
||||
} else {
|
||||
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
||||
await exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', tempInstallDir])
|
||||
return tempInstallDir
|
||||
await exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', dest])
|
||||
return dest
|
||||
}
|
||||
default:
|
||||
throw new Error(`Platform ${osPlat} is not supported`)
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
import * as core from '@actions/core'
|
||||
import * as exec from '@actions/exec'
|
||||
import * as tc from '@actions/tool-cache'
|
||||
|
||||
import * as fs from 'fs'
|
||||
import * as https from 'https'
|
||||
import * as os from 'os'
|
||||
import * as path from 'path'
|
||||
|
||||
import * as installer from './installer'
|
||||
|
||||
// Note: before we index into this dict, we always first do `.toLowerCase()` on
|
||||
// the key.
|
||||
//
|
||||
// Therefore, this dict does not need to account for differences in case.
|
||||
const archSynonyms = {
|
||||
'x86': 'x86',
|
||||
'X86': 'x86',
|
||||
'x64': 'x64',
|
||||
'X64': 'x64',
|
||||
'aarch64': 'aarch64',
|
||||
'ARM64': 'aarch64',
|
||||
'arm64': 'aarch64'
|
||||
}
|
||||
|
||||
@@ -38,24 +39,40 @@ async function run() {
|
||||
})
|
||||
}
|
||||
|
||||
// Inputs
|
||||
const versionInput = core.getInput('version')
|
||||
const includePrereleases = core.getInput('include-all-prereleases') == 'true'
|
||||
const originalArchInput = core.getInput('arch')
|
||||
// Inputs.
|
||||
// Note that we intentionally strip leading and lagging whitespace by using `.trim()`
|
||||
const versionInput = core.getInput('version').trim()
|
||||
const includePrereleases = core.getInput('include-all-prereleases').trim() == 'true'
|
||||
const originalArchInput = core.getInput('arch').trim()
|
||||
|
||||
// It can easily happen that, for example, a workflow file contains an input `version: ${{ matrix.julia-version }}`
|
||||
// while the strategy matrix only contains a key `${{ matrix.version }}`.
|
||||
// In that case, we want the action to fail, rather than trying to download julia from an URL that's missing parts and 404ing.
|
||||
// We _could_ fall back to the default but that means that builds silently do things differently than they're meant to, which
|
||||
// is worse than failing the build.
|
||||
if (!versionInput) {
|
||||
if (!versionInput) { // if `versionInput` is an empty string
|
||||
throw new Error('Version input must not be null')
|
||||
}
|
||||
if (!originalArchInput) {
|
||||
if (versionInput == '1.6') {
|
||||
core.notice('[setup-julia] If you are testing 1.6 as a Long Term Support (lts) version, consider using the new "lts" version specifier instead of "1.6" explicitly, which will automatically resolve the current lts.')
|
||||
}
|
||||
if (!originalArchInput) { // if `originalArchInput` is an empty string
|
||||
throw new Error(`Arch input must not be null`)
|
||||
}
|
||||
|
||||
const arch = archSynonyms[originalArchInput]
|
||||
let processedArchInput: string;
|
||||
if (originalArchInput == "default") {
|
||||
// If the user sets the `arch` input to `default`, then we use the
|
||||
// architecture of the machine that we are running on.
|
||||
processedArchInput = os.arch();
|
||||
core.debug(`The "arch" input is "default", so we will use the machine arch: ${processedArchInput}`)
|
||||
} else {
|
||||
processedArchInput = originalArchInput;
|
||||
}
|
||||
// Note: we convert the key `processedArchInput` to lower case
|
||||
// before we index into the `archSynonyms` dict.
|
||||
const arch = archSynonyms[processedArchInput.toLowerCase()]
|
||||
core.debug(`Mapped the "arch" from ${processedArchInput} to ${arch}`)
|
||||
|
||||
const versionInfo = await installer.getJuliaVersionInfo()
|
||||
const availableReleases = await installer.getJuliaVersions(versionInfo)
|
||||
@@ -69,14 +86,21 @@ async function run() {
|
||||
|
||||
if (!juliaPath) {
|
||||
core.debug(`could not find Julia ${arch}/${version} in cache`)
|
||||
const juliaInstallationPath = await installer.installJulia(versionInfo, version, arch)
|
||||
|
||||
// Add it to cache
|
||||
juliaPath = await tc.cacheDir(juliaInstallationPath, 'julia', version, arch)
|
||||
// https://github.com/julia-actions/setup-julia/pull/196
|
||||
// we want julia to be installed with unmodified file mtimes
|
||||
// but `tc.cacheDir` uses `cp` internally which destroys mtime
|
||||
// and `tc` provides no API to get the tool directory alone
|
||||
// so hack it by installing a empty directory then use the path it returns
|
||||
// and extract the archives directly to that location
|
||||
const emptyDir = fs.mkdtempSync('empty')
|
||||
juliaPath = await tc.cacheDir(emptyDir, 'julia', version, arch)
|
||||
await installer.installJulia(juliaPath, versionInfo, version, arch)
|
||||
|
||||
core.debug(`added Julia to cache: ${juliaPath}`)
|
||||
|
||||
// Remove temporary dir
|
||||
fs.rmdirSync(juliaInstallationPath, {recursive: true})
|
||||
// Remove empty dir
|
||||
fs.rmdirSync(emptyDir)
|
||||
} else {
|
||||
core.debug(`using cached version of Julia: ${juliaPath}`)
|
||||
}
|
||||
@@ -91,7 +115,7 @@ async function run() {
|
||||
const showVersionInfoInput = core.getInput('show-versioninfo')
|
||||
await installer.showVersionInfo(showVersionInfoInput, version)
|
||||
} catch (error) {
|
||||
core.setFailed(error.message)
|
||||
core.setFailed((error as Error).message)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user