Merge pull request #10 from ericmj/emj/hex

Install from hex
This commit is contained in:
Jonathan Clem
2019-12-04 13:50:09 -05:00
committed by GitHub
10 changed files with 103 additions and 237 deletions

View File

@@ -18,6 +18,9 @@ jobs:
# Semver ranges
- otp-version: 21.x
elixir-version: <1.9.1
# Branches
- otp-version: 22.0
elixir-version: master
steps:
- uses: actions/checkout@v1.0.0
- name: Use actions/setup-elixir

View File

@@ -1,19 +0,0 @@
#!/usr/bin/env bash
set -eo pipefail
# Find all releases that are $major.$minor(.$patch)? (no branch versions or rcs)
curl -fs https://raw.githubusercontent.com/erlang/otp/master/otp_versions.table \
| cut -d: -f1 \
| cut -d- -f2 \
| awk '{$1=$1};1' \
| grep -E '^\d+\.\d+(?:\.\d+)?$' \
| sed -E 's/^([0-9]+\.[0-9]+)$/\1.0/g' \
> src/erlang-versions.txt
# Find all releases that are $major.$minor(.$patch)? (no rcs)
curl -fs https://api.github.com/repos/elixir-lang/elixir/releases \
| jq -r '.[].tag_name' \
| sed 's/^v//' \
| grep -v '-' \
> src/elixir-versions.txt

View File

@@ -1,24 +0,0 @@
1.9.4
1.9.3
1.9.2
1.9.1
1.9.0
1.8.2
1.8.1
1.8.0
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.3
1.5.2
1.5.1
1.5.0

View File

@@ -1,143 +0,0 @@
22.1.5
22.1.4
22.1.3
22.1.2
22.1.1
22.1
22.0.7
22.0.6
22.0.5
22.0.4
22.0.3
22.0.2
22.0.1
22.0.0
21.3.8
21.3.7
21.3.6
21.3.5
21.3.4
21.3.3
21.3.2
21.3.1
21.3.0
21.2.7
21.2.6
21.2.5
21.2.4
21.2.3
21.2.2
21.2.1
21.2.0
21.1.4
21.1.3
21.1.2
21.1.1
21.1.0
21.0.9
21.0.8
21.0.7
21.0.6
21.0.5
21.0.4
21.0.3
21.0.2
21.0.1
21.0.0
20.3.8
20.3.7
20.3.6
20.3.5
20.3.4
20.3.3
20.3.2
20.3.1
20.3.0
20.2.4
20.2.3
20.2.2
20.2.1
20.2.0
20.1.7
20.1.6
20.1.5
20.1.4
20.1.3
20.1.2
20.1.1
20.1.0
20.0.5
20.0.4
20.0.3
20.0.2
20.0.1
20.0.0
19.3.6
19.3.5
19.3.4
19.3.3
19.3.2
19.3.1
19.3.0
19.2.3
19.2.2
19.2.1
19.2.0
19.1.6
19.1.5
19.1.4
19.1.3
19.1.2
19.1.1
19.1.0
19.0.7
19.0.6
19.0.5
19.0.4
19.0.3
19.0.2
19.0.1
19.0.0
18.3.4
18.3.3
18.3.2
18.3.1
18.3.0
18.2.4
18.2.3
18.2.2
18.2.1
18.2.0
18.1.5
18.1.4
18.1.3
18.1.2
18.1.1
18.1.0
18.0.3
18.0.2
18.0.1
18.0.0
17.5.6
17.5.5
17.5.4
17.5.3
17.5.2
17.5.1
17.5.0
17.4.1
17.4.0
17.3.4
17.3.3
17.3.2
17.3.1
17.3.0
17.2.2
17.2.1
17.2.0
17.1.2
17.1.1
17.1.0
17.0.2
17.0.1
17.0.0

8
src/install-elixir Executable file
View File

@@ -0,0 +1,8 @@
#!/bin/bash
set -eo pipefail
wget -q https://repo.hex.pm/builds/elixir/${1}${2}.zip
unzip -d .setup-elixir/elixir ${1}${2}.zip
rm ${1}${2}.zip
echo "::add-path::$(pwd)/.setup-elixir/elixir/bin"

View File

@@ -1,13 +0,0 @@
#!/bin/bash
set -eo pipefail
release=$(cat /etc/os-release | grep UBUNTU_CODENAME | cut -d= -f2)
version=$1
arch=$2
file=elixir_$version-1~ubuntu~$release\_$arch.deb
cd /tmp
wget https://packages.erlang-solutions.com/erlang/debian/pool/$file
sudo dpkg -i $file

10
src/install-otp Executable file
View File

@@ -0,0 +1,10 @@
#!/bin/bash
set -eo pipefail
wget -q -O otp.tar.gz https://repo.hex.pm/builds/otp/ubuntu-14.04/OTP-${1}.tar.gz
mkdir -p .setup-elixir/otp
tar zxf otp.tar.gz -C .setup-elixir/otp --strip-components=1
rm otp.tar.gz
.setup-elixir/otp/Install -minimal $(pwd)/.setup-elixir/otp
echo "::add-path::$(pwd)/.setup-elixir/otp/bin"

View File

@@ -1,16 +0,0 @@
#!/bin/bash
set -eo pipefail
release=$(lsb_release -cs)
version=$1
file=esl-erlang_$version-1~ubuntu~$release\_amd64.deb
sudo apt-get install -y libwxbase3.0-0v5
sudo apt-get install -y libwxgtk3.0-0v5
sudo apt-get install -y libsctp1
cd /tmp
wget https://packages.erlang-solutions.com/erlang/debian/pool/$file
sudo dpkg -i $file

View File

@@ -8,14 +8,12 @@ module.exports = {installElixir, installOTP}
* Install Elixir.
*
* @param {string} version
* @param {string} arch
* @param {string} otpMajor
*/
async function installElixir(version) {
let arch = 'all'
if (semver.gt('1.9.0', version)) arch = 'amd64'
async function installElixir(version, otpMajor) {
if (process.platform === 'linux') {
await exec(path.join(__dirname, 'install-elixir-ubuntu'), [version, arch])
const otpString = otpMajor ? `-otp-${otpMajor}` : ''
await exec(path.join(__dirname, 'install-elixir'), [version, otpString])
}
}
@@ -26,7 +24,7 @@ async function installElixir(version) {
*/
async function installOTP(version) {
if (process.platform === 'linux') {
await exec(path.join(__dirname, 'install-otp-ubuntu'), [version])
await exec(path.join(__dirname, 'install-otp'), [version])
return
}

View File

@@ -1,9 +1,9 @@
const core = require('@actions/core')
const {exec} = require('@actions/exec')
const {installElixir, installOTP} = require('./installer')
const {readFile} = require('fs').promises
const path = require('path')
const semver = require('semver')
const https = require('https')
main().catch(err => {
core.setFailed(err.message)
@@ -14,14 +14,8 @@ async function main() {
const otpSpec = core.getInput('otp-version', {required: true})
const elixirSpec = core.getInput('elixir-version', {required: true})
const otpVersion = await getVersion(
otpSpec,
path.join(__dirname, 'erlang-versions.txt')
)
const elixirVersion = await getVersion(
elixirSpec,
path.join(__dirname, 'elixir-versions.txt')
)
const otpVersion = await getOtpVersion(otpSpec)
const [elixirVersion, otpMajor] = await getElixirVersion(elixirSpec, otpVersion)
let installHex = core.getInput('install-hex')
installHex = installHex == null ? true : installHex
@@ -33,9 +27,10 @@ async function main() {
console.log(`##[endgroup]`)
console.log(`##[group]Installing Elixir ${elixirVersion}`)
await installElixir(elixirVersion)
await installElixir(elixirVersion, otpMajor)
console.log(`##[endgroup]`)
process.env.PATH = `${process.cwd()}/.setup-elixir/elixir/bin:${process.env.PATH}`
if (installRebar) await exec('mix local.rebar --force')
if (installHex) await exec('mix local.hex --force')
@@ -50,9 +45,76 @@ function checkPlatform() {
)
}
async function getVersion(spec, versionFile) {
const range = semver.validRange(spec)
const versions = (await readFile(versionFile)).toString().split('\n')
const version = semver.maxSatisfying(versions, range)
return version || spec
async function getOtpVersion(spec) {
return getVersionFromSpec(spec, await getOtpVersions()) || spec
}
async function getElixirVersion(spec, otpVersion) {
const versions = await getElixirVersions()
const semverRegex = /^v(\d+\.\d+\.\d+)/
const semverVersions =
Array.from(versions.keys())
.filter(str => str.match(semverRegex))
.map(str => str.match(semverRegex)[1])
const version = getVersionFromSpec(spec, semverVersions)
const gitRef = version ? `v${version}` : spec
const [otpMajor] = otpVersion.match(/^\d+/)
if (versions.get(gitRef).includes(otpMajor)) {
return [gitRef, otpMajor]
} else {
return [gitRef, null]
}
}
function getVersionFromSpec(spec, versions) {
if (versions.includes(spec)) {
return spec;
} else {
const range = semver.validRange(spec)
return semver.maxSatisfying(versions, range)
}
}
async function getOtpVersions() {
const result = await get("https://raw.githubusercontent.com/erlang/otp/master/otp_versions.table")
return result.trim().split('\n').map(line => {
const [_, version] = line.match(/^OTP-([\.\d]+)/)
return version
})
}
async function getElixirVersions() {
const result = await get("https://repo.hex.pm/builds/elixir/builds.txt")
const map = new Map()
result.trim().split('\n').forEach(line => {
const match = line.match(/^(v\d+\.\d+\.\d+)-otp-(\d+)/) || line.match(/^([^-]+)-otp-(\d+)/)
if (match) {
const [_, version, otp] = match
const array = (map.get(version) || [])
array.push(otp)
map.set(version, array)
}
})
return map
}
function get(url) {
return new Promise((resolve, reject) => {
const req = https.get(url)
req.on('response', res => {
let data = ''
res.on('data', (chunk) => { data += chunk })
res.on('end', () => { resolve(data) })
})
req.on('error', err => { reject(err) })
})
}