From 531b2e09737fe5ec3ca18a56a032f887ba4bbb1c Mon Sep 17 00:00:00 2001 From: Sascha Mann Date: Fri, 8 Jan 2021 05:09:50 +0100 Subject: [PATCH] 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 --- .github/workflows/example-builds-nightly.yml | 6 +++-- .github/workflows/example-builds.yml | 5 +++- README.md | 1 + lib/installer.js | 23 ++++++++--------- src/installer.ts | 26 +++++++++++--------- 5 files changed, 35 insertions(+), 26 deletions(-) diff --git a/.github/workflows/example-builds-nightly.yml b/.github/workflows/example-builds-nightly.yml index 7f6ba26..623a9ac 100644 --- a/.github/workflows/example-builds-nightly.yml +++ b/.github/workflows/example-builds-nightly.yml @@ -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 diff --git a/.github/workflows/example-builds.yml b/.github/workflows/example-builds.yml index 2e4bc86..50c7386 100644 --- a/.github/workflows/example-builds.yml +++ b/.github/workflows/example-builds.yml @@ -1,6 +1,9 @@ name: Example builds -on: [push, pull_request] +on: + push: + branches: ['main', 'master', 'releases/*'] + pull_request: jobs: test: diff --git a/README.md b/README.md index bd8a970..a5ce675 100644 --- a/README.md +++ b/README.md @@ -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). diff --git a/lib/installer.js b/lib/installer.js index 371360f..5ca8581 100644 --- a/lib/installer.js +++ b/lib/installer.js @@ -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`]); } diff --git a/src/installer.ts b/src/installer.ts index ad2cdc3..907bfd7 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -66,16 +66,11 @@ export async function getJuliaVersions(versionInfo): Promise { } 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 {