Compare commits

..

11 Commits
v0.1.0 ... v0.2

Author SHA1 Message Date
Sascha Mann
a072d0b2e4 Fix version in README examples 2019-08-21 16:42:31 +02:00
Sascha Mann
5f6d33bda5 Publish v0.2.0 2019-08-21 16:11:17 +02:00
Sascha Mann
2a0ae40f1c Remove 32-bit ToDo from README 2019-08-21 15:57:08 +02:00
Sascha Mann
295f753b1e Add 32-bit example workflows to README 2019-08-21 15:51:40 +02:00
Sascha Mann
a7c1edc063 Support 32-bit Julia binaries 2019-08-21 15:51:35 +02:00
Sascha Mann
6f01df9c38 Add release checklist 2019-08-17 18:27:44 +02:00
Sascha Mann
a8a77e20fd Use cached Julia if available 2019-08-17 18:05:37 +02:00
Sascha Mann
58832d0813 Add action versioning guidelines to README 2019-08-14 15:21:25 +02:00
Sascha Mann
7ac67b152e Fix typo in description in README 2019-08-14 14:29:38 +02:00
Sascha Mann
c11753280f Add table of contents to README 2019-08-14 14:21:09 +02:00
Sascha Mann
3ebbe69222 Change phrasing of npm warning in README 2019-08-14 13:22:48 +02:00
5 changed files with 207 additions and 69 deletions

View File

@@ -1,6 +1,14 @@
# 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.
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)
- [Versioning](#versioning)
- [Future plans & ideas](#future-plans--ideas)
- [Words of caution](#words-of-caution)
- [Licence info](#licence-info)
## Usage
@@ -13,7 +21,7 @@ Take a look at [github.com/exercism/julia](https://github.com/exercism/julia/pul
```yaml
steps:
- uses: actions/checkout@v1.0.0
- uses: julia-actions/setup-julia@v0.1.0
- uses: julia-actions/setup-julia@v0.2
with:
version: 1.0.4
- run: julia -e 'println("Hello, World!")'
@@ -21,6 +29,8 @@ steps:
### Matrix Testing:
#### 64-bit Julia only
```yaml
jobs:
test:
@@ -33,12 +43,82 @@ jobs:
steps:
- uses: actions/checkout@v1.0.0
- name: "Set up Julia"
uses: julia-actions/setup-julia@v0.1.0
uses: julia-actions/setup-julia@v0.2
with:
version: ${{ matrix.julia-version }}
- run: julia -e 'println("Hello, World!")'
```
#### 32-bit Julia
```yaml
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
julia-version: [1.0.4, 1.1.1, 1.2.0-rc3, 1.3.0-alpha]
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@v0.2
with:
version: ${{ matrix.julia-version }}
arch: ${{ matrix.julia-arch }}
- run: julia -e 'println("Hello, World!")'
```
Alternatively, you can include specific version and OS combinations that will use 32-bit Julia:
```yaml
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
julia-version: [1.0.4, 1.1.1, 1.2.0-rc3, 1.3.0-alpha]
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@v0.2
with:
version: ${{ matrix.julia-version }}
- run: julia -e 'println("Hello, World!")'
```
## Versioning
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.
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.
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.
You can specify commits, branches or tags in your workflows as follows:
```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
```
## Future plans & ideas
In no particular order:
@@ -47,9 +127,8 @@ In no particular order:
* 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.
* Add CI script that checks if tags have been updated on release.
* Hash and signature checks.
### Other Julia-related actions:
@@ -67,7 +146,7 @@ This action will likely be updated quite frequently in the near future. I'm shar
**DO NOT USE THIS AS YOUR ONLY FORM OF CI** (yet).
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.
Unfortunately, because non-container actions must use JavaScript/TypeScript as scripting language, `npm` is involved. The published action only uses the toolkit-dependencies maintained by GitHub but, as usual with `npm`, these load over 50 transitive dependencies. If this causes issues with your security policies, you might want to fork the action, so that you can audit and lock exact versions of all direct and transitive dependencies.
## 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.

View File

@@ -5,6 +5,10 @@ inputs:
version:
description: 'The Julia version to download (if necessary) and use. Example: 1.0.4'
default: '1.0.4'
arch:
description: 'Architecture of the Julia binaries. Defaults to x64.'
required: false
default: 'x64'
runs:
using: 'node12'
main: 'lib/setup-julia.js'

16
docs/release-checklist.md Normal file
View File

@@ -0,0 +1,16 @@
# Release checklist
Version: `1.b.c`
- [x] Create release branch `releases/v1.b.c`
- [x] Unignore `node_modules/` by adding `!` in front in `.gitignore`
- [x] Delete `node_modules/`
- [x] Install production dependencies: `npm install --production`
- [x] Add `node_modules/`: `git add node_modules`
- [x] Commit & push action: `git commit -a -m "Publish v1.b.c."`, then `git push`
- [x] Test the action with an example package
- [x] Create tags
- [x] `v1.b.c` pointing at the last commit in `releases/v1.b.c`
- [x] `latest` pointing at the latest version of the highest major version
- [x] `v1` pointing at the latest `1.x.x` version
- [x] Push tags

View File

@@ -26,39 +26,42 @@ core.debug(`platform: ${osPlat}`);
function getMajorMinorVersion(version) {
return version.split('.').slice(0, 2).join('.');
}
function getDownloadURL(version) {
function getDownloadURL(version, arch) {
const baseURL = 'https://julialang-s3.julialang.org/bin';
let platform, arch;
let platform;
const versionDir = getMajorMinorVersion(version);
if (osPlat === 'win32') { // Windows
platform = 'winnt';
arch = 'x64';
}
else if (osPlat === 'darwin') { // macOS
if (arch == 'x86') {
throw '32-bit Julia is not available on 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)}`;
return `${baseURL}/${platform}/${arch}/${versionDir}/${getFileName(version, arch)}`;
}
function getFileName(version) {
function getFileName(version, arch) {
let versionExt, ext;
if (osPlat === 'win32') { // Windows
versionExt = '-win64';
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
versionExt = '-linux-x86_64';
versionExt = arch == 'x64' ? '-linux-x86_64' : '-linux-i686';
ext = 'tar.gz';
}
else {
@@ -66,34 +69,50 @@ function getFileName(version) {
}
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':
const juliaExtractedFolder = yield tc.extractTar(juliaDownloadPath);
return path.join(juliaExtractedFolder, `julia-${version}`);
case 'win32':
const juliaInstallationPath = path.join('C:', 'Julia');
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]);
return `/Volumes/Julia-${version}/Julia-${getMajorMinorVersion(version)}.app/Contents/Resources/julia`;
default:
throw `Platform ${osPlat} is not supported`;
}
});
}
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 arch = core.getInput('arch');
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 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 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'));
else {
core.debug(`using cached version of Julia: ${juliaPath}`);
}
// Add it to PATH
core.addPath(path.join(juliaPath, 'bin'));
// Test if Julia has been installed by showing versioninfo()
yield exec.exec('julia', ['-e', 'using InteractiveUtils; versioninfo()']);
}

View File

@@ -13,38 +13,41 @@ function getMajorMinorVersion(version: string): string {
return version.split('.').slice(0, 2).join('.')
}
function getDownloadURL(version: string): string {
function getDownloadURL(version: string, arch: string): string {
const baseURL = 'https://julialang-s3.julialang.org/bin'
let platform: string, arch: string
let platform: string
const versionDir = getMajorMinorVersion(version)
if (osPlat === 'win32') { // Windows
platform = 'winnt'
arch = 'x64'
} else if (osPlat === 'darwin') { // macOS
if (arch == 'x86') {
throw '32-bit Julia is not available on 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)}`
return `${baseURL}/${platform}/${arch}/${versionDir}/${getFileName(version, arch)}`
}
function getFileName(version: string): string {
function getFileName(version: string, arch: string): string {
let versionExt: string, ext: string
if (osPlat === 'win32') { // Windows
versionExt = '-win64'
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
versionExt = '-linux-x86_64'
versionExt = arch == 'x64' ? '-linux-x86_64' : '-linux-i686'
ext = 'tar.gz'
} else {
throw `Platform ${osPlat} is not supported`
@@ -53,36 +56,53 @@ function getFileName(version: string): string {
return `julia-${version}${versionExt}.${ext}`
}
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':
const juliaExtractedFolder = await tc.extractTar(juliaDownloadPath)
return path.join(juliaExtractedFolder, `julia-${version}`)
case 'win32':
const juliaInstallationPath = path.join('C:', 'Julia')
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])
return `/Volumes/Julia-${version}/Julia-${getMajorMinorVersion(version)}.app/Contents/Resources/julia`
default:
throw `Platform ${osPlat} is not supported`
}
}
async function run() {
try {
const version = core.getInput('version')
core.debug(`selected Julia version: ${version}`)
const arch = core.getInput('arch')
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 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}`)
}
// Add it to PATH
core.addPath(path.join(juliaPath, 'bin'))
// Test if Julia has been installed by showing versioninfo()
await exec.exec('julia', ['-e', 'using InteractiveUtils; versioninfo()'])
} catch (error) {