Skip to content

Commit

Permalink
v3; defaults to pkgx^2; pure js rewrite (#256)
Browse files Browse the repository at this point in the history
  • Loading branch information
mxcl committed Jan 15, 2025
1 parent 6b6c1c2 commit 8e49a29
Show file tree
Hide file tree
Showing 20 changed files with 860 additions and 440 deletions.
11 changes: 11 additions & 0 deletions .github/workflows/cd.qa.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
on:
workflow_dispatch:
inputs:
version:
required: true

jobs:
qa-installer:
uses: ./.github/workflows/ci.installer.yml
qa-action:
uses: ./.github/workflows/ci.action.yml
25 changes: 25 additions & 0 deletions .github/workflows/cd.vx.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: cd·vx

on:
release:
types:
- published

concurrency:
group: cd/vx/${{ github.event.release.tag_name }}
cancel-in-progress: true

permissions:
contents: write

jobs:
retag:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: fischerscode/tagger@v0
with:
prefix: v
- run: |
git tag -f latest
git push origin latest --force
77 changes: 0 additions & 77 deletions .github/workflows/cd.yml

This file was deleted.

42 changes: 14 additions & 28 deletions .github/workflows/ci.action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,27 @@ on:
workflow_call:
pull_request:
paths:
- action.ts
- action.js
- action.yml
- package.json
- installer.sh

concurrency:
group: ${{ github.ref || 'ci' }}/action.ts
cancel-in-progress: true

jobs:
dist:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./scripts/dist.sh
- uses: actions/upload-artifact@v3
with:
name: dist
path: dist

std:
needs: dist
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v3
with:
name: dist
path: dist
- run: npm i
- uses: ./
with:
version: null
- run: pkgx --version

plus-pkgs:
needs: dist
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
Expand All @@ -46,7 +34,7 @@ jobs:
- [self-hosted, linux, ARM64] # works in arm64 environments
prefix:
- null
- /opt
- /tmp/pkgx
container:
- null
include:
Expand All @@ -55,31 +43,29 @@ jobs:
container: ${{ matrix.container }}
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v3

- uses: actions/setup-node@v4
with:
name: dist
path: dist
node-version: latest
- run: npm i

- uses: ./
with:
PKGX_DIR: ${{ matrix.prefix }}
+: node@18 deno.land

- run: test -f '${{ matrix.prefix }}/pkgx.sh/v*/bin/pkgx'
- run: test -f '${{ matrix.prefix }}/deno.land/v*/bin/deno'
if: ${{ matrix.prefix }}

- run: pkgx --version
- run: node --eval 'console.log(1)'
- run: if [[ "$(node --version)" != v18.* ]]; then exit 1; fi
- run: deno --version

multiple-apply-is-ok:
runs-on: ubuntu-latest
needs: dist
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v3
with:
name: dist
path: dist
- run: npm i
- uses: ./
- run: pkgx --version
- uses: ./
Expand Down
15 changes: 3 additions & 12 deletions .github/workflows/ci.installer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -156,22 +156,11 @@ jobs:
- debian:buster-slim
- debian:bullseye-slim
- debian:bookworm-slim

- archlinux:latest

# - ubuntu:trusty glibc too old
# - ubuntu:xenial glibc too old
# - ubuntu:bionic glibc too old
# - ubuntu:lunar out of support
- ubuntu:focal
- ubuntu:jammy
- ubuntu:24.04
- ubuntu:24.10

- ubuntu:noble
- fedora:latest

# - nixos/nix:latest can’t exec
# - alpine:latest pkgx binary doesn’t actually end up on the system (wtf)
container: ${{ matrix.container }}
steps:
- uses: actions/checkout@v4
Expand All @@ -196,5 +185,7 @@ jobs:
tar xz --strip-components=3
- run: mv pkgx /usr/local/bin
- run: test "$(pkgx --version)" = 'pkgx 1.0.0'
- run: PKGX_UPDATE=no ./installer.sh
- run: test "$(pkgx --version)" = 'pkgx 1.0.0'
- run: ./installer.sh
- run: pkgx semverator gt $(pkgx --version | awk '{print $2}') 1.0.0
152 changes: 152 additions & 0 deletions action.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
const { execSync } = require('child_process');
const semver = require('semver');
const https = require('https');
const path = require('path');
const tar = require('tar');
const fs = require('fs');
const os = require('os');

const dstdir = (() => {
try {
fs.accessSync('/usr/local/bin', fs.constants.W_OK);
return '/usr/local/bin';
} catch (err) {
return path.join(process.env.INPUT_PKGX_DIR || path.join(process.env.HOME, '.pkgx'), 'bin');
}
})();

fs.writeFileSync(process.env["GITHUB_PATH"], `${dstdir}\n`);

function platform_key() {
const platform = os.platform(); // 'darwin', 'linux', 'win32', etc.
let arch = os.arch(); // 'x64', 'arm64', etc.
if (arch == 'x64') arch = 'x86-64';
if (arch == 'arm64') arch = 'aarch64';
return `${platform}/${arch}`;
}

function downloadAndExtract(url, destination) {
return new Promise((resolve, reject) => {
https.get(url, (response) => {
if (response.statusCode !== 200) {
reject(new Error(`Failed to get '${url}' (${response.statusCode})`));
return;
}

console.log(`extracting tarball…`);

const tar_stream = tar.x({ cwd: destination, strip: 3 });

response
.pipe(tar_stream) // Extract directly to destination
.on('finish', resolve)
.on('error', reject);

tar_stream.on('error', reject);

}).on('error', reject);
});
}

function parse_pkgx_output(output) {

const stripQuotes = (str) =>
str.startsWith('"') || str.startsWith("'") ? str.slice(1, -1) : str;

const replaceEnvVars = (str) => {
const value = str
.replaceAll(
/\$\{([a-zA-Z0-9_]+):\+:\$[a-zA-Z0-9_]+\}/g,
(_, key) => ((v) => v ? `:${v}` : "")(process.env[key]),
)
.replaceAll(/\$\{([a-zA-Z0-9_]+)\}/g, (_, key) => process.env[key] ?? "")
.replaceAll(/\$([a-zA-Z0-9_]+)/g, (_, key) => process.env[key] ?? "");
return value;
};

for (const line of output.split("\n")) {
const match = line.match(/^([^=]+)=(.*)$/);
if (match) {
const [_, key, value_] = match;
const value = stripQuotes(value_);
if (key === "PATH") {
value
.replaceAll("${PATH:+:$PATH}", "")
.replaceAll("$PATH", "")
.replaceAll("${PATH}", "")
.split(":").forEach((path) => {
fs.appendFileSync(process.env["GITHUB_PATH"], `${path}\n`);
});
} else {
let v = replaceEnvVars(value);
fs.appendFileSync(process.env["GITHUB_ENV"], `${key}=${v}\n`);
}
}
}
}

async function install_pkgx() {
let url = `https://dist.pkgx.dev/pkgx.sh/${platform_key()}/versions.txt`;

console.log(`::group::installing ${dstdir}/pkgx`);
console.log(`fetching ${url}`);

const rsp = await fetch(url);
const txt = await rsp.text();

const versions = txt.split('\n');
const version = process.env.INPUT_VERSION
? semver.maxSatisfying(versions, process.env.INPUT_VERSION)
: versions.slice(-1)[0];

if (!version) {
throw new Error(`no version found for ${process.env.INPUT_VERSION}`);
}

console.log(`selected pkgx v${version}`);

url = `https://dist.pkgx.dev/pkgx.sh/${platform_key()}/v${version}.tar.gz`;

console.log(`fetching ${url}`);

if (!fs.existsSync(dstdir)) {
fs.mkdirSync(dstdir, {recursive: true});
}

await downloadAndExtract(url, dstdir);

console.log(`::endgroup::`);
}

(async () => {
await install_pkgx();

if (process.env.INPUT_PKGX_DIR) {
fs.appendFileSync(process.env["GITHUB_ENV"], `PKGX_DIR=${process.env.INPUT_PKGX_DIR}\n`);
}

if (os.platform() != 'darwin') {
console.log(`::group::installing pre-requisites`);
const installer_script_path = path.join(path.dirname(__filename), "installer.sh");
execSync(installer_script_path, {env: {PKGX_INSTALL_PREREQS: '1', ...process.env}});
console.log(`::endgroup::`);
}

if (process.env['INPUT_+']) {
console.log(`::group::installing pkgx input packages`);
const args = process.env['INPUT_+'].split(' ');
const cmd = `${dstdir}/pkgx ${args.map(x => `+${x}`).join(' ')}`;
console.log(`running: \`${cmd}\``);
let env = undefined;
if (process.env.INPUT_PKGX_DIR) {
env = process.env
env['PKGX_DIR'] = process.env.INPUT_PKGX_DIR;
}
const output = execSync(cmd, {env});
parse_pkgx_output(output.toString());
console.log(`::endgroup::`);
}
})().catch(err => {
console.error(`::error::${err.message}`)
process.exit(1);
});
Loading

0 comments on commit 8e49a29

Please sign in to comment.