v1.2-rc #107
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: ci·shellcode | |
on: | |
pull_request: | |
paths: | |
- src/modes/shellcode.* | |
- src/prefab/construct-env.* | |
- .github/workflows/ci.shellcode.yml | |
workflow_call: | |
concurrency: | |
group: ${{ github.ref }}/shellcode | |
cancel-in-progress: true | |
jobs: | |
compile: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: denoland/setup-deno@v1 | |
with: | |
deno-version: ^1.46 | |
- uses: actions/checkout@v4 | |
- run: deno task compile | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: pkgx | |
path: pkgx | |
#NOTE bash/zsh/POSIX jobs are duplicated because `shell` cannot be set by a matrix :-/ | |
bash: | |
needs: compile | |
runs-on: ubuntu-latest | |
container: debian:buster-slim | |
defaults: | |
run: | |
shell: bash -eo pipefail {0} | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
path: /usr/local/bin | |
name: pkgx | |
- name: prep | |
run: | | |
apt-get update && apt-get --yes install bash libatomic1 | |
chmod u+x /usr/local/bin/pkgx | |
- run: | | |
test -n "$BASH_VERSION" | |
echo $PATH | |
- name: ensure test specimens are not installed on the runners | |
run: | | |
if which duf node; then | |
exit 1 | |
fi | |
- name: env +duf doesn’t add duf until the shellcode is loaded | |
run: | | |
if env +duf; then | |
exit 1 | |
fi | |
if which duf node; then | |
exit 1 | |
fi | |
- name: test `env +foo` shellcode | |
run: | | |
eval "$(pkgx --shellcode)" | |
env +duf | |
duf --version | |
env -duf | |
# check deactivate has worked | |
if which duf; then | |
exit 3 | |
fi | |
- name: test `dev` shellcode | |
run: | | |
eval "$(pkgx --shellcode)" | |
echo '{}' > package.json | |
dev | |
node --version | |
cd .. | |
if which node; then | |
exit 4 | |
fi | |
cd - | |
node --version | |
#TODO need to be in the pantry first | |
# - name: pkgx@latest | |
# run: | | |
# eval "$(pkgx --shellcode)" | |
# pkgx@latest --version | |
- name: ~/.local/bin in PATH | |
run: | | |
mkdir -p ~/.local/bin | |
echo '#!/bin/sh' > ~/.local/bin/foo | |
echo 'echo hi' >> ~/.local/bin/foo | |
chmod u+x ~/.local/bin/foo | |
if foo; then | |
exit 1 | |
fi | |
eval "$(pkgx --shellcode)" | |
test $(foo) = hi | |
- name: POSIXLY_CORRECT | |
run: | | |
eval "$(pkgx --shellcode)" | |
env +duf | |
duf --version | |
shell: bash -eo posix {0} | |
zsh: | |
needs: compile | |
runs-on: ubuntu-latest | |
container: debian:buster-slim | |
defaults: | |
run: | |
shell: zsh -eo pipefail {0} | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
path: /usr/local/bin | |
name: pkgx | |
- name: prep | |
run: | | |
apt-get update && apt-get --yes install zsh libatomic1 | |
chmod u+x /usr/local/bin/pkgx | |
shell: sh # ∵ cannot be zsh until zsh is installed | |
# NOTE matrix does not work for the shell key :-/ | |
- run: | | |
test -n "$ZSH_VERSION" | |
echo $PATH | |
- run: | | |
if which duf node optipng; then | |
exit 1 | |
fi | |
name: ensure test specimens are not installed on the runners | |
- name: env +duf doesn’t add duf until the shellcode is loaded | |
run: | | |
if env +duf; then | |
exit 1 | |
fi | |
if which duf node; then | |
exit 1 | |
fi | |
- name: test `env +foo` shellcode | |
run: | | |
eval "$(pkgx --shellcode)" | |
env +duf | |
duf --version | |
env +optipng | |
optipng --version | |
env -duf -optipng | |
# check deactivate has worked | |
if which duf optipng >/dev/null; then | |
exit 3 | |
fi | |
- name: test `pkgx activate` shellcode | |
run: | | |
eval "$(pkgx --shellcode)" | |
echo '{}' > package.json | |
dev | |
node --version | |
cd .. | |
if which node >/dev/null; then | |
exit 4 | |
fi | |
cd - | |
node --version | |
# subfolders are still considered “in-env” | |
mkdir foo | |
cd foo | |
node --version | |
dev off | |
if which node >/dev/null; then | |
exit 5 | |
fi | |
#TODO need to be in the pantry first | |
# - name: pkgx@latest | |
# run: | | |
# eval "$(pkgx --shellcode)" | |
# pkgx@latest --version | |
- name: ~/.local/bin in PATH | |
run: | | |
mkdir -p ~/.local/bin | |
echo '#!/bin/sh' > ~/.local/bin/foo | |
echo 'echo hi' >> ~/.local/bin/foo | |
chmod u+x ~/.local/bin/foo | |
if foo; then | |
exit 1 | |
fi | |
eval "$(pkgx --shellcode)" | |
test $(foo) = hi | |
- name: emulate -L sh | |
run: | | |
emulate -L sh | |
eval "$(pkgx --shellcode)" | |
env +duf | |
duf --version | |
POSIX: | |
needs: compile | |
runs-on: ubuntu-latest | |
container: debian:buster-slim | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
path: /usr/local/bin | |
name: pkgx | |
- name: prep | |
run: | | |
apt-get update && apt-get --yes install libatomic1 | |
chmod u+x /usr/local/bin/pkgx | |
# NOTE matrix does not work for the shell key :-/ | |
- name: test `use` shellcode | |
run: | | |
# ensure test specimens are not installed on the runners | |
if which duf node; then | |
exit 1 | |
fi | |
# env +foo should not work until the shellcode is evaluated | |
if env +duf; then | |
exit 1 | |
fi | |
if which duf node; then | |
exit 1 | |
fi | |
eval "$(pkgx --shellcode)" | |
env +duf | |
duf --version | |
env +optipng | |
optipng --version | |
env -duf -optipng | |
# check env is now empty again | |
if which duf >/dev/null; then | |
exit 3 | |
fi | |
# verifies our assumption that we are running in “POSIX mode” | |
- name: pkgx@latest fails | |
run: | | |
eval "$(pkgx --shellcode)" | |
if pkgx@latest --version; then | |
exit 1 | |
fi | |
- name: test `dev` shellcode | |
run: | | |
eval "$(pkgx --shellcode)" | |
echo '{}' > package.json | |
dev | |
node --version | |
# ^^ POSIX mode cannot persist or deactivate activations | |
# verifies pkgx install installs the version being used | |
test-install: | |
needs: compile | |
runs-on: ubuntu-latest | |
container: debian:buster-slim | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
path: /usr/local/bin | |
name: pkgx | |
- name: prep | |
run: | | |
apt-get update && apt-get --yes install bash libatomic1 | |
chmod u+x /usr/local/bin/pkgx | |
- run: | | |
eval "$(pkgx --shellcode)" | |
env +node^16 | |
pkgx install | |
#TODO | |
#if pkgx -node; then | |
# exit 3 | |
#fi | |
node --version | grep v16 | |
shell: bash | |
test-plus-pkg-syntax: | |
runs-on: ubuntu-latest | |
needs: compile | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
path: /usr/local/bin | |
name: pkgx | |
- name: prep | |
run: | | |
chmod u+x /usr/local/bin/pkgx | |
- run: pkgx +ack node -e 'console.log()' | |
test-shebangs: | |
runs-on: ubuntu-latest | |
needs: compile | |
container: debian:buster-slim | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
path: /usr/local/bin | |
name: pkgx | |
- name: prep | |
run: | | |
apt-get update && apt-get --yes install bash libatomic1 | |
chmod u+x /usr/local/bin/pkgx | |
- run: | | |
echo '#!/usr/bin/env -S pkgx +ack node' > foo | |
echo 'console.log("sh.pkgx")' >> foo | |
chmod u+x foo | |
- run: test $(./foo) = 'sh.pkgx' | |
- run: if pkgx ./foo; then exit 1; fi | |
- run: if pkgx foo; then exit 1; fi | |
- run: | | |
echo '#!/usr/bin/env node' > foo | |
echo 'console.log("sh.pkgx")' >> foo | |
- run: test $(pkgx ./foo) = 'sh.pkgx' | |
- run: test $(pkgx foo) = 'sh.pkgx' | |
- run: if ./foo; then exit 1; fi | |
fork-bomb-protector-check: | |
runs-on: ubuntu-latest | |
needs: compile | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
path: /usr/local/bin | |
name: pkgx | |
# create a fork bomb, but since it’s via pkgx we prevent it | |
- run: | | |
echo '#!/bin/sh' > foo | |
echo 'pkgx -- /bin/sh "$0"' >> foo | |
chmod u+x foo | |
- run: | | |
if ./foo; then | |
exit 1 | |
fi | |
no-shell-output-if-no-tty: | |
needs: compile | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
path: /usr/local/bin | |
name: pkgx | |
- name: prep | |
run: chmod u+x /usr/local/bin/pkgx | |
#TODO ideally we'd test something that uses another tool in pkgx and | |
# is poorly written so it reads both stdout and stderr eg `lazygit` | |
# but CI doesn't have ttys and I couldn't figure out another way | |
# ref https://github.com/actions/runner/issues/241 | |
#NOTE CI has no ttys so the opposite test is v. hard to achieve | |
- run: | | |
pkgx echo 2> >(tee temp_file) >/dev/null | |
if [[ -s temp_file ]]; then | |
echo | |
echo 'pkgx output logging info when no tty present' >&2 | |
exit 1 | |
fi | |
cannot-multi-dev: | |
needs: compile | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
path: /usr/local/bin | |
name: pkgx | |
- name: prep | |
run: chmod u+x /usr/local/bin/pkgx | |
- run: echo '{}' > package.json | |
- run: | | |
eval "$(pkgx --shellcode)" | |
dev | |
if dev; then | |
echo 'dev did not fail when already activated' >&2 | |
exit 1 | |
fi | |
x-already-defined-works: | |
needs: compile | |
runs-on: ubuntu-latest | |
defaults: | |
run: | |
shell: zsh -eo pipefail {0} | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
path: /usr/local/bin | |
name: pkgx | |
- name: prep | |
run: | | |
sudo apt-get update && sudo apt-get --yes install zsh libatomic1 | |
chmod u+x /usr/local/bin/pkgx | |
shell: sh | |
- run: | | |
alias x="echo hi" | |
eval "$(pkgx --shellcode)" | |
test "$(x)" = hi |