mirror of
https://github.com/julia-actions/setup-julia.git
synced 2026-02-12 19:16:54 +08:00
Compare commits
71 Commits
releases/v
...
releases/v
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
afa071ebdb | ||
|
|
c7bbfb8ea8 | ||
|
|
be4aa6964b | ||
|
|
1cabf59107 | ||
|
|
8945494c8c | ||
|
|
a81735fc3d | ||
|
|
2c2ccf4805 | ||
|
|
0352b39425 | ||
|
|
5ed1ab9531 | ||
|
|
b440227ef4 | ||
|
|
e07eb0ff2a | ||
|
|
0c24e24eb5 | ||
|
|
abd4c5ae03 | ||
|
|
51f7dbcff0 | ||
|
|
06264a4b68 | ||
|
|
8f56a5b739 | ||
|
|
83f4f82909 | ||
|
|
eba5daa7a3 | ||
|
|
150b180e77 | ||
|
|
df27cccb6d | ||
|
|
4e8b9a1f06 | ||
|
|
960c1f45ca | ||
|
|
ca58c641a5 | ||
|
|
6c0c21977e | ||
|
|
6a79c57a32 | ||
|
|
2efcc69643 | ||
|
|
d8b4778b2d | ||
|
|
c8ae0bede2 | ||
|
|
34454fe7cf | ||
|
|
689d600802 | ||
|
|
df485a1da6 | ||
|
|
41539df7fe | ||
|
|
767e91ee6e | ||
|
|
b199a80ea6 | ||
|
|
67ef5af2fd | ||
|
|
7e7f2c80d1 | ||
|
|
062cb2b1a5 | ||
|
|
61303b8b4b | ||
|
|
0f80dc983e | ||
|
|
29cdcebc07 | ||
|
|
b75da77172 | ||
|
|
dc7c0defbe | ||
|
|
5354e1e908 | ||
|
|
2900978394 | ||
|
|
0f0b1bb9ba | ||
|
|
16c0aaf600 | ||
|
|
dc7dce0a2d | ||
|
|
3861b0a708 | ||
|
|
8007d2c472 | ||
|
|
955535b050 | ||
|
|
53af7ff088 | ||
|
|
1fef3e0e61 | ||
|
|
f126476e08 | ||
|
|
48e7b97239 | ||
|
|
5c3252fb75 | ||
|
|
425aaf9321 | ||
|
|
d82325fb86 | ||
|
|
5334cf1301 | ||
|
|
df0206ad59 | ||
|
|
2898e23df6 | ||
|
|
17e9ecd238 | ||
|
|
d6aba32515 | ||
|
|
2a0ae40f1c | ||
|
|
295f753b1e | ||
|
|
a7c1edc063 | ||
|
|
6f01df9c38 | ||
|
|
a8a77e20fd | ||
|
|
58832d0813 | ||
|
|
7ac67b152e | ||
|
|
c11753280f | ||
|
|
3ebbe69222 |
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
# Hide generated JS code from diffs and language stats
|
||||
lib/*.js linguist-generated=true
|
||||
36
.github/workflows/example-builds-nightly.yml
vendored
Normal file
36
.github/workflows/example-builds-nightly.yml
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
name: Example builds (nightly)
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
schedule:
|
||||
- cron: '0 3 * * *'
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
julia-arch: [x64, x86]
|
||||
os: [ubuntu-latest, macOS-latest, windows-latest]
|
||||
# 32-bit Julia binaries are not available on macOS
|
||||
exclude:
|
||||
- os: macOS-latest
|
||||
julia-arch: x86
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1.0.0
|
||||
|
||||
- name: "Install dependencies"
|
||||
run: |
|
||||
npm install
|
||||
npm run build
|
||||
npm run pack
|
||||
|
||||
- name: "Set up Julia (nightly)"
|
||||
uses: ./
|
||||
with:
|
||||
version: nightly
|
||||
arch: ${{ matrix.julia-arch }}
|
||||
- run: julia --version
|
||||
33
.github/workflows/example-builds.yml
vendored
Normal file
33
.github/workflows/example-builds.yml
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
name: Example builds
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
julia-version: ['1.0.5', '1', '^1.5.0-beta1']
|
||||
julia-arch: [x64, x86]
|
||||
os: [ubuntu-latest, macOS-latest, windows-latest]
|
||||
# 32-bit Julia binaries are not available on macOS
|
||||
exclude:
|
||||
- os: macOS-latest
|
||||
julia-arch: x86
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1.0.0
|
||||
|
||||
- name: "Install dependencies"
|
||||
run: |
|
||||
npm install
|
||||
npm run build
|
||||
npm run pack
|
||||
|
||||
- name: "Set up Julia"
|
||||
uses: ./
|
||||
with:
|
||||
version: ${{ matrix.julia-version }}
|
||||
arch: ${{ matrix.julia-arch }}
|
||||
- run: julia --version
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
||||
node_modules/
|
||||
__tests__/runner/*
|
||||
!dist/
|
||||
|
||||
147
README.md
147
README.md
@@ -1,25 +1,61 @@
|
||||
# setup-julia Action
|
||||
|
||||
This action sets up a Julia environment for use in actions by download a specified version of Julia and adding it to PATH.
|
||||
[](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)
|
||||
- [Basic](#basic)
|
||||
- [Julia Versions](#julia-versions)
|
||||
- [Matrix Testing](#matrix-testing)
|
||||
- [Versioning](#versioning)
|
||||
- [Privacy Info](#privacy-info)
|
||||
- [Third party information](#third-party-information)
|
||||
|
||||
## Usage
|
||||
|
||||
See [action.yml](action.yml).
|
||||
|
||||
Take a look at [github.com/exercism/julia](https://github.com/exercism/julia/pull/153) for an example, non-package Julia project making use of this action.
|
||||
You can find a list of example workflows making use of this action here: [julia-actions/example-workflows](https://github.com/julia-actions/example-workflows).
|
||||
|
||||
### Basic:
|
||||
### Basic
|
||||
|
||||
```yaml
|
||||
steps:
|
||||
- uses: actions/checkout@v1.0.0
|
||||
- uses: julia-actions/setup-julia@v0.1.0
|
||||
- uses: julia-actions/setup-julia@v1
|
||||
with:
|
||||
version: 1.0.4
|
||||
- run: julia -e 'println("Hello, World!")'
|
||||
```
|
||||
|
||||
### Matrix Testing:
|
||||
### Julia Versions
|
||||
|
||||
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` is 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`.
|
||||
- `^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 `< 1.4.0`.
|
||||
- `^1.3-0` is a caret 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.
|
||||
|
||||
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).
|
||||
|
||||
#### WARNING: Version ranges are experimental and potentially out of date
|
||||
|
||||
Currently the list of available versions is hardcoded. You have to use the latest version of the action to be able to install the latest Julia versions. Once available we will use a list of versions provided on julialang.org.
|
||||
|
||||
### Matrix Testing
|
||||
|
||||
`bash` is chosen as shell to enforce consistent behaviour across operating systems. [Other shells](https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#using-a-specific-shell) are available but you may have to escape quotation marks or otherwise adjust the syntax.
|
||||
|
||||
#### 64-bit Julia only
|
||||
|
||||
```yaml
|
||||
jobs:
|
||||
@@ -27,47 +63,100 @@ jobs:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
julia-version: [1.0.4, 1.1.1, 1.2.0-rc3, 1.3.0-alpha]
|
||||
julia-version: ['1.0', '1.2.0', '^1.3.0-rc1']
|
||||
os: [ubuntu-latest, windows-latest, macOS-latest]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1.0.0
|
||||
- name: "Set up Julia"
|
||||
uses: julia-actions/setup-julia@v0.1.0
|
||||
uses: julia-actions/setup-julia@v1
|
||||
with:
|
||||
version: ${{ matrix.julia-version }}
|
||||
- run: julia -e 'println("Hello, World!")'
|
||||
shell: bash
|
||||
```
|
||||
|
||||
## Future plans & ideas
|
||||
#### 32-bit Julia
|
||||
|
||||
In no particular order:
|
||||
```yaml
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
julia-version: ['1.0', '1.2.0', '^1.3.0-rc1']
|
||||
julia-arch: [x64, x86]
|
||||
os: [ubuntu-latest, windows-latest, macOS-latest]
|
||||
# 32-bit Julia binaries are not available on macOS
|
||||
exclude:
|
||||
- os: macOS-latest
|
||||
julia-arch: x86
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1.0.0
|
||||
- name: "Set up Julia"
|
||||
uses: julia-actions/setup-julia@v1
|
||||
with:
|
||||
version: ${{ matrix.julia-version }}
|
||||
arch: ${{ matrix.julia-arch }}
|
||||
- run: julia -e 'println("Hello, World!")'
|
||||
shell: bash
|
||||
```
|
||||
|
||||
### `setup-julia`:
|
||||
* Check if a cached version of Julia is available instead of installing it everytime CI runs.
|
||||
* Add version shortcuts like `1.x`, `1.1.x`, `latest` and `lts`.
|
||||
* Add support for nightly Julia builds.
|
||||
* Support 32-bit Julia on 64-bit windows.
|
||||
* Write some unit tests for the action.
|
||||
* Figure out the best way to handle versioning.
|
||||
* Hash and signature checks.
|
||||
Alternatively, you can include specific version and OS combinations that will use 32-bit Julia:
|
||||
|
||||
### Other Julia-related actions:
|
||||
```yaml
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
julia-version: ['1.0', '1.2.0', '^1.3.0-rc1']
|
||||
os: [ubuntu-latest, windows-latest, macOS-latest]
|
||||
# Additionally create a job using 32-bit Julia 1.0.4 on windows-latest
|
||||
include:
|
||||
- os: windows-latest
|
||||
julia-version: ['1.0.4']
|
||||
julia-arch: x86
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1.0.0
|
||||
- name: "Set up Julia"
|
||||
uses: julia-actions/setup-julia@v1
|
||||
with:
|
||||
version: ${{ matrix.julia-version }}
|
||||
- run: julia -e 'println("Hello, World!")'
|
||||
shell: bash
|
||||
```
|
||||
|
||||
These would be nice to have but I make no promises of ever creating them myself.
|
||||
## Versioning
|
||||
|
||||
* Default build script for packages, similar to how Travis CI works if you don't specify a script.
|
||||
* Find out if it's possible to cache packages using [`@actions/tool-cache`](https://github.com/actions/toolkit/tree/master/packages/tool-cache).
|
||||
* Actions for standard tools like Documenter, Coverage reporting and so on
|
||||
* Actions for registering and tagging package releases instead of relying on external apps.
|
||||
This action follows [GitHub's advice](https://help.github.com/en/articles/about-actions#versioning-your-action) on versioning actions, with an additional `latest` tag.
|
||||
|
||||
## Words of caution
|
||||
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.
|
||||
|
||||
This action will likely be updated quite frequently in the near future. I'm sharing it now so that others who want to try out Julia on GitHub actions can do so without relying on Docker.
|
||||
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.
|
||||
|
||||
**DO NOT USE THIS AS YOUR ONLY FORM OF CI** (yet).
|
||||
You can specify commits, branches or tags in your workflows as follows:
|
||||
|
||||
Unfortunately, because non-container actions must use JavaScript/TypeScript as scripting language, `npm` is involved. The dependencies are vendored but this action relies 100% on GitHub to audit the dependencies they add to their action toolkit.
|
||||
```yaml
|
||||
steps:
|
||||
- uses: julia-actions/setup-julia@6ae948d # commit SHA
|
||||
- uses: julia-actions/setup-julia@master # branch
|
||||
- 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@v0.1.0 # specific version tag
|
||||
```
|
||||
|
||||
## Licence info
|
||||
Parts of this software have been derived from the `setup-go` [action](https://github.com/actions/setup-go) and the [JavaScript Action Template](https://github.com/actions/javascript-template), both released by GitHub under the MIT licence.
|
||||
## Privacy Info
|
||||
|
||||
Julia version 1.5 and later collects telemetry information during certain `Pkg` operations.
|
||||
Please refer to <https://julialang.org/legal/data/> for information on what data is collected.
|
||||
This action does not alter the Julia installation in any way, therefore telemetry on your CI runs will be collected by the Julia Pkg server unless you opt out.
|
||||
In a later release of the action, an action input to opt out of telemetry will be provided but for now you need to add a step to your workflows that edits `telemetry.toml` in the CI environment as described in the [Opting Out](https://julialang.org/legal/data/#opting_out) section of the above document.
|
||||
|
||||
**This action itself does not collect any kind of personal data or telemetry information.**
|
||||
|
||||
## 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.
|
||||
|
||||
55
THIRD_PARTY_NOTICE.md
Normal file
55
THIRD_PARTY_NOTICE.md
Normal file
@@ -0,0 +1,55 @@
|
||||
# Third Party Notices and Information
|
||||
|
||||
Parts of this software have been derived from other open source software.
|
||||
Find their full licence information below.
|
||||
|
||||
- [`setup-go` action](#setup-go-action)
|
||||
- [TypeScript Action Template](#typescript-action-template)
|
||||
|
||||
## [`setup-go` action](https://github.com/actions/setup-go)
|
||||
|
||||
> The MIT License (MIT)
|
||||
>
|
||||
> Copyright (c) 2018 GitHub, Inc. and contributors
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in
|
||||
> all copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
> THE SOFTWARE.
|
||||
|
||||
## [TypeScript Action Template](https://github.com/actions/typescript-action)
|
||||
|
||||
> The MIT License (MIT)
|
||||
>
|
||||
> Copyright (c) 2018 GitHub, Inc. and contributors
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in
|
||||
> all copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
> THE SOFTWARE.
|
||||
@@ -1,3 +1,43 @@
|
||||
describe('TODO - Add a test suite', () => {
|
||||
it('TODO - Add a test', async () => {})
|
||||
import * as installer from '../src/installer'
|
||||
|
||||
import * as semver from 'semver'
|
||||
|
||||
const testVersions = ['v1.3.0-rc4', 'v1.3.0-rc3', 'v1.3.0-rc2', 'v1.0.5', 'v1.2.0', 'v1.3.0-rc1', 'v1.2.0-rc3', 'v1.3.0-alpha', 'v1.2.0-rc2', 'v1.2.0-rc1', 'v1.1.1', 'v1.0.4', 'v1.1.0', 'v1.1.0-rc2', 'v1.1.0-rc1', 'v1.0.3', 'v1.0.2', 'v1.0.1', 'v1.0.0']
|
||||
|
||||
describe('installer tests', () => {
|
||||
describe('version matching', () => {
|
||||
describe('specific versions', () => {
|
||||
it('Doesn\'t change the version when given a valid semver version', async () => {
|
||||
expect(await installer.getJuliaVersion([], '1.0.5')).toEqual('1.0.5')
|
||||
expect(await installer.getJuliaVersion(['v1.0.5', 'v1.0.6'], '1.0.5')).toEqual('1.0.5')
|
||||
expect(await installer.getJuliaVersion(['v1.0.4', 'v1.0.5'], '1.0.5')).toEqual('1.0.5')
|
||||
expect(await installer.getJuliaVersion(['v1.0.4'], '1.0.5')).toEqual('1.0.5')
|
||||
expect(await installer.getJuliaVersion([], '1.3.0-alpha')).toEqual('1.3.0-alpha')
|
||||
expect(await installer.getJuliaVersion(['v1.2.0', 'v1.3.0-alpha', 'v1.3.0-rc1', 'v1.3.0'], '1.3.0-alpha')).toEqual('1.3.0-alpha')
|
||||
expect(await installer.getJuliaVersion([], '1.3.0-rc2')).toEqual('1.3.0-rc2')
|
||||
})
|
||||
it('Doesn\'t change the version when given `nightly`', async () => {
|
||||
expect(await installer.getJuliaVersion([], 'nightly')).toEqual('nightly')
|
||||
expect(await installer.getJuliaVersion(testVersions, 'nightly')).toEqual('nightly')
|
||||
})
|
||||
})
|
||||
describe('version ranges', () => {
|
||||
it('Chooses the highest available version that matches the input', async () => {
|
||||
expect(await installer.getJuliaVersion(testVersions, '1')).toEqual('1.2.0')
|
||||
expect(await installer.getJuliaVersion(testVersions, '1.0')).toEqual('1.0.5')
|
||||
expect(await installer.getJuliaVersion(testVersions, '^1.3.0-rc1')).toEqual('1.3.0-rc4')
|
||||
expect(await installer.getJuliaVersion(testVersions, '^1.2.0-rc1')).toEqual('1.2.0')
|
||||
})
|
||||
})
|
||||
})
|
||||
describe('node-semver behaviour', () => {
|
||||
describe('Windows installer change', () => {
|
||||
it('Correctly understands >1.4.0', () => {
|
||||
expect(semver.gtr('1.4.0-rc1', '1.3', {includePrerelease: true})).toBeTruthy()
|
||||
expect(semver.gtr('1.4.0-DEV', '1.3', {includePrerelease: true})).toBeTruthy()
|
||||
expect(semver.gtr('1.3.1', '1.3', {includePrerelease: true})).toBeFalsy()
|
||||
expect(semver.gtr('1.3.2-rc1', '1.3', {includePrerelease: true})).toBeFalsy()
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
12
action.yml
12
action.yml
@@ -4,10 +4,18 @@ author: 'Sascha Mann'
|
||||
inputs:
|
||||
version:
|
||||
description: 'The Julia version to download (if necessary) and use. Example: 1.0.4'
|
||||
default: '1.0.4'
|
||||
default: '1'
|
||||
arch:
|
||||
description: 'Architecture of the Julia binaries. Defaults to x64.'
|
||||
required: false
|
||||
default: 'x64'
|
||||
show-versioninfo:
|
||||
description: 'Display InteractiveUtils.versioninfo() after installing'
|
||||
required: false
|
||||
default: 'false'
|
||||
runs:
|
||||
using: 'node12'
|
||||
main: 'lib/setup-julia.js'
|
||||
main: 'dist/index.js'
|
||||
branding:
|
||||
icon: 'download'
|
||||
color: 'green'
|
||||
|
||||
44
bin/build-release
Normal file
44
bin/build-release
Normal file
@@ -0,0 +1,44 @@
|
||||
#!/bin/sh
|
||||
|
||||
branch_name="$(git symbolic-ref --short -q HEAD)"
|
||||
version="v$(jq -r .version package.json)"
|
||||
repo="$1"
|
||||
|
||||
if [ -z "$repo" ]; then
|
||||
echo "ERROR: must specify repository"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "=== debug info ==="
|
||||
echo "branch: $branch_name"
|
||||
echo "version: $version"
|
||||
echo "repo: $repo"
|
||||
echo "=================="
|
||||
echo ""
|
||||
|
||||
# Check that the version doesn't exist yet
|
||||
version_exists="$(curl -s https://api.github.com/repos/"$repo"/tags -H "Accept: application/vnd.github.v3.full+json" | jq -r '.[] | select(.name == "'"$version"'") | .name')"
|
||||
if [ -n "$version_exists" ]; then
|
||||
echo "ERROR: version $version already exists"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git checkout -b releases/"$version"
|
||||
|
||||
npm install
|
||||
npm run build
|
||||
npm test
|
||||
npm run pack
|
||||
|
||||
sed -i 's/dist/!dist/g' .gitignore
|
||||
git add dist
|
||||
git commit -a -m "Add production dependencies & build"
|
||||
|
||||
# Tags
|
||||
major_minor="$(sed 's/\.[^.]*$//' <<< "$version")"
|
||||
major="$(sed 's/\.[^.]*$//' <<< "$major_minor")"
|
||||
|
||||
git tag "$version"
|
||||
git tag -f "$major_minor"
|
||||
git tag -f "$major"
|
||||
git tag -f "latest"
|
||||
36
bin/build-test-release
Normal file
36
bin/build-test-release
Normal file
@@ -0,0 +1,36 @@
|
||||
#!/bin/sh
|
||||
|
||||
branch_name="$(git symbolic-ref --short -q HEAD)"
|
||||
version="v$(jq -r .version package.json)"
|
||||
repo="$1"
|
||||
|
||||
if [ -z "$repo" ]; then
|
||||
echo "ERROR: must specify repository"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "=== debug info ==="
|
||||
echo "branch: $branch_name"
|
||||
echo "version: $version"
|
||||
echo "repo: $repo"
|
||||
echo "=================="
|
||||
echo ""
|
||||
|
||||
# Check that the version doesn't exist yet
|
||||
version_exists="$(curl -s https://api.github.com/repos/"$repo"/tags -H "Accept: application/vnd.github.v3.full+json" | jq -r '.[] | select(.name == "'"$version"'") | .name')"
|
||||
if [ -n "$version_exists" ]; then
|
||||
echo "ERROR: version $version already exists"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git checkout -B test/"$branch_name"/releases/"$version"
|
||||
|
||||
npm install
|
||||
npm run build
|
||||
npm test
|
||||
npm run pack
|
||||
|
||||
# Add dist/ to git and commit it
|
||||
sed -i 's/dist/!dist/g' .gitignore
|
||||
git add dist
|
||||
git commit -a -m "Add production dependencies & build"
|
||||
4521
dist/index.js
vendored
Normal file
4521
dist/index.js
vendored
Normal file
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.
140
lib/installer.js
generated
Normal file
140
lib/installer.js
generated
Normal file
@@ -0,0 +1,140 @@
|
||||
"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 __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 });
|
||||
const core = __importStar(require("@actions/core"));
|
||||
const exec = __importStar(require("@actions/exec"));
|
||||
const tc = __importStar(require("@actions/tool-cache"));
|
||||
const os = __importStar(require("os"));
|
||||
const path = __importStar(require("path"));
|
||||
const semver = __importStar(require("semver"));
|
||||
// Store information about the environment
|
||||
const osPlat = os.platform(); // possible values: win32 (Windows), linux (Linux), darwin (macOS)
|
||||
core.debug(`platform: ${osPlat}`);
|
||||
// This is temporary until we have a better way of fetching releases (see #1, #4 for details)
|
||||
exports.juliaVersions = ['v1.5.0-beta1', 'v1.4.2', 'v1.4.1', 'v1.4.0', 'v1.4.0-rc2', 'v1.4.0-rc1', 'v1.3.1', 'v1.3.0', 'v1.3.0-rc5', 'v1.3.0-rc4', 'v1.3.0-rc3', 'v1.3.0-rc2', 'v1.0.5', 'v1.2.0', 'v1.3.0-rc1', 'v1.2.0-rc3', 'v1.3.0-alpha', 'v1.2.0-rc2', 'v1.2.0-rc1', 'v1.1.1', 'v1.0.4', 'v1.1.0', 'v1.1.0-rc2', 'v1.1.0-rc1', 'v1.0.3', 'v1.0.2', 'v1.0.1', 'v1.0.0', 'v0.7.0', 'v1.0.0-rc1', 'v0.7.0-rc3', 'v0.7.0-rc2', 'v0.7.0-rc1', 'v0.7.0-beta2', 'v0.6.4', 'v0.7.0-beta', 'v0.7.0-alpha', 'v0.6.3', 'v0.6.2', 'v0.6.1', 'v0.6.0', 'v0.6.0-rc3', 'v0.6.0-rc2', 'v0.5.2', 'v0.6.0-rc1', 'v0.6.0-pre.beta', 'v0.5.1', 'v0.6.0-pre.alpha', 'v0.5.0', 'v0.4.7', 'v0.5.0-rc4', 'v0.5.0-rc3', 'v0.5.0-rc2', 'v0.5.0-rc1', 'v0.5.0-rc0', 'v0.4.6', 'v0.4.5', 'v0.4.4', 'v0.4.3', 'v0.4.2', 'v0.4.1', 'v0.3.12', 'v0.4.0', 'v0.4.0-rc4', 'v0.4.0-rc3', 'v0.4.0-rc2', 'v0.4.0-rc1', 'v0.3.11', 'v0.3.10', 'v0.3.9', 'v0.3.8', 'v0.3.7', 'v0.3.6', 'v0.3.5', 'v0.3.4', 'v0.3.3', 'v0.3.2', 'v0.3.1', 'v0.3.0', 'v0.3.0-rc4', 'v0.3.0-rc3', 'v0.3.0-rc2', 'v0.3.0-rc1', 'v0.2.0-rc1', 'v0.2.0-rc3', 'v0.2.0-rc4', 'v0.2.0', 'v0.2.0-rc2'];
|
||||
function getJuliaVersion(availableReleases, versionInput) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
if (semver.valid(versionInput) == versionInput) {
|
||||
// versionInput is a valid version, use it directly
|
||||
return versionInput;
|
||||
}
|
||||
// nightlies
|
||||
if (versionInput == 'nightly') {
|
||||
return 'nightly';
|
||||
}
|
||||
// Use the highest available version that matches versionInput
|
||||
let version = semver.maxSatisfying(availableReleases, versionInput);
|
||||
if (version == null) {
|
||||
throw `Could not find a Julia version that matches ${versionInput}`;
|
||||
}
|
||||
// GitHub tags start with v, remove it
|
||||
version = version.replace(/^v/, '');
|
||||
return version;
|
||||
});
|
||||
}
|
||||
exports.getJuliaVersion = getJuliaVersion;
|
||||
function getMajorMinorVersion(version) {
|
||||
return version.split('.').slice(0, 2).join('.');
|
||||
}
|
||||
function getDownloadURL(version, arch) {
|
||||
let platform;
|
||||
if (osPlat === 'win32') { // Windows
|
||||
platform = 'winnt';
|
||||
}
|
||||
else if (osPlat === 'darwin') { // macOS
|
||||
if (arch == 'x86') {
|
||||
throw '32-bit Julia is not available on macOS';
|
||||
}
|
||||
platform = 'mac';
|
||||
}
|
||||
else if (osPlat === 'linux') { // Linux
|
||||
platform = 'linux';
|
||||
}
|
||||
else {
|
||||
throw `Platform ${osPlat} is not supported`;
|
||||
}
|
||||
// nightlies
|
||||
if (version == 'nightly') {
|
||||
const baseURL = 'https://julialangnightlies-s3.julialang.org/bin';
|
||||
return `${baseURL}/${platform}/${arch}/${getFileName('latest', arch)}`;
|
||||
}
|
||||
// normal versions
|
||||
const baseURL = 'https://julialang-s3.julialang.org/bin';
|
||||
const versionDir = getMajorMinorVersion(version);
|
||||
return `${baseURL}/${platform}/${arch}/${versionDir}/${getFileName(version, arch)}`;
|
||||
}
|
||||
function getFileName(version, arch) {
|
||||
let versionExt, ext;
|
||||
if (osPlat === 'win32') { // Windows
|
||||
versionExt = arch == 'x64' ? '-win64' : '-win32';
|
||||
ext = 'exe';
|
||||
}
|
||||
else if (osPlat === 'darwin') { // macOS
|
||||
if (arch == 'x86') {
|
||||
throw '32-bit Julia is not available on macOS';
|
||||
}
|
||||
versionExt = '-mac64';
|
||||
ext = 'dmg';
|
||||
}
|
||||
else if (osPlat === 'linux') { // Linux
|
||||
if (version == 'latest') { // nightly version
|
||||
versionExt = arch == 'x64' ? '-linux64' : '-linux32';
|
||||
}
|
||||
else {
|
||||
versionExt = arch == 'x64' ? '-linux-x86_64' : '-linux-i686';
|
||||
}
|
||||
ext = 'tar.gz';
|
||||
}
|
||||
else {
|
||||
throw `Platform ${osPlat} is not supported`;
|
||||
}
|
||||
return `julia-${version}${versionExt}.${ext}`;
|
||||
}
|
||||
function installJulia(version, arch) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
// Download Julia
|
||||
const downloadURL = getDownloadURL(version, arch);
|
||||
core.debug(`downloading Julia from ${downloadURL}`);
|
||||
const juliaDownloadPath = yield tc.downloadTool(downloadURL);
|
||||
// Install it
|
||||
switch (osPlat) {
|
||||
case 'linux':
|
||||
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
||||
yield exec.exec('mkdir', [`${process.env.HOME}/julia`]);
|
||||
yield exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', `${process.env.HOME}/julia`]);
|
||||
return `${process.env.HOME}/julia`;
|
||||
case 'win32':
|
||||
const juliaInstallationPath = path.join('C:', 'Julia');
|
||||
if (version == '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=${juliaInstallationPath}" -NoNewWindow -Wait`]);
|
||||
}
|
||||
else {
|
||||
yield exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/S /D=${juliaInstallationPath}" -NoNewWindow -Wait`]);
|
||||
}
|
||||
return juliaInstallationPath;
|
||||
case 'darwin':
|
||||
yield exec.exec('hdiutil', ['attach', juliaDownloadPath]);
|
||||
yield exec.exec('mkdir', [`${process.env.HOME}/julia`]);
|
||||
yield exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${process.env.HOME}`]);
|
||||
return `${process.env.HOME}/julia`;
|
||||
default:
|
||||
throw `Platform ${osPlat} is not supported`;
|
||||
}
|
||||
});
|
||||
}
|
||||
exports.installJulia = installJulia;
|
||||
95
lib/setup-julia.js
generated
95
lib/setup-julia.js
generated
@@ -18,84 +18,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const core = __importStar(require("@actions/core"));
|
||||
const exec = __importStar(require("@actions/exec"));
|
||||
const tc = __importStar(require("@actions/tool-cache"));
|
||||
const os = __importStar(require("os"));
|
||||
const path = __importStar(require("path"));
|
||||
// Store information about the environment
|
||||
const osPlat = os.platform(); // possible values: win32 (Windows), linux (Linux), darwin (macOS)
|
||||
core.debug(`platform: ${osPlat}`);
|
||||
function getMajorMinorVersion(version) {
|
||||
return version.split('.').slice(0, 2).join('.');
|
||||
}
|
||||
function getDownloadURL(version) {
|
||||
const baseURL = 'https://julialang-s3.julialang.org/bin';
|
||||
let platform, arch;
|
||||
const versionDir = getMajorMinorVersion(version);
|
||||
if (osPlat === 'win32') { // Windows
|
||||
platform = 'winnt';
|
||||
arch = 'x64';
|
||||
}
|
||||
else if (osPlat === 'darwin') { // macOS
|
||||
platform = 'mac';
|
||||
arch = 'x64';
|
||||
}
|
||||
else if (osPlat === 'linux') { // Linux
|
||||
platform = 'linux';
|
||||
arch = 'x64';
|
||||
}
|
||||
else {
|
||||
throw `Platform ${osPlat} is not supported`;
|
||||
}
|
||||
return `${baseURL}/${platform}/${arch}/${versionDir}/${getFileName(version)}`;
|
||||
}
|
||||
function getFileName(version) {
|
||||
let versionExt, ext;
|
||||
if (osPlat === 'win32') { // Windows
|
||||
versionExt = '-win64';
|
||||
ext = 'exe';
|
||||
}
|
||||
else if (osPlat === 'darwin') { // macOS
|
||||
versionExt = '-mac64';
|
||||
ext = 'dmg';
|
||||
}
|
||||
else if (osPlat === 'linux') { // Linux
|
||||
versionExt = '-linux-x86_64';
|
||||
ext = 'tar.gz';
|
||||
}
|
||||
else {
|
||||
throw `Platform ${osPlat} is not supported`;
|
||||
}
|
||||
return `julia-${version}${versionExt}.${ext}`;
|
||||
}
|
||||
const installer = __importStar(require("./installer"));
|
||||
function run() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
try {
|
||||
const version = core.getInput('version');
|
||||
core.debug(`selected Julia version: ${version}`);
|
||||
// Download Julia
|
||||
const downloadURL = getDownloadURL(version);
|
||||
core.debug(`download Julia from ${downloadURL}`);
|
||||
const juliaDownloadPath = yield tc.downloadTool(downloadURL);
|
||||
// Install Julia
|
||||
if (osPlat === 'linux') { // Linux
|
||||
const juliaExtractedFolder = yield tc.extractTar(juliaDownloadPath);
|
||||
const juliaCachedPath = yield tc.cacheDir(juliaExtractedFolder, 'julia', version);
|
||||
const juliaPath = path.join(juliaCachedPath, `julia-${version}`);
|
||||
core.addPath(path.join(juliaPath, 'bin'));
|
||||
const versionInput = core.getInput('version');
|
||||
const arch = core.getInput('arch');
|
||||
const availableReleases = installer.juliaVersions;
|
||||
const version = yield installer.getJuliaVersion(availableReleases, versionInput);
|
||||
core.debug(`selected Julia version: ${arch}/${version}`);
|
||||
// Search in cache
|
||||
let juliaPath;
|
||||
juliaPath = tc.find('julia', version, arch);
|
||||
if (!juliaPath) {
|
||||
core.debug(`could not find Julia ${version} in cache`);
|
||||
const juliaInstallationPath = yield installer.installJulia(version, arch);
|
||||
// Add it to cache
|
||||
juliaPath = yield tc.cacheDir(juliaInstallationPath, 'julia', version, arch);
|
||||
core.debug(`added Julia to cache: ${juliaPath}`);
|
||||
}
|
||||
else if (osPlat === 'win32') { // Windows
|
||||
// Install Julia in C:\Julia
|
||||
const juliaInstallationPath = path.join('C:', 'Julia');
|
||||
yield exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/S /D=${juliaInstallationPath}" -NoNewWindow -Wait`]);
|
||||
const juliaCachedPath = yield tc.cacheDir(juliaInstallationPath, 'julia', version);
|
||||
core.addPath(path.join(juliaCachedPath, 'bin'));
|
||||
else {
|
||||
core.debug(`using cached version of Julia: ${juliaPath}`);
|
||||
}
|
||||
else if (osPlat === 'darwin') { // macOS
|
||||
yield exec.exec('hdiutil', ['attach', juliaDownloadPath]);
|
||||
const juliaCachedPath = yield tc.cacheDir(`/Volumes/Julia-${version}/Julia-${getMajorMinorVersion(version)}.app/Contents/Resources/julia`, 'julia', version);
|
||||
core.addPath(path.join(juliaCachedPath, 'bin'));
|
||||
// Add it to PATH
|
||||
core.addPath(path.join(juliaPath, 'bin'));
|
||||
// Test if Julia has been installed
|
||||
exec.exec('julia', ['--version']);
|
||||
// If enabled, also show the full version info
|
||||
if (core.getInput('show-versioninfo') == 'true') {
|
||||
exec.exec('julia', ['-e', 'using InteractiveUtils; versioninfo()']);
|
||||
}
|
||||
// Test if Julia has been installed by showing versioninfo()
|
||||
yield exec.exec('julia', ['-e', 'using InteractiveUtils; versioninfo()']);
|
||||
}
|
||||
catch (error) {
|
||||
core.setFailed(error.message);
|
||||
|
||||
3648
package-lock.json
generated
3648
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
15
package.json
15
package.json
@@ -1,13 +1,12 @@
|
||||
{
|
||||
"name": "setup-julia",
|
||||
"version": "0.1.0",
|
||||
"version": "1.1.7",
|
||||
"private": true,
|
||||
"description": "setup Julia action",
|
||||
"main": "lib/setup-julia.js",
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"format": "prettier --single-quote --print-width 120 --tab-width 4 --no-semi --write **/*.ts",
|
||||
"format-check": "prettier --single-quote --print-width 120 --tab-width 4 --no-semi --check **/*.ts",
|
||||
"pack": "ncc build",
|
||||
"test": "jest"
|
||||
},
|
||||
"repository": {
|
||||
@@ -23,20 +22,20 @@
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.0.0",
|
||||
"@actions/io": "^1.0.0",
|
||||
"@actions/exec": "^1.0.0",
|
||||
"@actions/github": "^1.0.0",
|
||||
"@actions/io": "^1.0.0",
|
||||
"@actions/tool-cache": "^1.0.0",
|
||||
"semver": "^6.1.1"
|
||||
"semver": "^6.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^24.0.13",
|
||||
"@types/node": "^12.0.4",
|
||||
"@types/node": "^12.12.7",
|
||||
"@types/semver": "^6.0.0",
|
||||
"@zeit/ncc": "^0.22.0",
|
||||
"jest": "^24.8.0",
|
||||
"jest-circus": "^24.7.1",
|
||||
"prettier": "^1.17.1",
|
||||
"ts-jest": "^24.0.2",
|
||||
"ts-jest": "^26.0.0",
|
||||
"typescript": "^3.5.1"
|
||||
}
|
||||
}
|
||||
|
||||
129
src/installer.ts
Normal file
129
src/installer.ts
Normal file
@@ -0,0 +1,129 @@
|
||||
import * as core from '@actions/core'
|
||||
import * as exec from '@actions/exec'
|
||||
import * as tc from '@actions/tool-cache'
|
||||
|
||||
import * as os from 'os'
|
||||
import * as path from 'path'
|
||||
|
||||
import * as semver from 'semver'
|
||||
|
||||
// Store information about the environment
|
||||
const osPlat = os.platform() // possible values: win32 (Windows), linux (Linux), darwin (macOS)
|
||||
core.debug(`platform: ${osPlat}`)
|
||||
|
||||
// This is temporary until we have a better way of fetching releases (see #1, #4 for details)
|
||||
export const juliaVersions = ['v1.5.0-beta1', 'v1.4.2', 'v1.4.1', 'v1.4.0', 'v1.4.0-rc2', 'v1.4.0-rc1', 'v1.3.1', 'v1.3.0', 'v1.3.0-rc5', 'v1.3.0-rc4', 'v1.3.0-rc3', 'v1.3.0-rc2', 'v1.0.5', 'v1.2.0', 'v1.3.0-rc1', 'v1.2.0-rc3', 'v1.3.0-alpha', 'v1.2.0-rc2', 'v1.2.0-rc1', 'v1.1.1', 'v1.0.4', 'v1.1.0', 'v1.1.0-rc2', 'v1.1.0-rc1', 'v1.0.3', 'v1.0.2', 'v1.0.1', 'v1.0.0', 'v0.7.0', 'v1.0.0-rc1', 'v0.7.0-rc3', 'v0.7.0-rc2', 'v0.7.0-rc1', 'v0.7.0-beta2', 'v0.6.4', 'v0.7.0-beta', 'v0.7.0-alpha', 'v0.6.3', 'v0.6.2', 'v0.6.1', 'v0.6.0', 'v0.6.0-rc3', 'v0.6.0-rc2', 'v0.5.2', 'v0.6.0-rc1', 'v0.6.0-pre.beta', 'v0.5.1', 'v0.6.0-pre.alpha', 'v0.5.0', 'v0.4.7', 'v0.5.0-rc4', 'v0.5.0-rc3', 'v0.5.0-rc2', 'v0.5.0-rc1', 'v0.5.0-rc0', 'v0.4.6', 'v0.4.5', 'v0.4.4', 'v0.4.3', 'v0.4.2', 'v0.4.1', 'v0.3.12', 'v0.4.0', 'v0.4.0-rc4', 'v0.4.0-rc3', 'v0.4.0-rc2', 'v0.4.0-rc1', 'v0.3.11', 'v0.3.10', 'v0.3.9', 'v0.3.8', 'v0.3.7', 'v0.3.6', 'v0.3.5', 'v0.3.4', 'v0.3.3', 'v0.3.2', 'v0.3.1', 'v0.3.0', 'v0.3.0-rc4', 'v0.3.0-rc3', 'v0.3.0-rc2', 'v0.3.0-rc1', 'v0.2.0-rc1', 'v0.2.0-rc3', 'v0.2.0-rc4', 'v0.2.0', 'v0.2.0-rc2']
|
||||
|
||||
export async function getJuliaVersion(availableReleases: string[], versionInput: string): Promise<string> {
|
||||
if (semver.valid(versionInput) == versionInput) {
|
||||
// versionInput is a valid version, use it directly
|
||||
return versionInput
|
||||
}
|
||||
|
||||
// nightlies
|
||||
if (versionInput == 'nightly') {
|
||||
return 'nightly'
|
||||
}
|
||||
|
||||
// Use the highest available version that matches versionInput
|
||||
let version = semver.maxSatisfying(availableReleases, versionInput)
|
||||
if (version == null) {
|
||||
throw `Could not find a Julia version that matches ${versionInput}`
|
||||
}
|
||||
|
||||
// GitHub tags start with v, remove it
|
||||
version = version.replace(/^v/, '')
|
||||
|
||||
return version
|
||||
}
|
||||
|
||||
function getMajorMinorVersion(version: string): string {
|
||||
return version.split('.').slice(0, 2).join('.')
|
||||
}
|
||||
|
||||
function getDownloadURL(version: string, arch: string): string {
|
||||
let platform: string
|
||||
|
||||
if (osPlat === 'win32') { // Windows
|
||||
platform = 'winnt'
|
||||
} else if (osPlat === 'darwin') { // macOS
|
||||
if (arch == 'x86') {
|
||||
throw '32-bit Julia is not available on macOS'
|
||||
}
|
||||
platform = 'mac'
|
||||
} else if (osPlat === 'linux') { // Linux
|
||||
platform = 'linux'
|
||||
} else {
|
||||
throw `Platform ${osPlat} is not supported`
|
||||
}
|
||||
|
||||
// nightlies
|
||||
if (version == 'nightly') {
|
||||
const baseURL = 'https://julialangnightlies-s3.julialang.org/bin'
|
||||
return `${baseURL}/${platform}/${arch}/${getFileName('latest', arch)}`
|
||||
}
|
||||
|
||||
// normal versions
|
||||
const baseURL = 'https://julialang-s3.julialang.org/bin'
|
||||
const versionDir = getMajorMinorVersion(version)
|
||||
|
||||
return `${baseURL}/${platform}/${arch}/${versionDir}/${getFileName(version, arch)}`
|
||||
}
|
||||
|
||||
function getFileName(version: string, arch: string): string {
|
||||
let versionExt: string, ext: string
|
||||
|
||||
if (osPlat === 'win32') { // Windows
|
||||
versionExt = arch == 'x64' ? '-win64' : '-win32'
|
||||
ext = 'exe'
|
||||
} else if (osPlat === 'darwin') { // macOS
|
||||
if (arch == 'x86') {
|
||||
throw '32-bit Julia is not available on macOS'
|
||||
}
|
||||
versionExt = '-mac64'
|
||||
ext = 'dmg'
|
||||
} else if (osPlat === 'linux') { // Linux
|
||||
if (version == 'latest') { // nightly version
|
||||
versionExt = arch == 'x64' ? '-linux64' : '-linux32'
|
||||
} else {
|
||||
versionExt = arch == 'x64' ? '-linux-x86_64' : '-linux-i686'
|
||||
}
|
||||
ext = 'tar.gz'
|
||||
} else {
|
||||
throw `Platform ${osPlat} is not supported`
|
||||
}
|
||||
|
||||
return `julia-${version}${versionExt}.${ext}`
|
||||
}
|
||||
|
||||
export async function installJulia(version: string, arch: string): Promise<string> {
|
||||
// Download Julia
|
||||
const downloadURL = getDownloadURL(version, arch)
|
||||
core.debug(`downloading Julia from ${downloadURL}`)
|
||||
const juliaDownloadPath = await tc.downloadTool(downloadURL)
|
||||
|
||||
// Install it
|
||||
switch (osPlat) {
|
||||
case 'linux':
|
||||
// tc.extractTar doesn't support stripping components, so we have to call tar manually
|
||||
await exec.exec('mkdir', [`${process.env.HOME}/julia`])
|
||||
await exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', `${process.env.HOME}/julia`])
|
||||
return `${process.env.HOME}/julia`
|
||||
case 'win32':
|
||||
const juliaInstallationPath = path.join('C:', 'Julia')
|
||||
if (version == '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=${juliaInstallationPath}" -NoNewWindow -Wait`])
|
||||
} else {
|
||||
await exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/S /D=${juliaInstallationPath}" -NoNewWindow -Wait`])
|
||||
}
|
||||
return juliaInstallationPath
|
||||
case 'darwin':
|
||||
await exec.exec('hdiutil', ['attach', juliaDownloadPath])
|
||||
await exec.exec('mkdir', [`${process.env.HOME}/julia`])
|
||||
await exec.exec('/bin/bash', ['-c', `cp -a /Volumes/Julia-*/Julia-*.app/Contents/Resources/julia ${process.env.HOME}`])
|
||||
return `${process.env.HOME}/julia`
|
||||
default:
|
||||
throw `Platform ${osPlat} is not supported`
|
||||
}
|
||||
}
|
||||
@@ -2,89 +2,43 @@ import * as core from '@actions/core'
|
||||
import * as exec from '@actions/exec'
|
||||
import * as tc from '@actions/tool-cache'
|
||||
|
||||
import * as os from 'os'
|
||||
import * as path from 'path'
|
||||
|
||||
// Store information about the environment
|
||||
const osPlat = os.platform() // possible values: win32 (Windows), linux (Linux), darwin (macOS)
|
||||
core.debug(`platform: ${osPlat}`)
|
||||
|
||||
function getMajorMinorVersion(version: string): string {
|
||||
return version.split('.').slice(0, 2).join('.')
|
||||
}
|
||||
|
||||
function getDownloadURL(version: string): string {
|
||||
const baseURL = 'https://julialang-s3.julialang.org/bin'
|
||||
let platform: string, arch: string
|
||||
const versionDir = getMajorMinorVersion(version)
|
||||
|
||||
if (osPlat === 'win32') { // Windows
|
||||
platform = 'winnt'
|
||||
arch = 'x64'
|
||||
} else if (osPlat === 'darwin') { // macOS
|
||||
platform = 'mac'
|
||||
arch = 'x64'
|
||||
} else if (osPlat === 'linux') { // Linux
|
||||
platform = 'linux'
|
||||
arch = 'x64'
|
||||
} else {
|
||||
throw `Platform ${osPlat} is not supported`
|
||||
}
|
||||
|
||||
return `${baseURL}/${platform}/${arch}/${versionDir}/${getFileName(version)}`
|
||||
}
|
||||
|
||||
function getFileName(version: string): string {
|
||||
let versionExt: string, ext: string
|
||||
|
||||
if (osPlat === 'win32') { // Windows
|
||||
versionExt = '-win64'
|
||||
ext = 'exe'
|
||||
} else if (osPlat === 'darwin') { // macOS
|
||||
versionExt = '-mac64'
|
||||
ext = 'dmg'
|
||||
} else if (osPlat === 'linux') { // Linux
|
||||
versionExt = '-linux-x86_64'
|
||||
ext = 'tar.gz'
|
||||
} else {
|
||||
throw `Platform ${osPlat} is not supported`
|
||||
}
|
||||
|
||||
return `julia-${version}${versionExt}.${ext}`
|
||||
}
|
||||
import * as installer from './installer'
|
||||
|
||||
async function run() {
|
||||
try {
|
||||
const version = core.getInput('version')
|
||||
core.debug(`selected Julia version: ${version}`)
|
||||
const versionInput = core.getInput('version')
|
||||
const arch = core.getInput('arch')
|
||||
const availableReleases = installer.juliaVersions
|
||||
const version = await installer.getJuliaVersion(availableReleases, versionInput)
|
||||
core.debug(`selected Julia version: ${arch}/${version}`)
|
||||
|
||||
// Download Julia
|
||||
const downloadURL = getDownloadURL(version)
|
||||
core.debug(`download Julia from ${downloadURL}`)
|
||||
const juliaDownloadPath = await tc.downloadTool(downloadURL)
|
||||
// Search in cache
|
||||
let juliaPath: string;
|
||||
juliaPath = tc.find('julia', version, arch)
|
||||
|
||||
// Install Julia
|
||||
if (osPlat === 'linux') { // Linux
|
||||
const juliaExtractedFolder = await tc.extractTar(juliaDownloadPath)
|
||||
const juliaCachedPath = await tc.cacheDir(juliaExtractedFolder, 'julia', version)
|
||||
const juliaPath = path.join(juliaCachedPath, `julia-${version}`)
|
||||
core.addPath(path.join(juliaPath, 'bin'))
|
||||
|
||||
} else if (osPlat === 'win32') { // Windows
|
||||
// Install Julia in C:\Julia
|
||||
const juliaInstallationPath = path.join('C:', 'Julia')
|
||||
await exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/S /D=${juliaInstallationPath}" -NoNewWindow -Wait`])
|
||||
const juliaCachedPath = await tc.cacheDir(juliaInstallationPath, 'julia', version)
|
||||
core.addPath(path.join(juliaCachedPath, 'bin'))
|
||||
|
||||
} else if (osPlat === 'darwin') { // macOS
|
||||
await exec.exec('hdiutil', ['attach', juliaDownloadPath])
|
||||
const juliaCachedPath = await tc.cacheDir(`/Volumes/Julia-${version}/Julia-${getMajorMinorVersion(version)}.app/Contents/Resources/julia`, 'julia', version)
|
||||
core.addPath(path.join(juliaCachedPath, 'bin'))
|
||||
if (!juliaPath) {
|
||||
core.debug(`could not find Julia ${version} in cache`)
|
||||
const juliaInstallationPath = await installer.installJulia(version, arch);
|
||||
|
||||
// Add it to cache
|
||||
juliaPath = await tc.cacheDir(juliaInstallationPath, 'julia', version, arch)
|
||||
core.debug(`added Julia to cache: ${juliaPath}`)
|
||||
} else {
|
||||
core.debug(`using cached version of Julia: ${juliaPath}`)
|
||||
}
|
||||
|
||||
// Test if Julia has been installed by showing versioninfo()
|
||||
await exec.exec('julia', ['-e', 'using InteractiveUtils; versioninfo()'])
|
||||
// Add it to PATH
|
||||
core.addPath(path.join(juliaPath, 'bin'))
|
||||
|
||||
// Test if Julia has been installed
|
||||
exec.exec('julia', ['--version'])
|
||||
|
||||
// If enabled, also show the full version info
|
||||
if (core.getInput('show-versioninfo') == 'true') {
|
||||
exec.exec('julia', ['-e', 'using InteractiveUtils; versioninfo()'])
|
||||
}
|
||||
} catch (error) {
|
||||
core.setFailed(error.message)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user