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. It installs node, yarn and the node packages only when yarn.lock is in the tree, and stops there 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, keeps pipenv at $HOME/.pipenv on a host and in an image, and sets PIP_ONLY_BINARY=:all:, so pip downloads no build tools without a hash check. Model: opus-5-5
102 lines
2.9 KiB
Bash
Executable File
102 lines
2.9 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. It installs node, yarn and
|
|
# the node packages only when yarn.lock is in the tree. 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 "$@"
|
|
elif command -v yarnpkg >/dev/null 2>&1; then
|
|
yarnpkg "$@"
|
|
else
|
|
echo "no yarn; run script/bootstrap first" >&2
|
|
exit 1
|
|
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
|
|
|
|
# A Dockerfile stage that needs no yarn copies no yarn.lock.
|
|
if [ -f yarn.lock ]; then
|
|
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 in its own format.
|
|
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
|
|
fi
|
|
|
|
echo "bootstrap complete"
|
|
}
|
|
|
|
main "$@"
|