Skip to content

v1.2-rc

v1.2-rc #107

Workflow file for this run

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