update build and release scripts to use uv

This commit is contained in:
Nick Sweeting 2024-10-05 01:17:23 -07:00
parent ce2e19a429
commit e29aff12bf
No known key found for this signature in database
10 changed files with 1292 additions and 2094 deletions

View file

@ -9,7 +9,7 @@ set -o errexit
set -o errtrace
set -o nounset
set -o pipefail
IFS=$'\n'
IFS=$' '
REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && pwd )"
cd "$REPO_DIR"
@ -18,15 +18,34 @@ which docker > /dev/null || exit 1
which jq > /dev/null || exit 1
# which pdm > /dev/null || exit 1
SUPPORTED_PLATFORMS="linux/amd64,linux/arm64"
TAG_NAME="${1:-$(git rev-parse --abbrev-ref HEAD)}"
declare -a TAG_NAMES="$*"
BRANCH_NAME="${1:-$(git rev-parse --abbrev-ref HEAD)}"
VERSION="$(jq -r '.version' < "$REPO_DIR/package.json")"
SHORT_VERSION="$(echo "$VERSION" | perl -pe 's/(\d+)\.(\d+)\.(\d+)/$1.$2/g')"
GIT_SHA=sha-"$(git rev-parse --short HEAD)"
SELECTED_PLATFORMS="${2:-$SUPPORTED_PLATFORMS}"
SELECTED_PLATFORMS="linux/amd64,linux/arm64"
echo "[+] Building Docker image: tag=$TAG_NAME version=$SHORT_VERSION arch=$SELECTED_PLATFORMS"
# if not already in TAG_NAMES, add GIT_SHA and BRANCH_NAME
if ! echo "${TAG_NAMES[@]}" | grep -q "$GIT_SHA"; then
TAG_NAMES+=("$GIT_SHA")
fi
if ! echo "${TAG_NAMES[@]}" | grep -q "$BRANCH_NAME"; then
TAG_NAMES+=("$BRANCH_NAME")
fi
if ! echo "${TAG_NAMES[@]}" | grep -q "$VERSION"; then
TAG_NAMES+=("$VERSION")
fi
echo "[+] Building Docker image for $SELECTED_PLATFORMS: branch=$BRANCH_NAME version=$VERSION tags=${TAG_NAMES[*]}"
declare -a FULL_TAG_NAMES
# for each tag in TAG_NAMES, add archivebox/archivebox:tag and nikisweeting/archivebox:tag to FULL_TAG_NAMES
for TAG_NAME in "${TAG_NAMES[@]}"; do
[[ "$TAG_NAME" == "" ]] && continue
FULL_TAG_NAMES+=("-t archivebox/archivebox:$TAG_NAME")
FULL_TAG_NAMES+=("-t nikisweeting/archivebox:$TAG_NAME")
FULL_TAG_NAMES+=("-t ghcr.io/archivebox/archivebox:$TAG_NAME")
done
echo "${FULL_TAG_NAMES[@]}"
function check_platforms() {
INSTALLED_PLATFORMS="$(docker buildx inspect | grep 'Platforms:' )"
@ -72,30 +91,13 @@ check_platforms || (recreate_builder && check_platforms) || exit 1
# Make sure pyproject.toml, pdm{.dev}.lock, requirements{-dev}.txt, package{-lock}.json are all up-to-date
echo "[!] Make sure you've run ./bin/lock_pkgs.sh recently!"
sleep 1
# bash ./bin/lock_pkgs.sh
# echo "[!] Make sure you've run ./bin/lock_pkgs.sh recently!"
bash ./bin/lock_pkgs.sh
echo "[+] Building archivebox:$VERSION docker image..."
# docker builder prune
# docker build . --no-cache -t archivebox-dev \
# replace --load with --push to deploy
docker buildx build --platform "$SELECTED_PLATFORMS" --load . \
-t archivebox/archivebox:$TAG_NAME \
-t archivebox/archivebox:$GIT_SHA \
-t nikisweeting/archivebox:$TAG_NAME \
-t nikisweeting/archivebox:$GIT_SHA \
-t ghcr.io/archivebox/archivebox:$TAG_NAME \
-t ghcr.io/archivebox/archivebox:$GIT_SHA
# -t archivebox/archivebox \
# -t archivebox/archivebox:$VERSION \
# -t archivebox/archivebox:$SHORT_VERSION \
# -t archivebox/archivebox:latest \
# -t nikisweeting/archivebox \
# -t nikisweeting/archivebox:$VERSION \
# -t nikisweeting/archivebox:$SHORT_VERSION \
# -t nikisweeting/archivebox:latest \
# -t ghcr.io/archivebox/archivebox:$VERSION \
# -t ghcr.io/archivebox/archivebox:$SHORT_VERSION \
# -t ghcr.io/archivebox/archivebox:latest
# shellcheck disable=SC2068
docker buildx build --platform "$SELECTED_PLATFORMS" --load . ${FULL_TAG_NAMES[@]}

View file

@ -26,8 +26,8 @@ git pull
cd "$REPO_DIR"
echo "[+] Building docs"
sphinx-apidoc -o docs archivebox
cd "$REPO_DIR/docs"
make clean
make html
# open docs/_build/html/index.html to see the output
cd "$REPO_DIR"

View file

@ -11,21 +11,15 @@ set -o pipefail
IFS=$'\n'
REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && pwd )"
if [[ -f "$REPO_DIR/.venv/bin/activate" ]]; then
source "$REPO_DIR/.venv/bin/activate"
else
echo "[!] Warning: No virtualenv presesnt in $REPO_DIR/.venv, creating one now..."
python3 -m venv --system-site-packages --symlinks $REPO_DIR/.venv
fi
cd "$REPO_DIR"
# Generate pdm.lock, requirements.txt, and package-lock.json
bash ./bin/lock_pkgs.sh
source .venv/bin/activate
echo "[+] Building sdist, bdist_wheel, and egg_info"
rm -Rf build dist
pdm build
uv build
cp dist/* ./pip_dist/
echo

View file

@ -32,52 +32,40 @@ echo
echo "[*] Cleaning up old lockfiles and build files"
deactivate 2>/dev/null || true
rm -Rf build dist
rm -f pdm.lock
rm -f pdm.dev.lock
rm -f uv.lock
rm -f requirements.txt
rm -f requirements-dev.txt
rm -f package-lock.json
rm -f archivebox/package.json
rm -f archivebox/package-lock.json
rm -Rf ./.venv
rm -Rf ./node_modules
rm -Rf ./archivebox/node_modules
# rm -Rf ./.venv
# rm -Rf ./node_modules
# rm -Rf ./archivebox/node_modules
echo
echo
echo "[+] Generating dev & prod requirements.txt & pdm.lock from pyproject.toml..."
pip install --upgrade pip setuptools
pdm self update >/dev/null 2>&1 || true
pdm venv create 3.12
uv venv --python 3.12
source .venv/bin/activate
echo
echo "pyproject.toml: archivebox $(grep 'version = ' pyproject.toml | awk '{print $3}' | jq -r)"
echo "$(which python): $(python --version | head -n 1)"
echo "$(which pdm): $(pdm --version | head -n 1)"
pdm info --env
pdm info
echo "$(which uv): $(uv --version | head -n 1)"
echo
# https://pdm-project.org/latest/usage/lockfile/
# prod
pdm lock --group=':all' --production --lockfile pdm.lock --python="==3.12.*" --platform=linux
pdm lock --group=':all' --production --lockfile pdm.lock --python="==3.12.*" --platform=macos --append
pdm sync --group=':all' --production --lockfile pdm.lock --clean
pdm export --group=':all' --production --lockfile pdm.lock --without-hashes -o requirements.txt
# cp ./pdm.lock ./pip_dist/
# cp ./requirements.txt ./pip_dist/
# dev
pdm lock --group=':all' --dev --lockfile pdm.dev.lock --python="==3.12.*" --platform=linux
pdm lock --group=':all' --dev --lockfile pdm.dev.lock --python="==3.12.*" --platform=macos --append
pdm sync --group=':all' --dev --lockfile pdm.dev.lock --clean
pdm export --group=':all' --dev --lockfile pdm.dev.lock --without-hashes -o requirements-dev.txt
# cp ./pdm.dev.lock ./pip_dist/
# cp ./requirements-dev.txt ./pip_dist/
uv lock
uv pip compile pyproject.toml --all-extras -o requirements.txt >/dev/null
uv sync --all-extras --frozen 2>/dev/null
echo
echo "[+] Generating package-lock.json from package.json..."
npm install -g npm
npm config set fund false --location=global &
npm config set fund false &
npm config set audit false --location=global &
npm config set audit false &
echo
echo "package.json: archivebox $(jq -r '.version' package.json)"
echo
@ -85,7 +73,7 @@ echo "$(which node): $(node --version | head -n 1)"
echo "$(which npm): $(npm --version | head -n 1)"
echo
npm install --package-lock-only
npm install --package-lock-only --prefer-offline
cp package.json archivebox/package.json
cp package-lock.json archivebox/package-lock.json
@ -93,10 +81,8 @@ echo
echo "[√] Finished. Don't forget to commit the new lockfiles:"
echo
ls "pyproject.toml" | cat
ls "pdm.lock" | cat
ls "pdm.dev.lock" | cat
ls "requirements.txt" | cat
ls "requirements-dev.txt" | cat
ls "uv.lock" | cat
echo
ls "package.json" | cat
ls "package-lock.json" | cat

View file

@ -8,43 +8,47 @@ set -o errexit
set -o errtrace
set -o nounset
set -o pipefail
IFS=$'\n'
IFS=$' '
REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && pwd )"
cd "$REPO_DIR"
SUPPORTED_PLATFORMS="linux/amd64,linux/arm64" # no longer supported: linux/arm/v7
TAG_NAME="${1:-$(git rev-parse --abbrev-ref HEAD)}"
declare -a TAG_NAMES="$*"
BRANCH_NAME="${1:-$(git rev-parse --abbrev-ref HEAD)}"
VERSION="$(jq -r '.version' < "$REPO_DIR/package.json")"
SHORT_VERSION="$(echo "$VERSION" | perl -pe 's/(\d+)\.(\d+)\.(\d+)/$1.$2/g')"
GIT_SHA=sha-"$(git rev-parse --short HEAD)"
SELECTED_PLATFORMS="${2:-$SUPPORTED_PLATFORMS}"
SELECTED_PLATFORMS="linux/amd64,linux/arm64"
# if not already in TAG_NAMES, add GIT_SHA and BRANCH_NAME
if ! echo "${TAG_NAMES[@]}" | grep -q "$GIT_SHA"; then
TAG_NAMES+=("$GIT_SHA")
fi
if ! echo "${TAG_NAMES[@]}" | grep -q "$BRANCH_NAME"; then
TAG_NAMES+=("$BRANCH_NAME")
fi
if ! echo "${TAG_NAMES[@]}" | grep -q "$VERSION"; then
TAG_NAMES+=("$VERSION")
fi
echo "[+] Building + releasing Docker image for $SELECTED_PLATFORMS: branch=$BRANCH_NAME version=$VERSION tags=${TAG_NAMES[*]}"
declare -a FULL_TAG_NAMES
# for each tag in TAG_NAMES, add archivebox/archivebox:tag and nikisweeting/archivebox:tag to FULL_TAG_NAMES
for TAG_NAME in "${TAG_NAMES[@]}"; do
[[ "$TAG_NAME" == "" ]] && continue
FULL_TAG_NAMES+=("-t archivebox/archivebox:$TAG_NAME")
FULL_TAG_NAMES+=("-t nikisweeting/archivebox:$TAG_NAME")
FULL_TAG_NAMES+=("-t ghcr.io/archivebox/archivebox:$TAG_NAME")
done
echo "${FULL_TAG_NAMES[@]}"
./bin/lock_pkgs.sh
# echo "[*] Logging in to Docker Hub & Github Container Registry"
# docker login --username=nikisweeting
# docker login ghcr.io --username=pirate
# echo "[^] Building docker image"
# ./bin/build_docker.sh "$TAG_NAME" "$SELECTED_PLATFORMS"
echo "[^] Uploading docker image"
docker buildx build --platform "$SELECTED_PLATFORMS" --push . \
-t archivebox/archivebox:"$TAG_NAME" \
-t archivebox/archivebox:"$GIT_SHA" \
-t nikisweeting/archivebox:"$TAG_NAME" \
-t nikisweeting/archivebox:"$GIT_SHA" \
-t ghcr.io/archivebox/archivebox:"$TAG_NAME" \
-t ghcr.io/archivebox/archivebox:"$GIT_SHA"
# -t archivebox/archivebox \
# -t archivebox/archivebox:$VERSION \
# -t archivebox/archivebox:$SHORT_VERSION \
# -t archivebox/archivebox:latest \
# -t nikisweeting/archivebox \
# -t nikisweeting/archivebox:$VERSION \
# -t nikisweeting/archivebox:$SHORT_VERSION \
# -t nikisweeting/archivebox:latest \
# -t ghcr.io/archivebox/archivebox:$VERSION \
# -t ghcr.io/archivebox/archivebox:$SHORT_VERSION \
# shellcheck disable=SC2068
docker buildx build --platform "$SELECTED_PLATFORMS" --push . ${FULL_TAG_NAMES[@]}

View file

@ -14,8 +14,5 @@ REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && p
cd "$REPO_DIR"
source "$REPO_DIR/.venv/bin/activate"
echo "[^] Publishing to Test PyPI..."
pdm publish --repository testpypi
echo "[^] Publishing to PyPI..."
pdm publish --no-build
uv publish