diff --git a/.github/workflows/example-builds-nightly.yml b/.github/workflows/example-builds-nightly.yml index 7f6ba26f..623a9ac9 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 2e4bc86e..50c73864 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 bd8a9706..a5ce6759 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 371360fd..5ca85811 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 ad2cdc34..907bfd71 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 {