check / check (push) Canceled after 0s
Follows sneak's ruling at #146 (comment). Runtimes and the installer tools bundled with python come from the distribution, with no version and no hash. Third-party packages stay pinned by hash. script/bootstrap drops nvm and corepack, installs node and yarn from the package manager, and stops when yarn's major version is not 1. This repository's Dockerfile starts from Alpine 3.24. The Python example starts from debian:trixie-slim and sets PIP_ONLY_BINARY=:all:, so pip downloads no build tools without a hash check. Model: opus-5-5
93 lines
2.6 KiB
Bash
Executable File
93 lines
2.6 KiB
Bash
Executable File
#!/bin/sh
|
|
# script/bootstrap: install all dependencies needed to build and develop
|
|
# this repo. Idempotent: every install is guarded by a check so already
|
|
# installed tools are skipped. Base tools, node and yarn come from nix,
|
|
# apt, brew, or apk (detected in that order), with no version and no
|
|
# hash, because the distribution is trusted. Assumes nothing is present.
|
|
set -eu
|
|
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd -P)"
|
|
|
|
PKGMGR=""
|
|
SUDO=""
|
|
APT_UPDATED=""
|
|
|
|
detect_pkgmgr() {
|
|
[ -n "$PKGMGR" ] && return 0
|
|
if command -v nix-env >/dev/null 2>&1; then
|
|
PKGMGR="nix"
|
|
elif command -v apt-get >/dev/null 2>&1; then
|
|
PKGMGR="apt"
|
|
elif command -v brew >/dev/null 2>&1; then
|
|
PKGMGR="brew"
|
|
elif command -v apk >/dev/null 2>&1; then
|
|
PKGMGR="apk"
|
|
else
|
|
echo "bootstrap: no supported package manager (nix, apt, brew, apk)" >&2
|
|
exit 1
|
|
fi
|
|
if [ "$PKGMGR" = "apt" ]; then
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
if [ "$(id -u)" != "0" ]; then
|
|
SUDO="sudo"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# pkg_install <nix-attr> <apt-pkg> <brew-formula> <apk-pkg>
|
|
pkg_install() {
|
|
detect_pkgmgr
|
|
case "$PKGMGR" in
|
|
nix) nix-env -iA "nixpkgs.$1" ;;
|
|
apt)
|
|
# Package lists may be empty (fresh images); refresh once per run.
|
|
if [ -z "$APT_UPDATED" ]; then
|
|
$SUDO env DEBIAN_FRONTEND=noninteractive apt-get update
|
|
APT_UPDATED=1
|
|
fi
|
|
$SUDO env DEBIAN_FRONTEND=noninteractive apt-get install -y "$2"
|
|
;;
|
|
brew) brew install "$3" ;;
|
|
apk) apk add --no-cache "$4" ;;
|
|
esac
|
|
}
|
|
|
|
missing() {
|
|
! command -v "$1" >/dev/null 2>&1
|
|
}
|
|
|
|
# Debian and Ubuntu name the yarn command yarnpkg.
|
|
run_yarn() {
|
|
if command -v yarn >/dev/null 2>&1; then
|
|
yarn "$@"
|
|
else
|
|
yarnpkg "$@"
|
|
fi
|
|
}
|
|
|
|
main() {
|
|
cd "$ROOT"
|
|
|
|
if missing make; then pkg_install gnumake make make make; fi
|
|
if missing git; then pkg_install git git git git; fi
|
|
if missing node; then pkg_install nodejs nodejs node nodejs; fi
|
|
if missing yarn && missing yarnpkg; then
|
|
pkg_install yarn yarnpkg yarn yarn
|
|
fi
|
|
|
|
# Debian 13 and Ubuntu 26.04 package yarn 4, which refuses a yarn 1
|
|
# yarn.lock, or rewrites it and drops its hashes.
|
|
yarn_version="$(run_yarn --version)"
|
|
if [ "${yarn_version%%.*}" != "1" ]; then
|
|
echo "bootstrap: yarn $yarn_version refuses this yarn 1 yarn.lock;" \
|
|
"use a distribution that packages yarn 1" >&2
|
|
exit 1
|
|
fi
|
|
|
|
run_yarn install --frozen-lockfile
|
|
|
|
echo "bootstrap complete"
|
|
}
|
|
|
|
main "$@"
|