mirror of
https://github.com/safedep/pmg.git
synced 2026-08-03 07:24:09 +02:00
ci: add Linux system-install e2e and pin pnpm for add flake
Cover root system setup, PATH/profile.d, managed config, non-root interception, and remove. Pin pnpm 11.10.0 on the package-manager e2e job after an integrity crash on pnpm add. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -49,6 +49,9 @@ jobs:
|
|||||||
|
|
||||||
- name: Setup PNPM
|
- name: Setup PNPM
|
||||||
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5
|
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5
|
||||||
|
with:
|
||||||
|
# Unpinned pnpm 11.x hit an integrity crash on `pnpm add`
|
||||||
|
version: 11.10.0
|
||||||
|
|
||||||
- name: Setup Bun
|
- name: Setup Bun
|
||||||
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
|
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
|
||||||
@@ -874,3 +877,111 @@ jobs:
|
|||||||
|
|
||||||
- name: Run Package Manager E2E Test
|
- name: Run Package Manager E2E Test
|
||||||
run: pmg --sandbox --sandbox-enforce npm exec -- node test/pm-e2e.js
|
run: pmg --sandbox --sandbox-enforce npm exec -- node test/pm-e2e.js
|
||||||
|
|
||||||
|
# Linux system-wide install: root install, ENV PATH (Docker-style), non-root user,
|
||||||
|
# managed config, and remove. Profile.d login shells are covered by sourcing the snippet.
|
||||||
|
e2e-system-install:
|
||||||
|
name: PMG E2E - System Install (Linux)
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 10
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
steps:
|
||||||
|
- name: Checkout Source
|
||||||
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6
|
||||||
|
with:
|
||||||
|
go-version-file: go.mod
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||||
|
with:
|
||||||
|
node-version: "24"
|
||||||
|
|
||||||
|
- name: Build PMG
|
||||||
|
run: make
|
||||||
|
|
||||||
|
- name: Reject private PMG binary for system install
|
||||||
|
run: |
|
||||||
|
sudo mkdir -p /root/pmg-private
|
||||||
|
sudo cp bin/pmg /root/pmg-private/pmg
|
||||||
|
sudo chmod 700 /root/pmg-private /root/pmg-private/pmg
|
||||||
|
if sudo /root/pmg-private/pmg setup install --system; then
|
||||||
|
echo "ERROR: system install accepted a non-world-executable binary"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "SUCCESS: private binary rejected"
|
||||||
|
|
||||||
|
- name: Install PMG system-wide
|
||||||
|
run: |
|
||||||
|
sudo install -m 755 bin/pmg /usr/local/bin/pmg
|
||||||
|
sudo pmg setup install --system
|
||||||
|
|
||||||
|
- name: Verify system install artifacts
|
||||||
|
run: |
|
||||||
|
test -f /etc/safedep/pmg/config.yml
|
||||||
|
test -f /etc/profile.d/pmg.sh
|
||||||
|
grep -q '/usr/local/lib/pmg/bin' /etc/profile.d/pmg.sh
|
||||||
|
for shim in npm pip pip3 pipx pnpm bun uv uvx yarn poetry npx pnpx; do
|
||||||
|
test -x "/usr/local/lib/pmg/bin/$shim" || { echo "Missing shim: $shim"; exit 1; }
|
||||||
|
done
|
||||||
|
|
||||||
|
- name: PATH and profile.d activate shims
|
||||||
|
run: |
|
||||||
|
# Docker-style: non-login shells need PATH (or source profile.d)
|
||||||
|
export PATH="/usr/local/lib/pmg/bin:$PATH"
|
||||||
|
which npm | grep -q '/usr/local/lib/pmg/bin/npm'
|
||||||
|
source /etc/profile.d/pmg.sh
|
||||||
|
which npm | grep -q '/usr/local/lib/pmg/bin/npm'
|
||||||
|
|
||||||
|
- name: Managed config refuses CLI mutation
|
||||||
|
run: |
|
||||||
|
if pmg config set dependency_cooldown.days 7; then
|
||||||
|
echo "ERROR: config set should fail under system config"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if sudo pmg config set dependency_cooldown.days 7; then
|
||||||
|
echo "ERROR: config set should fail under system config even as root"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "SUCCESS: managed config is locked"
|
||||||
|
|
||||||
|
- name: Doctor reports system install state
|
||||||
|
run: |
|
||||||
|
export PATH="/usr/local/lib/pmg/bin:$PATH"
|
||||||
|
out=$(pmg setup doctor 2>&1 || true)
|
||||||
|
echo "$out"
|
||||||
|
echo "$out" | grep -q 'No aliases (system install)'
|
||||||
|
echo "$out" | grep -q 'System shim directory is in PATH'
|
||||||
|
|
||||||
|
- name: Non-root user interception via system shims
|
||||||
|
run: |
|
||||||
|
sudo useradd -m pmgtest || true
|
||||||
|
# Pass runner PATH so setup-node's npm remains visible after FilterPMGFromPath.
|
||||||
|
sudo -u pmgtest env "PATH=/usr/local/lib/pmg/bin:$PATH" HOME=/home/pmgtest bash -lc '
|
||||||
|
set -euo pipefail
|
||||||
|
which npm | grep -q /usr/local/lib/pmg/bin/npm
|
||||||
|
mkdir -p "$HOME/sys-e2e" && cd "$HOME/sys-e2e"
|
||||||
|
npm init -y
|
||||||
|
if npm install --no-cache --prefer-online safedep-test-pkg@0.1.3; then
|
||||||
|
echo "ERROR: safedep-test-pkg was not blocked for non-root user"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ -d node_modules/safedep-test-pkg ]; then
|
||||||
|
echo "ERROR: safedep-test-pkg present in node_modules"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "SUCCESS: non-root user blocked malicious package via system shims"
|
||||||
|
'
|
||||||
|
|
||||||
|
- name: Remove system install
|
||||||
|
run: |
|
||||||
|
sudo pmg setup remove --system --config-file
|
||||||
|
test ! -e /etc/profile.d/pmg.sh
|
||||||
|
test ! -e /etc/safedep/pmg/config.yml
|
||||||
|
test ! -d /usr/local/lib/pmg/bin
|
||||||
|
echo "SUCCESS: system install removed"
|
||||||
|
|||||||
Reference in New Issue
Block a user