Compare commits

...

5 Commits

Author SHA1 Message Date
Sascha Mann
27ff99664b Add production dependencies & build 2021-01-08 11:14:58 +01:00
Sascha Mann
6c3c1efae0 Bump version 2021-01-08 11:12:56 +01:00
Sascha Mann
531b2e0973 Support release nightlies (#63)
* Support release nightlies

See #62

* Replace == nightly with endsWith nightly

* Use majorMinorMatch, not full match

* Replace more (in-)equality checks

* Reduce number of duplicate CI builds

* Add example to docs

* Tidy up nightly conditions
2021-01-07 23:09:50 -05:00
Sascha Mann
66addd1b2f Don't print version twice if show-versioninfo is enabled 2021-01-03 13:42:52 +01:00
Sascha Mann
3ff0592a25 Use --compile=min -O0 flags for versioninfo
Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com>
2021-01-03 13:42:52 +01:00
12 changed files with 4856 additions and 38 deletions

View File

@@ -2,6 +2,7 @@ name: Example builds (nightly)
on:
push:
branches: ['main', 'master', 'releases/*']
pull_request:
schedule:
- cron: '37 17 * * *'
@@ -12,6 +13,7 @@ jobs:
strategy:
fail-fast: false
matrix:
julia-version: [nightly, 1.6-nightly]
julia-arch: [x64, x86]
os: [ubuntu-latest, macOS-latest, windows-latest]
# 32-bit Julia binaries are not available on macOS
@@ -28,10 +30,10 @@ jobs:
npm run build
npm run pack
- name: "Set up Julia (nightly)"
- name: "Set up Julia (${{ matrix.julia-version }})"
uses: ./
with:
version: nightly
version: ${{ matrix.julia-version }}
arch: ${{ matrix.julia-arch }}
show-versioninfo: 'true'
- run: julia --version

View File

@@ -1,6 +1,9 @@
name: Example builds
on: [push, pull_request]
on:
push:
branches: ['main', 'master', 'releases/*']
pull_request:
jobs:
test:

2
.gitignore vendored
View File

@@ -1,3 +1,3 @@
node_modules/
__tests__/runner/*
dist/
!dist/

View File

@@ -93,6 +93,7 @@ You can either specify specific Julia versions or version ranges. If you specify
- `^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. It matches all versions `≥ 1.3.0-` and `< 1.4.0`.
- `nightly` will install the latest nightly build.
- `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).

4803
dist/index.js vendored Normal file

File diff suppressed because it is too large Load Diff

BIN
dist/unzip vendored Normal file

Binary file not shown.

23
lib/installer.js generated
View File

@@ -78,14 +78,10 @@ function getJuliaVersions(versionInfo) {
}
exports.getJuliaVersions = getJuliaVersions;
function getJuliaVersion(availableReleases, versionInput) {
if (semver.valid(versionInput) == versionInput) {
// versionInput is a valid version, use it directly
if (semver.valid(versionInput) == versionInput || versionInput.endsWith('nightly')) {
// versionInput is a valid version or a nightly 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) {
@@ -119,7 +115,7 @@ function getNightlyFileName(arch) {
return `julia-latest${versionExt}.${ext}`;
}
function getFileInfo(versionInfo, version, arch) {
if (version == 'nightly') {
if (version.endsWith('nightly')) {
return null;
}
for (let file of versionInfo[version].files) {
@@ -131,10 +127,15 @@ function getFileInfo(versionInfo, version, arch) {
}
exports.getFileInfo = getFileInfo;
function getDownloadURL(fileInfo, version, arch) {
const baseURL = `https://julialangnightlies-s3.julialang.org/bin/${osMap[osPlat]}/${arch}`;
// release branch nightlies, e.g. 1.6-nightlies should return .../bin/linux/x64/1.6/julia-latest-linux64.tar.gz
const majorMinorMatches = /^(\d*.\d*)-nightly/.exec(version);
if (majorMinorMatches) {
return `${baseURL}/${majorMinorMatches[1]}/${getNightlyFileName(arch)}`;
}
// nightlies
if (version == 'nightly') {
const baseURL = 'https://julialangnightlies-s3.julialang.org/bin';
return `${baseURL}/${osMap[osPlat]}/${arch}/${getNightlyFileName(arch)}`;
return `${baseURL}/${getNightlyFileName(arch)}`;
}
return fileInfo.url;
}
@@ -147,7 +148,7 @@ function installJulia(versionInfo, version, arch) {
core.debug(`downloading Julia from ${downloadURL}`);
const juliaDownloadPath = yield tc.downloadTool(downloadURL);
// Verify checksum
if (version != 'nightly') {
if (!version.endsWith('nightly')) {
const checkSum = yield calculateChecksum(juliaDownloadPath);
if (fileInfo.sha256 != checkSum) {
throw new Error(`Checksum of downloaded file does not match the expected checksum from versions.json.\nExpected: ${fileInfo.sha256}\nGot: ${checkSum}`);
@@ -165,7 +166,7 @@ function installJulia(versionInfo, version, arch) {
yield exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', tempInstallDir]);
return tempInstallDir;
case 'win32':
if (version == 'nightly' || semver.gtr(version, '1.3', { includePrerelease: true })) {
if (version.endsWith('nightly') || semver.gtr(version, '1.3', { includePrerelease: true })) {
// The installer changed in 1.4: https://github.com/JuliaLang/julia/blob/ef0c9108b12f3ae177c51037934351ffa703b0b5/NEWS.md#build-system-changes
yield exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/SILENT /dir=${path.join(process.cwd(), tempInstallDir)}" -NoNewWindow -Wait`]);
}

12
lib/setup-julia.js generated
View File

@@ -78,11 +78,15 @@ function run() {
core.addPath(path.join(juliaPath, 'bin'));
// Set output
core.setOutput('julia-bindir', path.join(juliaPath, 'bin'));
// Test if Julia has been installed
exec.exec('julia', ['--version']);
// If enabled, also show the full version info
// Test if Julia has been installed and print the version
if (core.getInput('show-versioninfo') == 'true') {
exec.exec('julia', ['-e', 'using InteractiveUtils; versioninfo()']);
// 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) {

2
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{
"name": "setup-julia",
"version": "1.5.0",
"version": "1.5.2",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "setup-julia",
"version": "1.5.0",
"version": "1.5.2",
"private": true,
"description": "setup Julia action",
"main": "lib/setup-julia.js",

View File

@@ -66,16 +66,11 @@ export async function getJuliaVersions(versionInfo): Promise<string[]> {
}
export function getJuliaVersion(availableReleases: string[], versionInput: string): string {
if (semver.valid(versionInput) == versionInput) {
// versionInput is a valid version, use it directly
if (semver.valid(versionInput) == versionInput || versionInput.endsWith('nightly')) {
// versionInput is a valid version or a nightly 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) {
@@ -111,7 +106,7 @@ function getNightlyFileName(arch: string): string {
}
export function getFileInfo(versionInfo, version: string, arch: string) {
if (version == 'nightly') {
if (version.endsWith('nightly')) {
return null
}
@@ -125,10 +120,17 @@ export function getFileInfo(versionInfo, version: string, arch: string) {
}
export function getDownloadURL(fileInfo, version: string, arch: string): string {
const baseURL = `https://julialangnightlies-s3.julialang.org/bin/${osMap[osPlat]}/${arch}`
// release branch nightlies, e.g. 1.6-nightlies should return .../bin/linux/x64/1.6/julia-latest-linux64.tar.gz
const majorMinorMatches = /^(\d*.\d*)-nightly/.exec(version)
if (majorMinorMatches) {
return `${baseURL}/${majorMinorMatches[1]}/${getNightlyFileName(arch)}`
}
// nightlies
if (version == 'nightly') {
const baseURL = 'https://julialangnightlies-s3.julialang.org/bin'
return `${baseURL}/${osMap[osPlat]}/${arch}/${getNightlyFileName(arch)}`
return `${baseURL}/${getNightlyFileName(arch)}`
}
return fileInfo.url
@@ -142,7 +144,7 @@ export async function installJulia(versionInfo, version: string, arch: string):
const juliaDownloadPath = await tc.downloadTool(downloadURL)
// Verify checksum
if (version != 'nightly') {
if (!version.endsWith('nightly')) {
const checkSum = await calculateChecksum(juliaDownloadPath)
if (fileInfo.sha256 != checkSum) {
throw new Error(`Checksum of downloaded file does not match the expected checksum from versions.json.\nExpected: ${fileInfo.sha256}\nGot: ${checkSum}`)
@@ -161,7 +163,7 @@ export async function installJulia(versionInfo, version: string, arch: string):
await exec.exec('tar', ['xf', juliaDownloadPath, '--strip-components=1', '-C', tempInstallDir])
return tempInstallDir
case 'win32':
if (version == 'nightly' || semver.gtr(version, '1.3', {includePrerelease: true})) {
if (version.endsWith('nightly') || semver.gtr(version, '1.3', {includePrerelease: true})) {
// The installer changed in 1.4: https://github.com/JuliaLang/julia/blob/ef0c9108b12f3ae177c51037934351ffa703b0b5/NEWS.md#build-system-changes
await exec.exec('powershell', ['-Command', `Start-Process -FilePath ${juliaDownloadPath} -ArgumentList "/SILENT /dir=${path.join(process.cwd(), tempInstallDir)}" -NoNewWindow -Wait`])
} else {

View File

@@ -73,13 +73,15 @@ async function run() {
// Set output
core.setOutput('julia-bindir', path.join(juliaPath, 'bin'))
// Test if Julia has been installed
exec.exec('julia', ['--version'])
// If enabled, also show the full version info
// Test if Julia has been installed and print the version
if (core.getInput('show-versioninfo') == 'true') {
exec.exec('julia', ['-e', 'using InteractiveUtils; versioninfo()'])
// 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) {
core.setFailed(error.message)