Compare commits

..

6 Commits

Author SHA1 Message Date
Paulo F. Oliveira 713cc2ffe3 Move away from set-output (while updating all deps) (#148)
* Update all our deps

Get rid of warnings such as:
* `save-state` will be deprecated
* `set-output` will be deprecated
* nodejs 12 is being deprecated
...

Rely on tests to make sure the actions still works

* Fix as per CI results

* Get rid of deprecated containers

* Have a warningless run

We're not testing rebar3 here, in any case
2022-10-19 21:51:01 +01:00
Paulo F. Oliveira 8d31e4db55 Allow version-type: strict + otp-version: master for Elixir -based builds (#144)
* Check tests failing for something that should pass

* Test with version-type: strict

* Add more tests

GitHub actions is refusing to run a given workflow :shrug

* Try to fix new test that shouldn't be failing

Which is exactly what we intended to originate by starting a new
pull request.

* Fix tests as per CI

* Fix tests as per CI

* Adapt to "latest"

* Fix as per CI results

Actions' window shows everything as Ok but then internals not

Error when evaluating 'runs-on' for job 'integration_test'. .github/workflows/ubuntu.yml (Line: 19, Col: 14): Unexpected type of value '', expected type: OneOf.

Strange one, this one!

* Try to "help" for non-OTP declared input

We do this for OTP-, but not for maint-
as the former is hopefully more common
than the latter

* Introduce `latest` to signify `master`

Semantically they're similar, but with `latest` we know:
1. to fetch Elixir's no-otp-... version
2. to fetch Erlang's master

whereas with 25 (latest at this moment) we'd
try to fetch elixirvsn-otp-25 which could fail with
Elixir master and version-type strict

* Fix as per CI

Still not 100% convinced that `latest` should be separate from `master`
but I want to know how tests run, in this case in particular

* Fix as per CI

* Fix as per CI

* Revert potential wrong decision

* Fix as per understand recent Elixir changes (namely master v. main)

* Try to simplify it

We introduce the concept of version v. branch (as per @ericmj)
and we use that to find the most appropriate Erlang/Elixir combo.
2022-10-19 21:10:26 +01:00
github-actions[bot] 4c52669fda Update 3rd party licenses (#145)
Co-authored-by: GitHub Actions <actions@user.noreply.github.com>
2022-10-11 13:20:09 +01:00
github-actions[bot] 6a5f23a6f0 Update 3rd party licenses (#143)
Co-authored-by: GitHub Actions <actions@user.noreply.github.com>
2022-09-23 13:40:49 +01:00
Wojtek Mach 8bfa104bdd Test environment variables are set (#142) 2022-09-16 20:01:17 +02:00
Wojtek Mach d85df626dd Fix setting INSTALL_DIR_FOR_OTP (#141) 2022-09-16 10:28:57 +02:00
14 changed files with 1482 additions and 1271 deletions
+6 -6
View File
@@ -14,8 +14,8 @@ jobs:
name: Expected local npm actions
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '14'
- run: npm install -g npm
@@ -34,8 +34,8 @@ jobs:
name: Unit tests (Ubuntu)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '14'
- run: npm ci
@@ -45,8 +45,8 @@ jobs:
name: Unit tests (Windows)
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '14'
- run: npm install --production
+25 -22
View File
@@ -21,6 +21,13 @@ jobs:
fail-fast: false
matrix:
combo:
- otp-version: 'master'
elixir-version: '1.14.0'
os: 'ubuntu-latest'
- otp-version: 'master'
elixir-version: '1.14.0'
os: 'ubuntu-latest'
version-type: 'strict'
- otp-version: '25'
elixir-version: '1'
rebar3-version: '3'
@@ -45,20 +52,10 @@ jobs:
- otp-version: '24'
rebar3-version: 'nightly'
os: 'ubuntu-latest'
- elixir-version: 'v1.0'
otp-version: '17'
os: 'ubuntu-18.04'
- elixir-version: 'v1.1'
otp-version: '18'
os: 'ubuntu-18.04'
- elixir-version: 'v1.2'
otp-version: '19'
rebar3-version: '3.10'
os: 'ubuntu-18.04'
- elixir-version: 'v1.4'
otp-version: '20'
rebar3-version: '3.6.0'
os: 'ubuntu-18.04'
os: 'ubuntu-20.04'
- elixir-version: 'v1.4'
otp-version: '20'
rebar3-version: '3.11'
@@ -66,7 +63,7 @@ jobs:
- elixir-version: 'v1.6'
otp-version: '21'
rebar3-version: '3.12'
os: 'ubuntu-18.04'
os: 'ubuntu-20.04'
- elixir-version: 'v1.6'
otp-version: '21'
rebar3-version: '3.12'
@@ -74,7 +71,7 @@ jobs:
- elixir-version: 'v1.7'
otp-version: '22'
rebar3-version: '3.13'
os: 'ubuntu-18.04'
os: 'ubuntu-20.04'
- elixir-version: 'v1.7'
otp-version: '22'
rebar3-version: '3.13'
@@ -82,11 +79,11 @@ jobs:
- elixir-version: 'v1.10'
otp-version: '23'
rebar3-version: '3.14'
os: 'ubuntu-18.04'
os: 'ubuntu-20.04'
- elixir-version: 'v1.13.4'
otp-version: '25.0.2'
rebar3-version: '3.19'
os: 'ubuntu-18.04'
os: 'ubuntu-20.04'
- elixir-version: 'v1.10'
otp-version: '23'
rebar3-version: '3.14'
@@ -113,26 +110,32 @@ jobs:
- elixir-version: 'master'
otp-version: '23.1'
os: 'ubuntu-20.04'
- elixir-version: 'master'
- elixir-version: 'main'
otp-version: '25'
os: 'ubuntu-20.04'
version-type: 'strict'
- gleam-version: 'nightly'
otp-version: '24'
os: 'ubuntu-latest'
disable_problem_matchers: true
- gleam-version: '0.23'
otp-version: '24'
os: 'ubuntu-latest'
disable_problem_matchers: true
- gleam-version: '0.23.0-rc1'
otp-version: '24'
os: 'ubuntu-latest'
disable_problem_matchers: true
- gleam-version: '0.23.0-rc1'
otp-version: false
os: 'ubuntu-latest'
disable_problem_matchers: true
- gleam-version: '0.22.0' # Version with Gleam's old archive naming convention
otp-version: '24'
os: 'ubuntu-latest'
disable_problem_matchers: true
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Use erlef/setup-beam
id: setup-beam
uses: ./
@@ -194,7 +197,7 @@ jobs:
rebar3-version: 'nightly'
os: 'ubuntu-latest'
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Use erlef/setup-beam
id: setup-beam
uses: ./
@@ -206,7 +209,7 @@ jobs:
- run: env
- name: List environment variables
run: |
echo "${{env.INSTALL_DIR_FOR_ELIXIR}}"
echo "${{env.INSTALL_DIR_FOR_GLEAM}}"
echo "${{env.INSTALL_DIR_FOR_OTP}}"
echo "${{env.INSTALL_DIR_FOR_REBAR3}}"
[ -n "${INSTALL_DIR_FOR_ELIXIR}" ] && echo "${INSTALL_DIR_FOR_ELIXIR}"
[ -n "${INSTALL_DIR_FOR_GLEAM}" ] && echo "${INSTALL_DIR_FOR_GLEAM}"
[ -n "${INSTALL_DIR_FOR_OTP}" ] && echo "${INSTALL_DIR_FOR_OTP}"
[ -n "${INSTALL_DIR_FOR_REBAR3}" ] && echo "${INSTALL_DIR_FOR_REBAR3}"
@@ -11,8 +11,8 @@ jobs:
name: Update 3rd party licenses
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '14'
- run:
+8 -7
View File
@@ -37,7 +37,7 @@ jobs:
otp-version: '23'
rebar3-version: '3.14'
os: 'windows-latest'
- elixir-version: 'v1.11'
- elixir-version: 'v1.13'
otp-version: '24'
rebar3-version: '3.15'
os: 'windows-latest'
@@ -46,7 +46,7 @@ jobs:
rebar3-version: '3.16'
os: 'windows-latest'
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Use erlef/setup-beam
id: setup-beam
uses: ./
@@ -95,7 +95,7 @@ jobs:
rebar3-version: 'nightly'
os: 'windows-latest'
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Use erlef/setup-beam
id: setup-beam
uses: ./
@@ -107,7 +107,8 @@ jobs:
- run: env
- name: List environment variables
run: |
echo "${{env.INSTALL_DIR_FOR_ELIXIR}}"
echo "${{env.INSTALL_DIR_FOR_GLEAM}}"
echo "${{env.INSTALL_DIR_FOR_OTP}}"
echo "${{env.INSTALL_DIR_FOR_REBAR3}}"
[ -n "${INSTALL_DIR_FOR_ELIXIR}" ] && echo "${INSTALL_DIR_FOR_ELIXIR}"
[ -n "${INSTALL_DIR_FOR_GLEAM}" ] && echo "${INSTALL_DIR_FOR_GLEAM}"
[ -n "${INSTALL_DIR_FOR_OTP}" ] && echo "${INSTALL_DIR_FOR_OTP}"
[ -n "${INSTALL_DIR_FOR_REBAR3}" ] && echo "${INSTALL_DIR_FOR_REBAR3}"
shell: bash
+2 -2
View File
@@ -1543,7 +1543,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
-----
The following software may be included in this product: concat-map, json-stable-stringify-without-jsonify, minimist, semver-compare, text-table. A copy of the source code may be downloaded from git://github.com/substack/node-concat-map.git (concat-map), git://github.com/samn/json-stable-stringify.git (json-stable-stringify-without-jsonify), git://github.com/substack/minimist.git (minimist), git://github.com/substack/semver-compare.git (semver-compare), git://github.com/substack/text-table.git (text-table). This software contains the following license and notice below:
The following software may be included in this product: concat-map, json-stable-stringify-without-jsonify, minimist, semver-compare, text-table. A copy of the source code may be downloaded from git://github.com/substack/node-concat-map.git (concat-map), git://github.com/samn/json-stable-stringify.git (json-stable-stringify-without-jsonify), git://github.com/minimistjs/minimist.git (minimist), git://github.com/substack/semver-compare.git (semver-compare), git://github.com/substack/text-table.git (text-table). This software contains the following license and notice below:
This software is released under the MIT license:
@@ -2009,7 +2009,7 @@ THE SOFTWARE.
-----
The following software may be included in this product: es-shim-unscopables. A copy of the source code may be downloaded from git+https://github.com/ljharb/es-shim-unscopables.git. This software contains the following license and notice below:
The following software may be included in this product: es-shim-unscopables, safe-regex-test. A copy of the source code may be downloaded from git+https://github.com/ljharb/es-shim-unscopables.git (es-shim-unscopables), git+https://github.com/ljharb/safe-regex-test.git (safe-regex-test). This software contains the following license and notice below:
MIT License
+10 -2
View File
@@ -188,6 +188,14 @@ async function testElixirVersions() {
got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'strict')
spec = '1.14.0'
otpVersion = 'master'
expected = 'v1.14.0'
got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'loose')
simulateInput('version-type', 'strict')
spec = 'v1.11.0-rc.0'
otpVersion = 'OTP-23'
@@ -205,9 +213,9 @@ async function testElixirVersions() {
simulateInput('version-type', 'loose')
simulateInput('version-type', 'strict')
spec = 'master'
spec = 'main'
otpVersion = '23.1'
expected = 'master-otp-23'
expected = 'main-otp-23'
got = await setupBeam.getElixirVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'loose')
+894 -884
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -14,4 +14,4 @@ Start-Process "${FILE_OUTPUT}" "/S /D=${ERL_ROOT}" -Wait
Write-Output "Installed Erlang/OTP version follows"
& "${ERL_ROOT}/bin/erl.exe" "+V" | Write-Output
"INSTALL_DIR_FOR_OTP=" + ${ERL_ROOT}
"INSTALL_DIR_FOR_OTP=${ERL_ROOT}" | Out-File -FilePath ${Env:GITHUB_ENV} -Encoding utf8 -Append
+1 -1
View File
@@ -17,4 +17,4 @@ tar zxf "${FILE_OUTPUT}" -C "${DIR_FOR_BIN}" --strip-components=1
echo "Installed Erlang/OTP version follows"
${DIR_FOR_BIN}/bin/erl -version
echo "INSTALL_DIR_FOR_OTP=${RUNNER_TEMP}/${DIR_FOR_BIN}"
echo "INSTALL_DIR_FOR_OTP=${RUNNER_TEMP}/${DIR_FOR_BIN}" >> "${GITHUB_ENV}"
+472 -270
View File
File diff suppressed because it is too large Load Diff
+11 -11
View File
@@ -19,23 +19,23 @@
}
},
"dependencies": {
"@actions/core": "1.9.1",
"@actions/core": "1.10.0",
"@actions/exec": "1.1.1",
"semver": "7.3.6"
"semver": "7.3.8"
},
"devDependencies": {
"@vercel/ncc": "0.33.4",
"eslint": "8.14.0",
"@vercel/ncc": "0.34.0",
"eslint": "8.25.0",
"eslint-config-airbnb": "19.0.4",
"eslint-plugin-import": "2.26.0",
"eslint-plugin-jsx-a11y": "6.5.1",
"eslint-plugin-react": "7.29.0",
"husky": "7.0.4",
"markdownlint": "0.25.1",
"prettier": "2.6.2",
"eslint-plugin-jsx-a11y": "6.6.1",
"eslint-plugin-react": "7.31.10",
"husky": "8.0.1",
"markdownlint": "0.26.2",
"prettier": "2.7.1",
"shellcheck": "1.1.0",
"yaml-lint": "1.3.0",
"yarn": "1.22.18"
"yaml-lint": "1.7.0",
"yarn": "1.22.19"
},
"engines": {
"node": ">=16"
+1 -1
View File
@@ -14,4 +14,4 @@ Start-Process "${FILE_OUTPUT}" "/S /D=${ERL_ROOT}" -Wait
Write-Output "Installed Erlang/OTP version follows"
& "${ERL_ROOT}/bin/erl.exe" "+V" | Write-Output
"INSTALL_DIR_FOR_OTP=" + ${ERL_ROOT}
"INSTALL_DIR_FOR_OTP=${ERL_ROOT}" | Out-File -FilePath ${Env:GITHUB_ENV} -Encoding utf8 -Append
+1 -1
View File
@@ -17,4 +17,4 @@ tar zxf "${FILE_OUTPUT}" -C "${DIR_FOR_BIN}" --strip-components=1
echo "Installed Erlang/OTP version follows"
${DIR_FOR_BIN}/bin/erl -version
echo "INSTALL_DIR_FOR_OTP=${RUNNER_TEMP}/${DIR_FOR_BIN}"
echo "INSTALL_DIR_FOR_OTP=${RUNNER_TEMP}/${DIR_FOR_BIN}" >> "${GITHUB_ENV}"
+48 -61
View File
@@ -19,8 +19,8 @@ async function main() {
const rebar3Spec = core.getInput('rebar3-version', { required: false })
if (otpSpec !== 'false') {
const otpVersion = await installOTP(otpSpec, osVersion)
const elixirInstalled = await maybeInstallElixir(elixirSpec, otpVersion)
await installOTP(otpSpec, osVersion)
const elixirInstalled = await maybeInstallElixir(elixirSpec, otpSpec)
if (elixirInstalled === true) {
const shouldMixRebar = core.getInput('install-rebar', {
@@ -130,19 +130,13 @@ async function maybeInstallRebar3(rebar3Spec) {
async function getOTPVersion(otpSpec0, osVersion) {
const otpVersions = await getOTPVersions(osVersion)
const otpSpec = otpSpec0.match(/^(OTP-|maint-)?([^ ]+)/)
let otpVersion
if (otpSpec[1] && !isStrictVersion()) {
throw new Error(
`Requested Erlang/OTP version (${otpSpec0}) ` +
"should not contain 'OTP-, or maint-'",
)
}
if (otpSpec) {
otpVersion = getVersionFromSpec(
otpSpec[2],
Array.from(otpVersions.keys()).sort(),
)
let otpSpec = otpSpec0 // might be a branch (?)
const otpVersion = getVersionFromSpec(
otpSpec,
Array.from(otpVersions.keys()).sort(),
)
if (isVersion(otpSpec0)) {
otpSpec = `OTP-${otpSpec0}` // ... it's a version!
}
if (otpVersion === null) {
throw new Error(
@@ -154,60 +148,46 @@ async function getOTPVersion(otpSpec0, osVersion) {
return otpVersions.get(otpVersion) // from the reference, for download
}
async function getElixirVersion(exSpec0, otpVersion) {
async function getElixirVersion(exSpec0, otpVersion0) {
const otpVersion = otpVersion0.match(/^([^-]+-)?(.+)$/)[2]
const otpVersionMajor = otpVersion.match(/^([^.]+).*$/)[1]
const elixirVersions = await getElixirVersions()
const semverVersions = Array.from(elixirVersions.keys()).sort()
const exSpec = exSpec0.match(/^v?(.+)(-otp-.+)/) || exSpec0.match(/^v?(.+)/)
let elixirVersion
if (exSpec[2] && !isStrictVersion()) {
throw new Error(
`Requested Elixir / Erlang/OTP version (${exSpec0} / ${otpVersion}) ` +
"should not contain '-otp-...'",
)
const exSpec = exSpec0.replace(/-otp-.*$/, '')
const elixirVersionFromSpec = getVersionFromSpec(exSpec, semverVersions, true)
let elixirVersionForDownload = elixirVersionFromSpec
if (isVersion(otpVersionMajor)) {
elixirVersionForDownload = `${elixirVersionFromSpec}-otp-${otpVersionMajor}`
}
if (exSpec) {
elixirVersion = getVersionFromSpec(exSpec[1], semverVersions)
}
if (!exSpec || elixirVersion === null) {
if (elixirVersionFromSpec === null) {
throw new Error(
`Requested Elixir version (${exSpec0}) not found in version list ` +
"(should you be using option 'version-type': 'strict'?)",
)
}
const otpMatch = otpVersion.match(/^(?:OTP-)?([^.]+)/)
let elixirVersionWithOTP
if (elixirVersions.get(elixirVersion)) {
const otpVersionMajor = otpMatch[1]
// We try for a version like `v1.4.5-otp-20`...
if (elixirVersions.get(elixirVersion).includes(otpMatch[1])) {
// ... and it's available: use it!
elixirVersionWithOTP = `${elixirVersion}-otp-${otpVersionMajor}`
core.info(
`Using Elixir ${elixirVersion} (built for OTP ${otpVersionMajor})`,
)
} else {
// ... and it's not available: exit with exception
throw new Error(
`Requested Elixir / Erlang/OTP version (${exSpec0} / ${otpVersion}) not ` +
'found in version list (did you check Compatibility between Elixir and Erlang/OTP?)',
)
}
const elixirVersionComp = elixirVersions.get(elixirVersionFromSpec)
if (
(elixirVersionComp && elixirVersionComp.includes(otpVersionMajor)) ||
!isVersion(otpVersionMajor)
) {
core.info(
`Using Elixir ${elixirVersionFromSpec} (built for Erlang/OTP ${otpVersionMajor})`,
)
} else {
throw new Error(
`Requested Elixir / Erlang/OTP version (${exSpec0} / ${otpVersion}) not ` +
"found in version list (should you be using option 'version-type': 'strict'?)",
`Requested Elixir / Erlang/OTP version (${exSpec0} / ${otpVersion0}) not ` +
'found in version list (did you check Compatibility between Elixir and Erlang/OTP?)',
)
}
return maybePrependWithV(elixirVersionWithOTP, elixirVersion)
return maybePrependWithV(elixirVersionForDownload)
}
async function getGleamVersion(gleamSpec0) {
const gleamSpec = gleamSpec0.match(/^v?(.+)/)
const gleamSpec = gleamSpec0.match(/^v?(.+)$/)
const gleamVersions = await getGleamVersions()
const gleamVersion = getVersionFromSpec(gleamSpec[1], gleamVersions)
const gleamVersion = getVersionFromSpec(gleamSpec[1], gleamVersions, true)
if (gleamVersion === null) {
throw new Error(
`Requested Gleam version (${gleamSpec0}) not found in version list ` +
@@ -251,7 +231,9 @@ async function getOTPVersions(osVersion) {
.trim()
.split('\n')
.forEach((line) => {
const otpMatch = line.match(/^(OTP-|maint-)?([^ ]+)/)
const otpMatch = line
.match(/^([^ ]+)?( .+)/)[1]
.match(/^([^-]+-)?(.+)$/)
const otpVersion = otpMatch[2]
otpVersions.set(otpVersion, otpMatch[0]) // we keep the original for later reference
})
@@ -268,7 +250,6 @@ async function getOTPVersions(osVersion) {
})
})
}
return otpVersions
}
@@ -285,7 +266,7 @@ async function getElixirVersions() {
.forEach((line) => {
const elixirMatch =
line.match(/^v?(.+)-otp-([^ ]+)/) || line.match(/^v?([^ ]+)/)
const elixirVersion = elixirMatch[1]
const elixirVersion = maybePrependWithV(elixirMatch[1])
const otpVersion = elixirMatch[2]
const otpVersions = otpVersionsForElixirMap.get(elixirVersion) || []
if (otpVersion) {
@@ -332,7 +313,7 @@ function isStrictVersion() {
return core.getInput('version-type', { required: false }) === 'strict'
}
function getVersionFromSpec(spec, versions) {
function getVersionFromSpec(spec, versions, maybePrependWithV0) {
let version = null
if (spec.match(/rc/) || isStrictVersion()) {
@@ -357,7 +338,11 @@ function getVersionFromSpec(spec, versions) {
}
}
return version === null || version === undefined ? null : version
let v = version === null || version === undefined ? null : version
if (maybePrependWithV0 && v != null) {
v = maybePrependWithV(v)
}
return v
}
function maybeCoerced(v) {
@@ -464,15 +449,17 @@ async function get(url0, pageIdxs) {
return ret
}
function maybePrependWithV(versionToPrepend, specVersion) {
const digitStart = /^\d+/
let v = versionToPrepend
if (digitStart.test(specVersion)) {
v = `v${versionToPrepend}`
function maybePrependWithV(v) {
if (isVersion(v)) {
return `v${v.replace('v', '')}`
}
return v
}
function isVersion(v) {
return /^v?\d+/.test(v)
}
module.exports = {
getOTPVersion,
getElixirVersion,