mirror of
https://github.com/julia-actions/setup-julia.git
synced 2026-02-16 04:56:53 +08:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27ff99664b |
7
.github/dependabot.yml
vendored
7
.github/dependabot.yml
vendored
@@ -1,7 +0,0 @@
|
|||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: gitsubmodule
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: daily
|
|
||||||
open-pull-requests-limit: 10
|
|
||||||
1
.github/workflows/backup.yml
vendored
1
.github/workflows/backup.yml
vendored
@@ -9,7 +9,6 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
backup:
|
backup:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
timeout-minutes: 60
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Configure cache
|
- name: Configure cache
|
||||||
|
|||||||
7
.github/workflows/checkin.yml
vendored
7
.github/workflows/checkin.yml
vendored
@@ -1,16 +1,9 @@
|
|||||||
name: "PR Checks"
|
name: "PR Checks"
|
||||||
on: [pull_request, push]
|
on: [pull_request, push]
|
||||||
|
|
||||||
concurrency:
|
|
||||||
# Skip intermediate builds: all builds except for builds on the `master`, `main`, or `release-*` branches
|
|
||||||
# Cancel intermediate builds: only pull request builds
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref != 'refs/heads/master' || github.ref != 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release-') || github.run_number }}
|
|
||||||
cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check_pr:
|
check_pr:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 60
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v1
|
||||||
|
|
||||||
|
|||||||
7
.github/workflows/codeql-analysis.yml
vendored
7
.github/workflows/codeql-analysis.yml
vendored
@@ -11,12 +11,6 @@
|
|||||||
#
|
#
|
||||||
name: "CodeQL"
|
name: "CodeQL"
|
||||||
|
|
||||||
concurrency:
|
|
||||||
# Skip intermediate builds: all builds except for builds on the `master`, `main`, or `release-*` branches
|
|
||||||
# Cancel intermediate builds: only pull request builds
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref != 'refs/heads/master' || github.ref != 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release-') || github.run_number }}
|
|
||||||
cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}
|
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ master, releases/* ]
|
branches: [ master, releases/* ]
|
||||||
@@ -30,7 +24,6 @@ jobs:
|
|||||||
analyze:
|
analyze:
|
||||||
name: Analyze
|
name: Analyze
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 60
|
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
|
|||||||
40
.github/workflows/example-builds-defaultarch.yml
vendored
40
.github/workflows/example-builds-defaultarch.yml
vendored
@@ -1,40 +0,0 @@
|
|||||||
name: Example builds (default arch)
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
# Skip intermediate builds: all builds except for builds on the `master`, `main`, or `release-*` branches
|
|
||||||
# Cancel intermediate builds: only pull request builds
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref != 'refs/heads/master' || github.ref != 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release-') || github.run_number }}
|
|
||||||
cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: ['main', 'master', 'releases/*']
|
|
||||||
pull_request:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
timeout-minutes: 60
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
julia-version: ['1']
|
|
||||||
os: [ubuntu-latest, macOS-latest, windows-latest]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v1.0.0
|
|
||||||
|
|
||||||
- name: "Install dependencies"
|
|
||||||
run: |
|
|
||||||
npm install
|
|
||||||
npm run build
|
|
||||||
npm run pack
|
|
||||||
|
|
||||||
- name: "Set up Julia"
|
|
||||||
id: setup-julia
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
version: ${{ matrix.julia-version }}
|
|
||||||
- run: julia --version
|
|
||||||
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
name: Example builds (nightly, default arch)
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
# Skip intermediate builds: all builds except for builds on the `master`, `main`, or `release-*` branches
|
|
||||||
# Cancel intermediate builds: only pull request builds
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref != 'refs/heads/master' || github.ref != 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release-') || github.run_number }}
|
|
||||||
cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: ['main', 'master', 'releases/*']
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
timeout-minutes: 60
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
julia-version: [nightly, 1.8-nightly]
|
|
||||||
os: [ubuntu-latest, macOS-latest, windows-latest]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v1.0.0
|
|
||||||
|
|
||||||
- name: "Install dependencies"
|
|
||||||
run: |
|
|
||||||
npm install
|
|
||||||
npm run build
|
|
||||||
npm run pack
|
|
||||||
|
|
||||||
- name: "Set up Julia (${{ matrix.julia-version }})"
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
version: ${{ matrix.julia-version }}
|
|
||||||
- run: julia --version
|
|
||||||
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
|
||||||
15
.github/workflows/example-builds-nightly.yml
vendored
15
.github/workflows/example-builds-nightly.yml
vendored
@@ -1,11 +1,5 @@
|
|||||||
name: Example builds (nightly)
|
name: Example builds (nightly)
|
||||||
|
|
||||||
concurrency:
|
|
||||||
# Skip intermediate builds: all builds except for builds on the `master`, `main`, or `release-*` branches
|
|
||||||
# Cancel intermediate builds: only pull request builds
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref != 'refs/heads/master' || github.ref != 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release-') || github.run_number }}
|
|
||||||
cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}
|
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: ['main', 'master', 'releases/*']
|
branches: ['main', 'master', 'releases/*']
|
||||||
@@ -16,21 +10,20 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
timeout-minutes: 60
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
julia-version: [nightly, 1.8-nightly]
|
julia-version: [nightly, 1.6-nightly]
|
||||||
julia-arch: [x64, x86]
|
julia-arch: [x64, x86]
|
||||||
os: [ubuntu-latest, macOS-latest, windows-latest]
|
os: [ubuntu-latest, macOS-latest, windows-latest]
|
||||||
# 32-bit Julia binaries are not available on macOS
|
# 32-bit Julia binaries are not available on macOS
|
||||||
exclude:
|
exclude:
|
||||||
- os: macOS-latest
|
- os: macOS-latest
|
||||||
julia-arch: x86
|
julia-arch: x86
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1.0.0
|
- uses: actions/checkout@v1.0.0
|
||||||
|
|
||||||
- name: "Install dependencies"
|
- name: "Install dependencies"
|
||||||
run: |
|
run: |
|
||||||
npm install
|
npm install
|
||||||
@@ -42,5 +35,5 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
version: ${{ matrix.julia-version }}
|
version: ${{ matrix.julia-version }}
|
||||||
arch: ${{ matrix.julia-arch }}
|
arch: ${{ matrix.julia-arch }}
|
||||||
|
show-versioninfo: 'true'
|
||||||
- run: julia --version
|
- run: julia --version
|
||||||
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
|
||||||
|
|||||||
14
.github/workflows/example-builds.yml
vendored
14
.github/workflows/example-builds.yml
vendored
@@ -1,32 +1,24 @@
|
|||||||
name: Example builds
|
name: Example builds
|
||||||
|
|
||||||
concurrency:
|
|
||||||
# Skip intermediate builds: all builds except for builds on the `master`, `main`, or `release-*` branches
|
|
||||||
# Cancel intermediate builds: only pull request builds
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref != 'refs/heads/master' || github.ref != 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release-') || github.run_number }}
|
|
||||||
cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}
|
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: ['main', 'master', 'releases/*']
|
branches: ['main', 'master', 'releases/*']
|
||||||
pull_request:
|
pull_request:
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
timeout-minutes: 60
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
julia-version: ['1.0.5', '1.2', '^1.5.0-beta1', '1']
|
julia-version: ['1.0.5', '1', '^1.5.0-beta1']
|
||||||
julia-arch: [x64, x86]
|
julia-arch: [x64, x86]
|
||||||
os: [ubuntu-latest, macOS-latest, windows-latest]
|
os: [ubuntu-latest, macOS-latest, windows-latest]
|
||||||
# 32-bit Julia binaries are not available on macOS
|
# 32-bit Julia binaries are not available on macOS
|
||||||
exclude:
|
exclude:
|
||||||
- os: macOS-latest
|
- os: macOS-latest
|
||||||
julia-arch: x86
|
julia-arch: x86
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1.0.0
|
- uses: actions/checkout@v1.0.0
|
||||||
|
|
||||||
@@ -42,5 +34,5 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
version: ${{ matrix.julia-version }}
|
version: ${{ matrix.julia-version }}
|
||||||
arch: ${{ matrix.julia-arch }}
|
arch: ${{ matrix.julia-arch }}
|
||||||
|
show-versioninfo: 'true'
|
||||||
- run: julia --version
|
- run: julia --version
|
||||||
- run: julia --compile=min -O0 -e 'import InteractiveUtils; InteractiveUtils.versioninfo()'
|
|
||||||
|
|||||||
86
README.md
86
README.md
@@ -38,29 +38,13 @@ This action sets up a Julia environment for use in actions by downloading a spec
|
|||||||
|
|
||||||
# The architecture of the Julia binaries.
|
# The architecture of the Julia binaries.
|
||||||
#
|
#
|
||||||
# Please note that installing aarch64 binaries only makes sense on self-hosted aarch64 runners.
|
# Supported values: x64 | x86
|
||||||
# We currently don't run test builds on that architecture, so we cannot guarantee that the input won't break randomly,
|
|
||||||
# although there is no reason why it would.
|
|
||||||
#
|
#
|
||||||
# Supported values: x64 | x86 | aarch64 (untested)
|
# Default: x64
|
||||||
#
|
|
||||||
# Note: you can use X64, X86, and ARM64 as synonyms for x64, x86, and aarch64, respectively.
|
|
||||||
#
|
|
||||||
# Defaults to the architecture of the runner executing the job.
|
|
||||||
arch: ''
|
arch: ''
|
||||||
|
|
||||||
# Set the display setting for printing InteractiveUtils.versioninfo() after installing.
|
# If true, display the output of InteractiveUtils.versioninfo() after installing.
|
||||||
#
|
# See "versioninfo" below for example usage.
|
||||||
# Starting Julia and running InteractiveUtils.versioninfo() takes a significant amount of time (1s or ~10% of the total build time in testing),
|
|
||||||
# so you may not want to run it in every build, in particular on paid runners, as this cost will add up quickly.
|
|
||||||
#
|
|
||||||
# See "versioninfo" below for example usage and further explanations.
|
|
||||||
#
|
|
||||||
# Supported values: true | false | never
|
|
||||||
#
|
|
||||||
# true: Always print versioninfo
|
|
||||||
# false: Only print versioninfo for nightly Julia
|
|
||||||
# never: Never print versioninfo
|
|
||||||
#
|
#
|
||||||
# Default: false
|
# Default: false
|
||||||
show-versioninfo: ''
|
show-versioninfo: ''
|
||||||
@@ -104,43 +88,16 @@ You can either specify specific Julia versions or version ranges. If you specify
|
|||||||
|
|
||||||
- `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.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.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 **caret** version range that includes pre-releases 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-rc1` is a **tilde** version range that includes pre-releases 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 **caret** version range that includes _all_ pre-releases. 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`.
|
- `~1.3.0-0` is a **tilde** version range that includes _all_ pre-releases. It matches all versions `≥ 1.3.0-` and `< 1.4.0`.
|
||||||
- `nightly` will install the latest nightly build.
|
- `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.6-nightly` will install the latest nightly build for the upcoming 1.6 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).
|
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).
|
||||||
|
|
||||||
#### Prereleases
|
The available Julia versions are pulled from [`versions.json`](https://julialang-s3.julialang.org/bin/versions.json). This file is automatically updated once a day. Therefore it may take up to 24 hours until a newly released Julia version is available in the action.
|
||||||
|
|
||||||
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`.
|
|
||||||
2. Setting the input `include-all-prereleases` to `true`.
|
|
||||||
|
|
||||||
These behave slightly differently.
|
|
||||||
|
|
||||||
1. If the version `a.b.c` contains pre-release tag, all pre-releases of version `a.b.c` will be included in the version matching.
|
|
||||||
For example, `^1.3.0-rc1` would match `1.3.0-rc2` but would **not** match `1.4.0-rc1` once released.
|
|
||||||
2. If `include-preleases` is set to true, **all** pre-releases of all versions will be included in the version matching. In this case, `^1.3.0-rc1` would match `1.4.0-rc1` once released.
|
|
||||||
|
|
||||||
**Example:** Without `include-all-prereleases: true`, the version `^1.3.0-rc1` would match `1.3.0-rc1`, `1.3.0-rc2`, `1.3.0`, `1.4.0` once they are released.
|
|
||||||
With `include-all-prereleases: true`, it would match `1.3.0-rc1`, `1.3.0-rc2`, `1.3.0`, `1.4.0-rc1`, `1.4.0`.
|
|
||||||
|
|
||||||
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
|
|
||||||
with:
|
|
||||||
version: '1'
|
|
||||||
include-all-prereleases: true
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Recently released versions
|
|
||||||
|
|
||||||
The available Julia versions are pulled from [`versions.json`](https://julialang-s3.julialang.org/bin/versions.json).
|
|
||||||
|
|
||||||
### Matrix Testing
|
### Matrix Testing
|
||||||
|
|
||||||
@@ -156,7 +113,7 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
julia-version: ['1.0', '1.2.0', '^1.3.0-rc1']
|
julia-version: ['1.0', '1.2.0', '^1.3.0-rc1']
|
||||||
os: [ubuntu-latest, windows-latest, macOS-latest]
|
os: [ubuntu-latest, windows-latest, macOS-latest]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1.0.0
|
- uses: actions/checkout@v1.0.0
|
||||||
- name: "Set up Julia"
|
- name: "Set up Julia"
|
||||||
@@ -182,7 +139,7 @@ jobs:
|
|||||||
exclude:
|
exclude:
|
||||||
- os: macOS-latest
|
- os: macOS-latest
|
||||||
julia-arch: x86
|
julia-arch: x86
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1.0.0
|
- uses: actions/checkout@v1.0.0
|
||||||
- name: "Set up Julia"
|
- name: "Set up Julia"
|
||||||
@@ -209,7 +166,7 @@ jobs:
|
|||||||
- os: windows-latest
|
- os: windows-latest
|
||||||
julia-version: ['1.0.4']
|
julia-version: ['1.0.4']
|
||||||
julia-arch: x86
|
julia-arch: x86
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1.0.0
|
- uses: actions/checkout@v1.0.0
|
||||||
- name: "Set up Julia"
|
- name: "Set up Julia"
|
||||||
@@ -222,13 +179,18 @@ jobs:
|
|||||||
|
|
||||||
### versioninfo
|
### versioninfo
|
||||||
|
|
||||||
By default, only the output of `julia --version` is printed as verification that Julia has been installed for stable versions of Julia.
|
By default, only a brief version identifier is printed in the run log. You can display the full `versioninfo` by adding `show-versioninfo`.
|
||||||
`InteractiveUtils.versioninfo()` is run by default for nightly builds.
|
Here's an example that prints this information just for `nightly`:
|
||||||
|
|
||||||
Starting Julia and printing the full versioninfo takes a significant amount of time (1s or ~10% of the total build time in testing), so you may not want to run it in every build, in particular on paid runners as this cost will add up quickly.
|
```yaml
|
||||||
However, `julia --version` does not provide sufficient information to know which commit a nightly binary was built from, therefore it is useful to show the full versioninfo on nightly builds regardless.
|
- uses: julia-actions/setup-julia@v1
|
||||||
|
with:
|
||||||
You can override this behaviour by changing the input to `never` if you never want to run `InteractiveUtils.versioninfo()` or to `true` if you always want to run `InteractiveUtils.versioninfo()`, even on stable Julia builds.
|
version: ${{ matrix.version }}
|
||||||
|
arch: ${{ matrix.arch }}
|
||||||
|
show-versioninfo: ${{ matrix.version == 'nightly' }}
|
||||||
|
```
|
||||||
|
|
||||||
|
You use `'true'` if you want it printed for all Julia versions.
|
||||||
|
|
||||||
## Versioning
|
## Versioning
|
||||||
|
|
||||||
|
|||||||
@@ -66,14 +66,6 @@ describe('version matching tests', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
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')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('node-semver behaviour', () => {
|
describe('node-semver behaviour', () => {
|
||||||
describe('Windows installer change', () => {
|
describe('Windows installer change', () => {
|
||||||
it('Correctly understands >1.4.0', () => {
|
it('Correctly understands >1.4.0', () => {
|
||||||
|
|||||||
10
action.yml
10
action.yml
@@ -5,14 +5,10 @@ inputs:
|
|||||||
version:
|
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. Example: 1.0.4'
|
||||||
default: '1'
|
default: '1'
|
||||||
include-all-prereleases:
|
|
||||||
description: 'Include prereleases when matching the Julia version to available versions.'
|
|
||||||
required: false
|
|
||||||
default: 'false'
|
|
||||||
arch:
|
arch:
|
||||||
description: 'Architecture of the Julia binaries. Defaults to the architecture of the runner executing the job.'
|
description: 'Architecture of the Julia binaries. Defaults to x64.'
|
||||||
required: false
|
required: false
|
||||||
default: '${{ runner.arch }}'
|
default: 'x64'
|
||||||
show-versioninfo:
|
show-versioninfo:
|
||||||
description: 'Display InteractiveUtils.versioninfo() after installing'
|
description: 'Display InteractiveUtils.versioninfo() after installing'
|
||||||
required: false
|
required: false
|
||||||
@@ -23,7 +19,7 @@ outputs:
|
|||||||
julia-bindir:
|
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'
|
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:
|
runs:
|
||||||
using: 'node16'
|
using: 'node12'
|
||||||
main: 'dist/index.js'
|
main: 'dist/index.js'
|
||||||
branding:
|
branding:
|
||||||
icon: 'download'
|
icon: 'download'
|
||||||
|
|||||||
8603
dist/index.js
vendored
8603
dist/index.js
vendored
File diff suppressed because it is too large
Load Diff
BIN
dist/unzip
vendored
Normal file
BIN
dist/unzip
vendored
Normal file
Binary file not shown.
174
lib/installer.js
generated
174
lib/installer.js
generated
@@ -1,38 +1,20 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
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 (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) {
|
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) {
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
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 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); }
|
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());
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
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;
|
||||||
|
return result;
|
||||||
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.showVersionInfo = exports.installJulia = exports.getDownloadURL = exports.getFileInfo = exports.getJuliaVersion = exports.getJuliaVersions = exports.getJuliaVersionInfo = void 0;
|
|
||||||
const core = __importStar(require("@actions/core"));
|
const core = __importStar(require("@actions/core"));
|
||||||
const exec = __importStar(require("@actions/exec"));
|
const exec = __importStar(require("@actions/exec"));
|
||||||
const tc = __importStar(require("@actions/tool-cache"));
|
const tc = __importStar(require("@actions/tool-cache"));
|
||||||
@@ -40,7 +22,6 @@ const crypto = __importStar(require("crypto"));
|
|||||||
const fs = __importStar(require("fs"));
|
const fs = __importStar(require("fs"));
|
||||||
const os = __importStar(require("os"));
|
const os = __importStar(require("os"));
|
||||||
const path = __importStar(require("path"));
|
const path = __importStar(require("path"));
|
||||||
const retry = require("async-retry");
|
|
||||||
const semver = __importStar(require("semver"));
|
const semver = __importStar(require("semver"));
|
||||||
// Translations between actions input and Julia arch names
|
// Translations between actions input and Julia arch names
|
||||||
const osMap = {
|
const osMap = {
|
||||||
@@ -50,8 +31,7 @@ const osMap = {
|
|||||||
};
|
};
|
||||||
const archMap = {
|
const archMap = {
|
||||||
'x86': 'i686',
|
'x86': 'i686',
|
||||||
'x64': 'x86_64',
|
'x64': 'x86_64'
|
||||||
'aarch64': 'aarch64'
|
|
||||||
};
|
};
|
||||||
// Store information about the environment
|
// Store information about the environment
|
||||||
const osPlat = os.platform(); // possible values: win32 (Windows), linux (Linux), darwin (macOS)
|
const osPlat = os.platform(); // possible values: win32 (Windows), linux (Linux), darwin (macOS)
|
||||||
@@ -79,15 +59,7 @@ function calculateChecksum(file) {
|
|||||||
*/
|
*/
|
||||||
function getJuliaVersionInfo() {
|
function getJuliaVersionInfo() {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
// Occasionally the connection is reset for unknown reasons
|
const versionsFile = yield tc.downloadTool('https://julialang-s3.julialang.org/bin/versions.json');
|
||||||
// In those cases, retry the download
|
|
||||||
const versionsFile = yield retry((bail) => __awaiter(this, void 0, void 0, function* () {
|
|
||||||
return yield tc.downloadTool('https://julialang-s3.julialang.org/bin/versions.json');
|
|
||||||
}), {
|
|
||||||
onRetry: (err) => {
|
|
||||||
core.debug(`Download of versions.json failed, trying again. Error: ${err}`);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return JSON.parse(fs.readFileSync(versionsFile).toString());
|
return JSON.parse(fs.readFileSync(versionsFile).toString());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -105,13 +77,13 @@ function getJuliaVersions(versionInfo) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.getJuliaVersions = getJuliaVersions;
|
exports.getJuliaVersions = getJuliaVersions;
|
||||||
function getJuliaVersion(availableReleases, versionInput, includePrerelease = false) {
|
function getJuliaVersion(availableReleases, versionInput) {
|
||||||
if (semver.valid(versionInput) == versionInput || versionInput.endsWith('nightly')) {
|
if (semver.valid(versionInput) == versionInput || versionInput.endsWith('nightly')) {
|
||||||
// versionInput is a valid version or a nightly version, use it directly
|
// versionInput is a valid version or a nightly version, use it directly
|
||||||
return versionInput;
|
return versionInput;
|
||||||
}
|
}
|
||||||
// Use the highest available version that matches versionInput
|
// Use the highest available version that matches versionInput
|
||||||
let version = semver.maxSatisfying(availableReleases, versionInput, { includePrerelease });
|
let version = semver.maxSatisfying(availableReleases, versionInput);
|
||||||
if (version == null) {
|
if (version == null) {
|
||||||
throw new Error(`Could not find a Julia version that matches ${versionInput}`);
|
throw new Error(`Could not find a Julia version that matches ${versionInput}`);
|
||||||
}
|
}
|
||||||
@@ -120,81 +92,38 @@ function getJuliaVersion(availableReleases, versionInput, includePrerelease = fa
|
|||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
exports.getJuliaVersion = getJuliaVersion;
|
exports.getJuliaVersion = getJuliaVersion;
|
||||||
function getDesiredFileExts() {
|
|
||||||
let fileExt1;
|
|
||||||
let hasFileExt2;
|
|
||||||
let fileExt2;
|
|
||||||
if (osPlat == 'win32') {
|
|
||||||
fileExt1 = 'exe';
|
|
||||||
hasFileExt2 = false;
|
|
||||||
fileExt2 = '';
|
|
||||||
}
|
|
||||||
else if (osPlat == 'darwin') {
|
|
||||||
fileExt1 = 'tar.gz';
|
|
||||||
hasFileExt2 = true;
|
|
||||||
fileExt2 = 'dmg';
|
|
||||||
}
|
|
||||||
else if (osPlat === 'linux') {
|
|
||||||
fileExt1 = 'tar.gz';
|
|
||||||
hasFileExt2 = false;
|
|
||||||
fileExt2 = '';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new Error(`Platform ${osPlat} is not supported`);
|
|
||||||
}
|
|
||||||
return [fileExt1, hasFileExt2, fileExt2];
|
|
||||||
}
|
|
||||||
function getNightlyFileName(arch) {
|
function getNightlyFileName(arch) {
|
||||||
let versionExt;
|
let versionExt, ext;
|
||||||
let fileExt1;
|
|
||||||
[fileExt1, ,] = getDesiredFileExts();
|
|
||||||
if (osPlat == 'win32') {
|
if (osPlat == 'win32') {
|
||||||
versionExt = arch == 'x64' ? '-win64' : '-win32';
|
versionExt = arch == 'x64' ? '-win64' : '-win32';
|
||||||
|
ext = 'exe';
|
||||||
}
|
}
|
||||||
else if (osPlat == 'darwin') {
|
else if (osPlat == 'darwin') {
|
||||||
if (arch == 'x86') {
|
if (arch == 'x86') {
|
||||||
throw new Error('32-bit Julia is not available on macOS');
|
throw new Error('32-bit Julia is not available on macOS');
|
||||||
}
|
}
|
||||||
versionExt = '-mac64';
|
versionExt = '-mac64';
|
||||||
|
ext = 'dmg';
|
||||||
}
|
}
|
||||||
else if (osPlat === 'linux') {
|
else if (osPlat === 'linux') {
|
||||||
versionExt = arch == 'x64' ? '-linux64' : '-linux32';
|
versionExt = arch == 'x64' ? '-linux64' : '-linux32';
|
||||||
|
ext = 'tar.gz';
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw new Error(`Platform ${osPlat} is not supported`);
|
throw new Error(`Platform ${osPlat} is not supported`);
|
||||||
}
|
}
|
||||||
return `julia-latest${versionExt}.${fileExt1}`;
|
return `julia-latest${versionExt}.${ext}`;
|
||||||
}
|
}
|
||||||
function getFileInfo(versionInfo, version, arch) {
|
function getFileInfo(versionInfo, version, arch) {
|
||||||
const err = `Could not find ${archMap[arch]}/${version} binaries`;
|
|
||||||
let fileExt1;
|
|
||||||
let hasFileExt2;
|
|
||||||
let fileExt2;
|
|
||||||
[fileExt1, hasFileExt2, fileExt2] = getDesiredFileExts();
|
|
||||||
if (version.endsWith('nightly')) {
|
if (version.endsWith('nightly')) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (!versionInfo[version]) {
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
for (let file of versionInfo[version].files) {
|
for (let file of versionInfo[version].files) {
|
||||||
if (file.os == osMap[osPlat] && file.arch == archMap[arch]) {
|
if (file.os == osMap[osPlat] && file.arch == archMap[arch]) {
|
||||||
if (file.extension == fileExt1) {
|
return file;
|
||||||
return file;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasFileExt2) {
|
throw `Could not find ${archMap[arch]}/${version} binaries`;
|
||||||
core.debug(`Could not find ${fileExt1}; trying to find ${fileExt2} instead`);
|
|
||||||
for (let file of versionInfo[version].files) {
|
|
||||||
if (file.os == osMap[osPlat] && file.arch == archMap[arch]) {
|
|
||||||
if (file.extension == fileExt2) {
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw err;
|
|
||||||
}
|
}
|
||||||
exports.getFileInfo = getFileInfo;
|
exports.getFileInfo = getFileInfo;
|
||||||
function getDownloadURL(fileInfo, version, arch) {
|
function getDownloadURL(fileInfo, version, arch) {
|
||||||
@@ -208,10 +137,6 @@ function getDownloadURL(fileInfo, version, arch) {
|
|||||||
if (version == 'nightly') {
|
if (version == 'nightly') {
|
||||||
return `${baseURL}/${getNightlyFileName(arch)}`;
|
return `${baseURL}/${getNightlyFileName(arch)}`;
|
||||||
}
|
}
|
||||||
// Verify that fileInfo.url points at the official Julia download servers
|
|
||||||
if (!fileInfo.url.startsWith('https://julialang-s3.julialang.org/')) {
|
|
||||||
throw new Error(`versions.json points at a download location outside of Julia's download server: ${fileInfo.url}. Aborting for security reasons.`);
|
|
||||||
}
|
|
||||||
return fileInfo.url;
|
return fileInfo.url;
|
||||||
}
|
}
|
||||||
exports.getDownloadURL = getDownloadURL;
|
exports.getDownloadURL = getDownloadURL;
|
||||||
@@ -221,15 +146,7 @@ function installJulia(versionInfo, version, arch) {
|
|||||||
const fileInfo = getFileInfo(versionInfo, version, arch);
|
const fileInfo = getFileInfo(versionInfo, version, arch);
|
||||||
const downloadURL = getDownloadURL(fileInfo, version, arch);
|
const downloadURL = getDownloadURL(fileInfo, version, arch);
|
||||||
core.debug(`downloading Julia from ${downloadURL}`);
|
core.debug(`downloading Julia from ${downloadURL}`);
|
||||||
// Occasionally the connection is reset for unknown reasons
|
const juliaDownloadPath = yield tc.downloadTool(downloadURL);
|
||||||
// In those cases, retry the download
|
|
||||||
const juliaDownloadPath = yield retry((bail) => __awaiter(this, void 0, void 0, function* () {
|
|
||||||
return yield tc.downloadTool(downloadURL);
|
|
||||||
}), {
|
|
||||||
onRetry: (err) => {
|
|
||||||
core.debug(`Download of ${downloadURL} failed, trying again. Error: ${err}`);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// Verify checksum
|
// Verify checksum
|
||||||
if (!version.endsWith('nightly')) {
|
if (!version.endsWith('nightly')) {
|
||||||
const checkSum = yield calculateChecksum(juliaDownloadPath);
|
const checkSum = yield calculateChecksum(juliaDownloadPath);
|
||||||
@@ -258,57 +175,12 @@ function installJulia(versionInfo, version, arch) {
|
|||||||
}
|
}
|
||||||
return tempInstallDir;
|
return tempInstallDir;
|
||||||
case 'darwin':
|
case 'darwin':
|
||||||
if (fileInfo !== null && fileInfo.extension == 'dmg') {
|
yield exec.exec('hdiutil', ['attach', juliaDownloadPath]);
|
||||||
core.debug(`Support for .dmg files is deprecated and may be removed in a future release`);
|
yield exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${tempInstallDir}`]);
|
||||||
yield exec.exec('hdiutil', ['attach', juliaDownloadPath]);
|
return path.join(tempInstallDir, 'julia');
|
||||||
yield exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${tempInstallDir}`]);
|
|
||||||
return path.join(tempInstallDir, '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;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
throw new Error(`Platform ${osPlat} is not supported`);
|
throw new Error(`Platform ${osPlat} is not supported`);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.installJulia = installJulia;
|
exports.installJulia = installJulia;
|
||||||
/**
|
|
||||||
* Test if Julia has been installed and print the version.
|
|
||||||
*
|
|
||||||
* true => always show versioninfo
|
|
||||||
* false => only show on nightlies
|
|
||||||
* never => never show it anywhere
|
|
||||||
*
|
|
||||||
* @param showVersionInfoInput
|
|
||||||
*/
|
|
||||||
function showVersionInfo(showVersionInfoInput, version) {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
// --compile=min -O0 reduces the time from ~1.8-1.9s to ~0.8-0.9s
|
|
||||||
let exitCode;
|
|
||||||
switch (showVersionInfoInput) {
|
|
||||||
case 'true':
|
|
||||||
exitCode = yield exec.exec('julia', ['--compile=min', '-O0', '-e', 'using InteractiveUtils; versioninfo()']);
|
|
||||||
break;
|
|
||||||
case 'false':
|
|
||||||
if (version.endsWith('nightly')) {
|
|
||||||
exitCode = yield exec.exec('julia', ['--compile=min', '-O0', '-e', 'using InteractiveUtils; versioninfo()']);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
exitCode = yield exec.exec('julia', ['--version']);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'never':
|
|
||||||
exitCode = yield exec.exec('julia', ['--version']);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new Error(`${showVersionInfoInput} is not a valid value for show-versioninfo. Supported values: true | false | never`);
|
|
||||||
}
|
|
||||||
if (exitCode !== 0) {
|
|
||||||
throw new Error(`Julia could not be installed properly. Exit code: ${exitCode}`);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
exports.showVersionInfo = showVersionInfo;
|
|
||||||
|
|||||||
64
lib/setup-julia.js
generated
64
lib/setup-julia.js
generated
@@ -1,52 +1,27 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
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 (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) {
|
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) {
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
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 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); }
|
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());
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
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;
|
||||||
|
return result;
|
||||||
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const core = __importStar(require("@actions/core"));
|
const core = __importStar(require("@actions/core"));
|
||||||
|
const exec = __importStar(require("@actions/exec"));
|
||||||
const tc = __importStar(require("@actions/tool-cache"));
|
const tc = __importStar(require("@actions/tool-cache"));
|
||||||
const fs = __importStar(require("fs"));
|
const fs = __importStar(require("fs"));
|
||||||
const https = __importStar(require("https"));
|
const https = __importStar(require("https"));
|
||||||
const path = __importStar(require("path"));
|
const path = __importStar(require("path"));
|
||||||
const installer = __importStar(require("./installer"));
|
const installer = __importStar(require("./installer"));
|
||||||
const archSynonyms = {
|
|
||||||
'x86': 'x86',
|
|
||||||
'X86': 'x86',
|
|
||||||
'x64': 'x64',
|
|
||||||
'X64': 'x64',
|
|
||||||
'aarch64': 'aarch64',
|
|
||||||
'ARM64': 'aarch64',
|
|
||||||
'arm64': 'aarch64'
|
|
||||||
};
|
|
||||||
function run() {
|
function run() {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
try {
|
try {
|
||||||
@@ -67,8 +42,7 @@ function run() {
|
|||||||
}
|
}
|
||||||
// Inputs
|
// Inputs
|
||||||
const versionInput = core.getInput('version');
|
const versionInput = core.getInput('version');
|
||||||
const includePrereleases = core.getInput('include-all-prereleases') == 'true';
|
const arch = core.getInput('arch');
|
||||||
const originalArchInput = core.getInput('arch');
|
|
||||||
// It can easily happen that, for example, a workflow file contains an input `version: ${{ matrix.julia-version }}`
|
// 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 }}`.
|
// 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.
|
// In that case, we want the action to fail, rather than trying to download julia from an URL that's missing parts and 404ing.
|
||||||
@@ -77,13 +51,12 @@ function run() {
|
|||||||
if (!versionInput) {
|
if (!versionInput) {
|
||||||
throw new Error('Version input must not be null');
|
throw new Error('Version input must not be null');
|
||||||
}
|
}
|
||||||
if (!originalArchInput) {
|
if (!arch) {
|
||||||
throw new Error(`Arch input must not be null`);
|
throw new Error(`Arch input must not be null`);
|
||||||
}
|
}
|
||||||
const arch = archSynonyms[originalArchInput];
|
|
||||||
const versionInfo = yield installer.getJuliaVersionInfo();
|
const versionInfo = yield installer.getJuliaVersionInfo();
|
||||||
const availableReleases = yield installer.getJuliaVersions(versionInfo);
|
const availableReleases = yield installer.getJuliaVersions(versionInfo);
|
||||||
const version = installer.getJuliaVersion(availableReleases, versionInput, includePrereleases);
|
const version = installer.getJuliaVersion(availableReleases, versionInput);
|
||||||
core.debug(`selected Julia version: ${arch}/${version}`);
|
core.debug(`selected Julia version: ${arch}/${version}`);
|
||||||
core.setOutput('julia-version', version);
|
core.setOutput('julia-version', version);
|
||||||
// Search in cache
|
// Search in cache
|
||||||
@@ -96,7 +69,7 @@ function run() {
|
|||||||
juliaPath = yield tc.cacheDir(juliaInstallationPath, 'julia', version, arch);
|
juliaPath = yield tc.cacheDir(juliaInstallationPath, 'julia', version, arch);
|
||||||
core.debug(`added Julia to cache: ${juliaPath}`);
|
core.debug(`added Julia to cache: ${juliaPath}`);
|
||||||
// Remove temporary dir
|
// Remove temporary dir
|
||||||
fs.rmSync(juliaInstallationPath, { recursive: true });
|
fs.rmdirSync(juliaInstallationPath, { recursive: true });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
core.debug(`using cached version of Julia: ${juliaPath}`);
|
core.debug(`using cached version of Julia: ${juliaPath}`);
|
||||||
@@ -106,8 +79,15 @@ function run() {
|
|||||||
// Set output
|
// Set output
|
||||||
core.setOutput('julia-bindir', path.join(juliaPath, 'bin'));
|
core.setOutput('julia-bindir', path.join(juliaPath, 'bin'));
|
||||||
// Test if Julia has been installed and print the version
|
// Test if Julia has been installed and print the version
|
||||||
const showVersionInfoInput = core.getInput('show-versioninfo');
|
if (core.getInput('show-versioninfo') == 'true') {
|
||||||
yield installer.showVersionInfo(showVersionInfoInput, version);
|
// If enabled, show the full version info
|
||||||
|
// --compile=min -O0 reduces the time from ~1.8-1.9s to ~0.8-0.9s
|
||||||
|
exec.exec('julia', ['--compile=min', '-O0', '-e', 'using InteractiveUtils; versioninfo()']);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Otherwise only print julia --version to save time
|
||||||
|
exec.exec('julia', ['--version']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (error) {
|
catch (error) {
|
||||||
core.setFailed(error.message);
|
core.setFailed(error.message);
|
||||||
|
|||||||
13539
package-lock.json
generated
13539
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
35
package.json
35
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "setup-julia",
|
"name": "setup-julia",
|
||||||
"version": "1.9.2",
|
"version": "1.5.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "setup Julia action",
|
"description": "setup Julia action",
|
||||||
"main": "lib/setup-julia.js",
|
"main": "lib/setup-julia.js",
|
||||||
@@ -21,25 +21,22 @@
|
|||||||
"author": "Sascha Mann <git@mail.saschamann.eu>",
|
"author": "Sascha Mann <git@mail.saschamann.eu>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.10.0",
|
"@actions/core": "^1.2.6",
|
||||||
"@actions/exec": "^1.1.1",
|
"@actions/exec": "^1.0.0",
|
||||||
"@actions/io": "^1.1.2",
|
"@actions/io": "^1.0.0",
|
||||||
"@actions/tool-cache": "^2.0.1",
|
"@actions/tool-cache": "^1.0.0",
|
||||||
"async-retry": "^1.3.3",
|
"semver": "^6.3.0"
|
||||||
"semver": "^7.3.8"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/async-retry": "^1.4.5",
|
"@types/jest": "^24.0.13",
|
||||||
"@types/jest": "^29.4.0",
|
"@types/node": "^12.12.7",
|
||||||
"@types/node": "^16.18.12",
|
"@types/semver": "^6.0.0",
|
||||||
"@types/retry": "^0.12.2",
|
"@zeit/ncc": "^0.22.0",
|
||||||
"@types/semver": "^7.3.13",
|
"jest": "^24.8.0",
|
||||||
"@zeit/ncc": "^0.22.3",
|
"jest-circus": "^24.7.1",
|
||||||
"jest": "^29.4.2",
|
"nock": "^11.7.2",
|
||||||
"jest-circus": "^29.4.2",
|
"prettier": "^1.17.1",
|
||||||
"nock": "^13.3.0",
|
"ts-jest": "^26.0.0",
|
||||||
"prettier": "^2.8.4",
|
"typescript": "^3.5.1"
|
||||||
"ts-jest": "^29.0.5",
|
|
||||||
"typescript": "^4.9.5"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
146
src/installer.ts
146
src/installer.ts
@@ -6,7 +6,6 @@ import * as crypto from 'crypto'
|
|||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
import * as os from 'os'
|
import * as os from 'os'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import retry = require('async-retry')
|
|
||||||
|
|
||||||
import * as semver from 'semver'
|
import * as semver from 'semver'
|
||||||
|
|
||||||
@@ -18,8 +17,7 @@ const osMap = {
|
|||||||
}
|
}
|
||||||
const archMap = {
|
const archMap = {
|
||||||
'x86': 'i686',
|
'x86': 'i686',
|
||||||
'x64': 'x86_64',
|
'x64': 'x86_64'
|
||||||
'aarch64': 'aarch64'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store information about the environment
|
// Store information about the environment
|
||||||
@@ -49,15 +47,7 @@ async function calculateChecksum(file: string): Promise<string> {
|
|||||||
* @returns The content of the downloaded versions.json file as object.
|
* @returns The content of the downloaded versions.json file as object.
|
||||||
*/
|
*/
|
||||||
export async function getJuliaVersionInfo(): Promise<object> {
|
export async function getJuliaVersionInfo(): Promise<object> {
|
||||||
// Occasionally the connection is reset for unknown reasons
|
const versionsFile = await tc.downloadTool('https://julialang-s3.julialang.org/bin/versions.json')
|
||||||
// In those cases, retry the download
|
|
||||||
const versionsFile = await retry(async (bail: Function) => {
|
|
||||||
return await tc.downloadTool('https://julialang-s3.julialang.org/bin/versions.json')
|
|
||||||
}, {
|
|
||||||
onRetry: (err: Error) => {
|
|
||||||
core.debug(`Download of versions.json failed, trying again. Error: ${err}`)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
return JSON.parse(fs.readFileSync(versionsFile).toString())
|
return JSON.parse(fs.readFileSync(versionsFile).toString())
|
||||||
}
|
}
|
||||||
@@ -75,14 +65,14 @@ export async function getJuliaVersions(versionInfo): Promise<string[]> {
|
|||||||
return versions
|
return versions
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getJuliaVersion(availableReleases: string[], versionInput: string, includePrerelease: boolean = false): string {
|
export function getJuliaVersion(availableReleases: string[], versionInput: string): string {
|
||||||
if (semver.valid(versionInput) == versionInput || versionInput.endsWith('nightly')) {
|
if (semver.valid(versionInput) == versionInput || versionInput.endsWith('nightly')) {
|
||||||
// versionInput is a valid version or a nightly version, use it directly
|
// versionInput is a valid version or a nightly version, use it directly
|
||||||
return versionInput
|
return versionInput
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use the highest available version that matches versionInput
|
// Use the highest available version that matches versionInput
|
||||||
let version = semver.maxSatisfying(availableReleases, versionInput, {includePrerelease})
|
let version = semver.maxSatisfying(availableReleases, versionInput)
|
||||||
if (version == null) {
|
if (version == null) {
|
||||||
throw new Error(`Could not find a Julia version that matches ${versionInput}`)
|
throw new Error(`Could not find a Julia version that matches ${versionInput}`)
|
||||||
}
|
}
|
||||||
@@ -93,87 +83,40 @@ export function getJuliaVersion(availableReleases: string[], versionInput: strin
|
|||||||
return version
|
return version
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDesiredFileExts(): [string, boolean, string] {
|
|
||||||
let fileExt1: string
|
|
||||||
let hasFileExt2: boolean
|
|
||||||
let fileExt2: string
|
|
||||||
|
|
||||||
if (osPlat == 'win32') {
|
|
||||||
fileExt1 = 'exe'
|
|
||||||
hasFileExt2 = false
|
|
||||||
fileExt2 = ''
|
|
||||||
} else if (osPlat == 'darwin') {
|
|
||||||
fileExt1 = 'tar.gz'
|
|
||||||
hasFileExt2 = true
|
|
||||||
fileExt2 = 'dmg'
|
|
||||||
} else if (osPlat === 'linux') {
|
|
||||||
fileExt1 = 'tar.gz'
|
|
||||||
hasFileExt2 = false
|
|
||||||
fileExt2 = ''
|
|
||||||
} else {
|
|
||||||
throw new Error(`Platform ${osPlat} is not supported`)
|
|
||||||
}
|
|
||||||
|
|
||||||
return [fileExt1, hasFileExt2, fileExt2]
|
|
||||||
}
|
|
||||||
|
|
||||||
function getNightlyFileName(arch: string): string {
|
function getNightlyFileName(arch: string): string {
|
||||||
let versionExt: string
|
let versionExt: string, ext: string
|
||||||
let fileExt1: string
|
|
||||||
[fileExt1, , ] = getDesiredFileExts()
|
|
||||||
|
|
||||||
if (osPlat == 'win32') {
|
if (osPlat == 'win32') {
|
||||||
versionExt = arch == 'x64' ? '-win64' : '-win32'
|
versionExt = arch == 'x64' ? '-win64' : '-win32'
|
||||||
|
ext = 'exe'
|
||||||
} else if (osPlat == 'darwin') {
|
} else if (osPlat == 'darwin') {
|
||||||
if (arch == 'x86') {
|
if (arch == 'x86') {
|
||||||
throw new Error('32-bit Julia is not available on macOS')
|
throw new Error('32-bit Julia is not available on macOS')
|
||||||
}
|
}
|
||||||
versionExt = '-mac64'
|
versionExt = '-mac64'
|
||||||
|
ext = 'dmg'
|
||||||
} else if (osPlat === 'linux') {
|
} else if (osPlat === 'linux') {
|
||||||
versionExt = arch == 'x64' ? '-linux64' : '-linux32'
|
versionExt = arch == 'x64' ? '-linux64' : '-linux32'
|
||||||
|
ext = 'tar.gz'
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`Platform ${osPlat} is not supported`)
|
throw new Error(`Platform ${osPlat} is not supported`)
|
||||||
}
|
}
|
||||||
|
|
||||||
return `julia-latest${versionExt}.${fileExt1}`
|
return `julia-latest${versionExt}.${ext}`
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getFileInfo(versionInfo, version: string, arch: string) {
|
export function getFileInfo(versionInfo, version: string, arch: string) {
|
||||||
const err = `Could not find ${archMap[arch]}/${version} binaries`
|
|
||||||
|
|
||||||
let fileExt1: string
|
|
||||||
let hasFileExt2: boolean
|
|
||||||
let fileExt2: string
|
|
||||||
[fileExt1, hasFileExt2, fileExt2] = getDesiredFileExts()
|
|
||||||
|
|
||||||
if (version.endsWith('nightly')) {
|
if (version.endsWith('nightly')) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!versionInfo[version]) {
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let file of versionInfo[version].files) {
|
for (let file of versionInfo[version].files) {
|
||||||
if (file.os == osMap[osPlat] && file.arch == archMap[arch]) {
|
if (file.os == osMap[osPlat] && file.arch == archMap[arch]) {
|
||||||
if (file.extension == fileExt1) {
|
return file
|
||||||
return file
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasFileExt2) {
|
throw `Could not find ${archMap[arch]}/${version} binaries`
|
||||||
core.debug(`Could not find ${fileExt1}; trying to find ${fileExt2} instead`)
|
|
||||||
for (let file of versionInfo[version].files) {
|
|
||||||
if (file.os == osMap[osPlat] && file.arch == archMap[arch]) {
|
|
||||||
if (file.extension == fileExt2) {
|
|
||||||
return file
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
throw err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getDownloadURL(fileInfo, version: string, arch: string): string {
|
export function getDownloadURL(fileInfo, version: string, arch: string): string {
|
||||||
@@ -190,10 +133,6 @@ export function getDownloadURL(fileInfo, version: string, arch: string): string
|
|||||||
return `${baseURL}/${getNightlyFileName(arch)}`
|
return `${baseURL}/${getNightlyFileName(arch)}`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify that fileInfo.url points at the official Julia download servers
|
|
||||||
if (!fileInfo.url.startsWith('https://julialang-s3.julialang.org/')) {
|
|
||||||
throw new Error(`versions.json points at a download location outside of Julia's download server: ${fileInfo.url}. Aborting for security reasons.`)
|
|
||||||
}
|
|
||||||
return fileInfo.url
|
return fileInfo.url
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,16 +141,7 @@ export async function installJulia(versionInfo, version: string, arch: string):
|
|||||||
const fileInfo = getFileInfo(versionInfo, version, arch)
|
const fileInfo = getFileInfo(versionInfo, version, arch)
|
||||||
const downloadURL = getDownloadURL(fileInfo, version, arch)
|
const downloadURL = getDownloadURL(fileInfo, version, arch)
|
||||||
core.debug(`downloading Julia from ${downloadURL}`)
|
core.debug(`downloading Julia from ${downloadURL}`)
|
||||||
|
const juliaDownloadPath = await tc.downloadTool(downloadURL)
|
||||||
// Occasionally the connection is reset for unknown reasons
|
|
||||||
// In those cases, retry the download
|
|
||||||
const juliaDownloadPath = await retry(async (bail: Function) => {
|
|
||||||
return await tc.downloadTool(downloadURL)
|
|
||||||
}, {
|
|
||||||
onRetry: (err: Error) => {
|
|
||||||
core.debug(`Download of ${downloadURL} failed, trying again. Error: ${err}`)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// Verify checksum
|
// Verify checksum
|
||||||
if (!version.endsWith('nightly')) {
|
if (!version.endsWith('nightly')) {
|
||||||
@@ -241,56 +171,10 @@ export async function installJulia(versionInfo, version: string, arch: string):
|
|||||||
}
|
}
|
||||||
return tempInstallDir
|
return tempInstallDir
|
||||||
case 'darwin':
|
case 'darwin':
|
||||||
if (fileInfo !== null && fileInfo.extension == 'dmg') {
|
await exec.exec('hdiutil', ['attach', juliaDownloadPath])
|
||||||
core.debug(`Support for .dmg files is deprecated and may be removed in a future release`)
|
await exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${tempInstallDir}`])
|
||||||
await exec.exec('hdiutil', ['attach', juliaDownloadPath])
|
return path.join(tempInstallDir, 'julia')
|
||||||
await exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${tempInstallDir}`])
|
|
||||||
return path.join(tempInstallDir, '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
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
throw new Error(`Platform ${osPlat} is not supported`)
|
throw new Error(`Platform ${osPlat} is not supported`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Test if Julia has been installed and print the version.
|
|
||||||
*
|
|
||||||
* true => always show versioninfo
|
|
||||||
* false => only show on nightlies
|
|
||||||
* never => never show it anywhere
|
|
||||||
*
|
|
||||||
* @param showVersionInfoInput
|
|
||||||
*/
|
|
||||||
export async function showVersionInfo(showVersionInfoInput: string, version: string): Promise<void> {
|
|
||||||
// --compile=min -O0 reduces the time from ~1.8-1.9s to ~0.8-0.9s
|
|
||||||
let exitCode: number
|
|
||||||
|
|
||||||
switch (showVersionInfoInput) {
|
|
||||||
case 'true':
|
|
||||||
exitCode = await exec.exec('julia', ['--compile=min', '-O0', '-e', 'using InteractiveUtils; versioninfo()'])
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'false':
|
|
||||||
if (version.endsWith('nightly')) {
|
|
||||||
exitCode = await exec.exec('julia', ['--compile=min', '-O0', '-e', 'using InteractiveUtils; versioninfo()'])
|
|
||||||
} else {
|
|
||||||
exitCode = await exec.exec('julia', ['--version'])
|
|
||||||
}
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'never':
|
|
||||||
exitCode = await exec.exec('julia', ['--version'])
|
|
||||||
break
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw new Error(`${showVersionInfoInput} is not a valid value for show-versioninfo. Supported values: true | false | never`)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (exitCode !== 0) {
|
|
||||||
throw new Error(`Julia could not be installed properly. Exit code: ${exitCode}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -8,16 +8,6 @@ import * as path from 'path'
|
|||||||
|
|
||||||
import * as installer from './installer'
|
import * as installer from './installer'
|
||||||
|
|
||||||
const archSynonyms = {
|
|
||||||
'x86': 'x86',
|
|
||||||
'X86': 'x86',
|
|
||||||
'x64': 'x64',
|
|
||||||
'X64': 'x64',
|
|
||||||
'aarch64': 'aarch64',
|
|
||||||
'ARM64': 'aarch64',
|
|
||||||
'arm64': 'aarch64'
|
|
||||||
}
|
|
||||||
|
|
||||||
async function run() {
|
async function run() {
|
||||||
try {
|
try {
|
||||||
// Debugging info
|
// Debugging info
|
||||||
@@ -40,8 +30,7 @@ async function run() {
|
|||||||
|
|
||||||
// Inputs
|
// Inputs
|
||||||
const versionInput = core.getInput('version')
|
const versionInput = core.getInput('version')
|
||||||
const includePrereleases = core.getInput('include-all-prereleases') == 'true'
|
const arch = core.getInput('arch')
|
||||||
const originalArchInput = core.getInput('arch')
|
|
||||||
|
|
||||||
// It can easily happen that, for example, a workflow file contains an input `version: ${{ matrix.julia-version }}`
|
// 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 }}`.
|
// while the strategy matrix only contains a key `${{ matrix.version }}`.
|
||||||
@@ -51,15 +40,13 @@ async function run() {
|
|||||||
if (!versionInput) {
|
if (!versionInput) {
|
||||||
throw new Error('Version input must not be null')
|
throw new Error('Version input must not be null')
|
||||||
}
|
}
|
||||||
if (!originalArchInput) {
|
if (!arch) {
|
||||||
throw new Error(`Arch input must not be null`)
|
throw new Error(`Arch input must not be null`)
|
||||||
}
|
}
|
||||||
|
|
||||||
const arch = archSynonyms[originalArchInput]
|
|
||||||
|
|
||||||
const versionInfo = await installer.getJuliaVersionInfo()
|
const versionInfo = await installer.getJuliaVersionInfo()
|
||||||
const availableReleases = await installer.getJuliaVersions(versionInfo)
|
const availableReleases = await installer.getJuliaVersions(versionInfo)
|
||||||
const version = installer.getJuliaVersion(availableReleases, versionInput, includePrereleases)
|
const version = installer.getJuliaVersion(availableReleases, versionInput)
|
||||||
core.debug(`selected Julia version: ${arch}/${version}`)
|
core.debug(`selected Julia version: ${arch}/${version}`)
|
||||||
core.setOutput('julia-version', version)
|
core.setOutput('julia-version', version)
|
||||||
|
|
||||||
@@ -76,7 +63,7 @@ async function run() {
|
|||||||
core.debug(`added Julia to cache: ${juliaPath}`)
|
core.debug(`added Julia to cache: ${juliaPath}`)
|
||||||
|
|
||||||
// Remove temporary dir
|
// Remove temporary dir
|
||||||
fs.rmSync(juliaInstallationPath, {recursive: true})
|
fs.rmdirSync(juliaInstallationPath, {recursive: true})
|
||||||
} else {
|
} else {
|
||||||
core.debug(`using cached version of Julia: ${juliaPath}`)
|
core.debug(`using cached version of Julia: ${juliaPath}`)
|
||||||
}
|
}
|
||||||
@@ -88,10 +75,16 @@ async function run() {
|
|||||||
core.setOutput('julia-bindir', path.join(juliaPath, 'bin'))
|
core.setOutput('julia-bindir', path.join(juliaPath, 'bin'))
|
||||||
|
|
||||||
// Test if Julia has been installed and print the version
|
// Test if Julia has been installed and print the version
|
||||||
const showVersionInfoInput = core.getInput('show-versioninfo')
|
if (core.getInput('show-versioninfo') == 'true') {
|
||||||
await installer.showVersionInfo(showVersionInfoInput, version)
|
// If enabled, show the full version info
|
||||||
|
// --compile=min -O0 reduces the time from ~1.8-1.9s to ~0.8-0.9s
|
||||||
|
exec.exec('julia', ['--compile=min', '-O0', '-e', 'using InteractiveUtils; versioninfo()'])
|
||||||
|
} else {
|
||||||
|
// Otherwise only print julia --version to save time
|
||||||
|
exec.exec('julia', ['--version'])
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
core.setFailed((error as Error).message)
|
core.setFailed(error.message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user