Use @actions/tool-cache (#196)

This commit is contained in:
Eric Meadows-Jönsson
2023-05-08 11:40:34 +01:00
committed by GitHub
parent b9783cdeea
commit 51905b8795
13 changed files with 2811 additions and 246 deletions
+2666 -30
View File
File diff suppressed because it is too large Load Diff
-24
View File
@@ -1,24 +0,0 @@
param([Parameter(Mandatory=$true)][string]${VSN}, [Parameter(Mandatory=$true)][string]${HEX_MIRROR})
$ErrorActionPreference="Stop"
Set-Location ${Env:RUNNER_TEMP}
$FILE_INPUT="${VSN}.zip"
$FILE_OUTPUT="elixir.zip"
$DIR_FOR_BIN=".setup-beam/elixir"
$ProgressPreference="SilentlyContinue"
Invoke-WebRequest "${HEX_MIRROR}/builds/elixir/${FILE_INPUT}" -OutFile "${FILE_OUTPUT}"
$ProgressPreference="Continue"
New-Item "${DIR_FOR_BIN}" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue"
Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}"
$ProgressPreference="Continue"
Write-Output "Installed Elixir version follows"
& "${DIR_FOR_BIN}/bin/elixir.bat" "-v" | Write-Output
$ProgressPreference="Continue"
New-Item "%UserProfile%/.mix/escripts" -ItemType Directory | Out-Null
"INSTALL_DIR_FOR_ELIXIR=${Env:RUNNER_TEMP}/${DIR_FOR_BIN}" | Out-File -FilePath ${Env:GITHUB_ENV} -Encoding utf8 -Append
-21
View File
@@ -1,21 +0,0 @@
#!/bin/bash
set -eo pipefail
cd "${RUNNER_TEMP}"
VSN=${1}
HEX_MIRROR=${2}
FILE_INPUT="${VSN}.zip"
FILE_OUTPUT=elixir.zip
DIR_FOR_BIN=.setup-beam/elixir
wget -q -O "${FILE_OUTPUT}" "${HEX_MIRROR}/builds/elixir/${FILE_INPUT}"
mkdir -p "${DIR_FOR_BIN}"
unzip -q -o -d "${DIR_FOR_BIN}" "${FILE_OUTPUT}"
echo "Installed Elixir version follows"
${DIR_FOR_BIN}/bin/elixir -v
mkdir -p "${HOME}/.mix/escripts"
echo "INSTALL_DIR_FOR_ELIXIR=${RUNNER_TEMP}/${DIR_FOR_BIN}" >> "${GITHUB_ENV}"
-20
View File
@@ -1,20 +0,0 @@
param([Parameter(Mandatory=$true)][string]${VSN})
$ErrorActionPreference="Stop"
Set-Location ${Env:RUNNER_TEMP}
$FILE_INPUT="otp_win64_${VSN}.exe"
$FILE_OUTPUT="otp.exe"
$DIR_FOR_BIN="${Env:RUNNER_TEMP}\.setup-beam\otp"
$ProgressPreference="SilentlyContinue"
Invoke-WebRequest "https://github.com/erlang/otp/releases/download/OTP-${VSN}/${FILE_INPUT}" -OutFile "${FILE_OUTPUT}"
$ProgressPreference="Continue"
New-Item "${DIR_FOR_BIN}" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue"
Start-Process "${FILE_OUTPUT}" "/S /D=${DIR_FOR_BIN}" -Wait
Write-Output "Installed Erlang/OTP version follows"
& "${DIR_FOR_BIN}/bin/erl.exe" "+V" | Write-Output
"INSTALL_DIR_FOR_OTP=${DIR_FOR_BIN}" | Out-File -FilePath ${Env:GITHUB_ENV} -Encoding utf8 -Append
-21
View File
@@ -1,21 +0,0 @@
#!/bin/bash
set -eo pipefail
cd "${RUNNER_TEMP}"
OS=${1}
VSN=${2}
HEX_MIRROR=${3}
FILE_INPUT="${VSN}.tar.gz"
FILE_OUTPUT=otp.tar.gz
DIR_FOR_BIN=.setup-beam/otp
wget -q -O "${FILE_OUTPUT}" "${HEX_MIRROR}/builds/otp/${OS}/${FILE_INPUT}"
mkdir -p "${DIR_FOR_BIN}"
tar zxf "${FILE_OUTPUT}" -C "${DIR_FOR_BIN}" --strip-components=1
"${DIR_FOR_BIN}/Install" -minimal "$(pwd)/${DIR_FOR_BIN}"
echo "Installed Erlang/OTP version follows"
${DIR_FOR_BIN}/bin/erl -version
echo "INSTALL_DIR_FOR_OTP=${RUNNER_TEMP}/${DIR_FOR_BIN}" >> "${GITHUB_ENV}"
+56
View File
@@ -10,6 +10,7 @@
"@actions/core": "1.10.0",
"@actions/exec": "1.1.1",
"@actions/http-client": "2.1.0",
"@actions/tool-cache": "^2.0.1",
"semver": "7.3.8"
},
"devDependencies": {
@@ -60,6 +61,36 @@
"resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.2.tgz",
"integrity": "sha512-d+RwPlMp+2qmBfeLYPLXuSRykDIFEwdTA0MMxzS9kh4kvP1ftrc/9fzy6pX6qAjthdXruHQ6/6kjT/DNo5ALuw=="
},
"node_modules/@actions/tool-cache": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@actions/tool-cache/-/tool-cache-2.0.1.tgz",
"integrity": "sha512-iPU+mNwrbA8jodY8eyo/0S/QqCKDajiR8OxWTnSk/SnYg0sj8Hp4QcUEVC1YFpHWXtrfbQrE13Jz4k4HXJQKcA==",
"dependencies": {
"@actions/core": "^1.2.6",
"@actions/exec": "^1.0.0",
"@actions/http-client": "^2.0.1",
"@actions/io": "^1.1.1",
"semver": "^6.1.0",
"uuid": "^3.3.2"
}
},
"node_modules/@actions/tool-cache/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@actions/tool-cache/node_modules/uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
"bin": {
"uuid": "bin/uuid"
}
},
"node_modules/@babel/runtime": {
"version": "7.19.4",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz",
@@ -3025,6 +3056,31 @@
"resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.2.tgz",
"integrity": "sha512-d+RwPlMp+2qmBfeLYPLXuSRykDIFEwdTA0MMxzS9kh4kvP1ftrc/9fzy6pX6qAjthdXruHQ6/6kjT/DNo5ALuw=="
},
"@actions/tool-cache": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@actions/tool-cache/-/tool-cache-2.0.1.tgz",
"integrity": "sha512-iPU+mNwrbA8jodY8eyo/0S/QqCKDajiR8OxWTnSk/SnYg0sj8Hp4QcUEVC1YFpHWXtrfbQrE13Jz4k4HXJQKcA==",
"requires": {
"@actions/core": "^1.2.6",
"@actions/exec": "^1.0.0",
"@actions/http-client": "^2.0.1",
"@actions/io": "^1.1.1",
"semver": "^6.1.0",
"uuid": "^3.3.2"
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
},
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
}
}
},
"@babel/runtime": {
"version": "7.19.4",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz",
+1
View File
@@ -22,6 +22,7 @@
"@actions/core": "1.10.0",
"@actions/exec": "1.1.1",
"@actions/http-client": "2.1.0",
"@actions/tool-cache": "^2.0.1",
"semver": "7.3.8"
},
"devDependencies": {
-24
View File
@@ -1,24 +0,0 @@
param([Parameter(Mandatory=$true)][string]${VSN}, [Parameter(Mandatory=$true)][string]${HEX_MIRROR})
$ErrorActionPreference="Stop"
Set-Location ${Env:RUNNER_TEMP}
$FILE_INPUT="${VSN}.zip"
$FILE_OUTPUT="elixir.zip"
$DIR_FOR_BIN=".setup-beam/elixir"
$ProgressPreference="SilentlyContinue"
Invoke-WebRequest "${HEX_MIRROR}/builds/elixir/${FILE_INPUT}" -OutFile "${FILE_OUTPUT}"
$ProgressPreference="Continue"
New-Item "${DIR_FOR_BIN}" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue"
Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}"
$ProgressPreference="Continue"
Write-Output "Installed Elixir version follows"
& "${DIR_FOR_BIN}/bin/elixir.bat" "-v" | Write-Output
$ProgressPreference="Continue"
New-Item "%UserProfile%/.mix/escripts" -ItemType Directory | Out-Null
"INSTALL_DIR_FOR_ELIXIR=${Env:RUNNER_TEMP}/${DIR_FOR_BIN}" | Out-File -FilePath ${Env:GITHUB_ENV} -Encoding utf8 -Append
-21
View File
@@ -1,21 +0,0 @@
#!/bin/bash
set -eo pipefail
cd "${RUNNER_TEMP}"
VSN=${1}
HEX_MIRROR=${2}
FILE_INPUT="${VSN}.zip"
FILE_OUTPUT=elixir.zip
DIR_FOR_BIN=.setup-beam/elixir
wget -q -O "${FILE_OUTPUT}" "${HEX_MIRROR}/builds/elixir/${FILE_INPUT}"
mkdir -p "${DIR_FOR_BIN}"
unzip -q -o -d "${DIR_FOR_BIN}" "${FILE_OUTPUT}"
echo "Installed Elixir version follows"
${DIR_FOR_BIN}/bin/elixir -v
mkdir -p "${HOME}/.mix/escripts"
echo "INSTALL_DIR_FOR_ELIXIR=${RUNNER_TEMP}/${DIR_FOR_BIN}" >> "${GITHUB_ENV}"
-20
View File
@@ -1,20 +0,0 @@
param([Parameter(Mandatory=$true)][string]${VSN})
$ErrorActionPreference="Stop"
Set-Location ${Env:RUNNER_TEMP}
$FILE_INPUT="otp_win64_${VSN}.exe"
$FILE_OUTPUT="otp.exe"
$DIR_FOR_BIN="${Env:RUNNER_TEMP}\.setup-beam\otp"
$ProgressPreference="SilentlyContinue"
Invoke-WebRequest "https://github.com/erlang/otp/releases/download/OTP-${VSN}/${FILE_INPUT}" -OutFile "${FILE_OUTPUT}"
$ProgressPreference="Continue"
New-Item "${DIR_FOR_BIN}" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue"
Start-Process "${FILE_OUTPUT}" "/S /D=${DIR_FOR_BIN}" -Wait
Write-Output "Installed Erlang/OTP version follows"
& "${DIR_FOR_BIN}/bin/erl.exe" "+V" | Write-Output
"INSTALL_DIR_FOR_OTP=${DIR_FOR_BIN}" | Out-File -FilePath ${Env:GITHUB_ENV} -Encoding utf8 -Append
-21
View File
@@ -1,21 +0,0 @@
#!/bin/bash
set -eo pipefail
cd "${RUNNER_TEMP}"
OS=${1}
VSN=${2}
HEX_MIRROR=${3}
FILE_INPUT="${VSN}.tar.gz"
FILE_OUTPUT=otp.tar.gz
DIR_FOR_BIN=.setup-beam/otp
wget -q -O "${FILE_OUTPUT}" "${HEX_MIRROR}/builds/otp/${OS}/${FILE_INPUT}"
mkdir -p "${DIR_FOR_BIN}"
tar zxf "${FILE_OUTPUT}" -C "${DIR_FOR_BIN}" --strip-components=1
"${DIR_FOR_BIN}/Install" -minimal "$(pwd)/${DIR_FOR_BIN}"
echo "Installed Erlang/OTP version follows"
${DIR_FOR_BIN}/bin/erl -version
echo "INSTALL_DIR_FOR_OTP=${RUNNER_TEMP}/${DIR_FOR_BIN}" >> "${GITHUB_ENV}"
+74 -26
View File
@@ -1,6 +1,9 @@
const core = require('@actions/core')
const { exec } = require('@actions/exec')
const tc = require('@actions/tool-cache')
const path = require('path')
const fs = require('fs')
const os = require('os')
/**
* Install Erlang/OTP.
@@ -10,28 +13,64 @@ const path = require('path')
* @param {string[]} hexMirrors
*/
async function installOTP(osVersion, otpVersion, hexMirrors) {
const OS = process.platform
if (OS === 'linux') {
if (hexMirrors.length === 0) {
throw new Error(
`Could not install Erlang/OTP ${otpVersion} from any hex.pm mirror`,
)
}
const [hexMirror, ...hexMirrorsT] = hexMirrors
const fullVersion = `${osVersion}/${otpVersion}`
let cachedPath = tc.find('otp', fullVersion)
const OS = process.platform
try {
await exec(path.join(__dirname, 'install-otp.sh'), [
osVersion,
otpVersion,
hexMirror,
if (OS === 'linux') {
if (!cachedPath) {
const tarPath = await tc.downloadTool(
`https://builds.hex.pm/builds/otp/${fullVersion}.tar.gz`,
)
const extractPath = await tc.extractTar(tarPath, undefined, [
'zx',
'--strip-components=1',
])
return
} catch (err) {
core.info(`install-otp.sh failed for mirror ${hexMirror}`)
cachedPath = await tc.cacheDir(extractPath, 'otp', fullVersion)
}
await installOTP(osVersion, otpVersion, hexMirrorsT)
await exec(path.join(cachedPath, 'Install'), ['-minimal', cachedPath])
const otpPath = path.join(cachedPath, 'bin')
core.addPath(otpPath)
core.exportVariable('INSTALL_DIR_FOR_OTP', cachedPath)
console.log('Installed Erlang/OTP version')
await exec(path.join(otpPath, 'erl'), ['-version'])
} else if (OS === 'win32') {
const script = path.join(__dirname, 'install-otp.ps1')
await exec(`pwsh.exe ${script} -VSN:${otpVersion}`)
if (!cachedPath) {
const exePath = await tc.downloadTool(
'https://github.com/erlang/otp/releases/download/' +
`OTP-${otpVersion}/otp_win64_${otpVersion}.exe`,
)
cachedPath = await tc.cacheFile(exePath, 'otp.exe', 'otp', fullVersion)
}
const otpDir = path.join(process.env.RUNNER_TEMP, '.setup-beam', 'otp')
const otpPath = path.join(otpDir, 'bin')
await fs.promises.mkdir(otpDir, { recursive: true })
await exec(path.join(cachedPath, 'otp.exe'), ['/S', `/D=${otpDir}`])
core.addPath(otpPath)
core.exportVariable('INSTALL_DIR_FOR_OTP', otpDir)
console.log('Installed Erlang/OTP version')
await exec(path.join(otpPath, 'erl'), ['+V'])
}
} catch (err) {
core.info(`Install OTP failed for mirror ${hexMirror}`)
core.info(`${err}\n${err.stack}`)
await installOTP(osVersion, otpVersion, hexMirrorsT)
}
}
@@ -48,25 +87,34 @@ async function installElixir(elixirVersion, hexMirrors) {
)
}
const [hexMirror, ...hexMirrorsT] = hexMirrors
const OS = process.platform
let script
try {
if (OS === 'linux') {
script = path.join(__dirname, 'install-elixir.sh')
await exec(script, [elixirVersion, hexMirror])
return
}
if (OS === 'win32') {
script = path.join(__dirname, 'install-elixir.ps1')
await exec(
`pwsh.exe ${script} -VSN:${elixirVersion} -HEX_MIRROR:${hexMirror}`,
let cachedPath = tc.find('elixir', elixirVersion)
if (!cachedPath) {
const zipPath = await tc.downloadTool(
`${hexMirror}/builds/elixir/${elixirVersion}.zip`,
)
return
const extractPath = await tc.extractZip(zipPath)
cachedPath = await tc.cacheDir(extractPath, 'elixir', elixirVersion)
}
const elixirPath = path.join(cachedPath, 'bin')
const escriptsPath = path.join(os.homedir(), '.mix', 'escripts')
core.addPath(elixirPath)
core.addPath(escriptsPath)
core.exportVariable('INSTALL_DIR_FOR_ELIXIR', cachedPath)
core.info('Installed Elixir version')
await exec(path.join(elixirPath, 'elixir'), ['-v'])
await fs.promises.mkdir(escriptsPath, { recursive: true })
} catch (err) {
core.info(`${script} failed for mirror ${hexMirror}`)
}
core.info(`Elixir install failed for mirror ${hexMirror}`)
core.info(`${err}\n${err.stack}`)
await installElixir(elixirVersion, hexMirrorsT)
}
}
/**
-4
View File
@@ -1,7 +1,6 @@
const core = require('@actions/core')
const { exec } = require('@actions/exec')
const http = require('@actions/http-client')
const os = require('os')
const path = require('path')
const semver = require('semver')
const fs = require('fs')
@@ -61,7 +60,6 @@ async function installOTP(otpSpec, osVersion, hexMirrors) {
core.startGroup(`Installing Erlang/OTP ${otpVersion} - built on ${osVersion}`)
await installer.installOTP(osVersion, otpVersion, hexMirrors)
core.setOutput('otp-version', otpVersion)
core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/otp/bin`)
core.endGroup()
return otpVersion
@@ -89,8 +87,6 @@ async function maybeInstallElixir(elixirSpec, otpSpec, hexMirrors) {
)
core.info(`##[add-matcher]${elixirMatchers}`)
}
core.addPath(`${os.homedir()}/.mix/escripts`)
core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/elixir/bin`)
core.endGroup()
installed = true