diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 195cf625d6..e10609b7ff 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -18,6 +18,6 @@ jobs: - name: Install ghp-import run: pip install ghp-import - name: Build documentation - run: "./pants docs ::" + run: "pants docs ::" - name: Publish Documentation run: ghp-import --push --force --no-history --no-jekyll dist/sphinx/ diff --git a/Dockerfile b/Dockerfile index 8983c9ffe5..abd4587afc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,8 +24,9 @@ ENV \ POETRY_VIRTUALENVS_CREATE=false \ POETRY_CACHE_DIR='/tmp/cache/poetry' \ POETRY_HOME='/home/mitodl/.local' \ - VIRTUAL_ENV="/opt/venv" -ENV PATH="$VIRTUAL_ENV/bin:$POETRY_HOME/bin:$PATH" + VIRTUAL_ENV="/opt/venv"\ + PANTS_HOME="/root/.local/bin" +ENV PATH="$PANTS_HOME:$VIRTUAL_ENV/bin:$POETRY_HOME/bin:$PATH" # Install project packages COPY pyproject.toml /app diff --git a/pants.toml b/pants.toml index d68722ca4f..88cc5474f1 100644 --- a/pants.toml +++ b/pants.toml @@ -5,7 +5,7 @@ backend_packages = [ # local plugins "mitol.docs" ] -pants_version = "2.17.1" +pants_version = "2.24.2" pythonpath = ["%(buildroot)s/pants-plugins"] [anonymous-telemetry] diff --git a/scripts/get-pants.sh b/scripts/get-pants.sh new file mode 100644 index 0000000000..4e1121097e --- /dev/null +++ b/scripts/get-pants.sh @@ -0,0 +1,212 @@ +#!/usr/bin/env bash +# Copyright 2023 Pants project contributors (see CONTRIBUTORS.md). +# Licensed under the Apache License, Version 2.0 (see LICENSE). + +set -euo pipefail + +COLOR_RED="\x1b[31m" +COLOR_GREEN="\x1b[32m" +COLOR_YELLOW="\x1b[33m" +COLOR_RESET="\x1b[0m" + +function log() { + echo -e "$@" 1>&2 +} + +function die() { + (($# > 0)) && log "${COLOR_RED}$*${COLOR_RESET}" + exit 1 +} + +function green() { + (($# > 0)) && log "${COLOR_GREEN}$*${COLOR_RESET}" +} + +function warn() { + (($# > 0)) && log "${COLOR_YELLOW}$*${COLOR_RESET}" +} + +function check_cmd() { + local cmd="$1" + command -v "$cmd" >/dev/null || die "This script requires the ${cmd} binary to be on the PATH." +} + +help_url="https://www.pantsbuild.org/docs/getting-help" + +_GC=() + +function gc() { + if (($# > 0)); then + check_cmd rm + _GC+=("$@") + else + rm -rf "${_GC[@]}" + fi +} + +trap gc EXIT + +check_cmd uname + +function calculate_os() { + local os + + os="$(uname -s)" + if [[ ${os} =~ [Ll]inux ]]; then + echo linux + elif [[ ${os} =~ [Dd]arwin ]]; then + echo macos + elif [[ ${os} =~ [Ww]in|[Mm][Ii][Nn][Gg] ]]; then + # Powershell reports something like: Windows_NT + # Git bash reports something like: MINGW64_NT-10.0-22621 + echo windows + else + die "Pants is not supported on this operating system (${os}). Please reach out to us at ${help_url} for help." + fi +} + +OS="$(calculate_os)" + +check_cmd basename +if [[ ${OS} == "windows" ]]; then + check_cmd pwsh +else + check_cmd curl +fi + +function fetch() { + local url="$1" + local dest_dir="$2" + + local dest + dest="${dest_dir}/$(basename "${url}")" + + if [[ ${OS} == "windows" ]]; then + pwsh -c "Invoke-WebRequest -OutFile $dest -Uri $url" + else + curl --proto '=https' --tlsv1.2 -sSfL -o "${dest}" "${url}" + fi +} + +if [[ ${OS} == "macos" ]]; then + check_cmd shasum +else + check_cmd sha256sum +fi + +function sha256() { + if [[ ${OS} == "macos" ]]; then + shasum --algorithm 256 "$@" + else + sha256sum "$@" + fi +} + +check_cmd mktemp + +function install_from_url() { + local url="$1" + local dest="$2" + + local workdir + workdir="$(mktemp -d)" + gc "${workdir}" + + fetch "${url}.sha256" "${workdir}" + fetch "${url}" "${workdir}" + ( + cd "${workdir}" + sha256 -c --status ./*.sha256 || + die "Download from ${url} did not match the fingerprint at ${url}.sha256" + ) + rm "${workdir}/"*.sha256 + if [[ ${OS} == "macos" ]]; then + mkdir -p "$(dirname "${dest}")" + install -m 755 "${workdir}/"* "${dest}" + else + install -D -m 755 "${workdir}/"* "${dest}" + fi +} + +function calculate_arch() { + local arch + + arch="$(uname -m)" + if [[ ${arch} =~ x86[_-]64 ]]; then + echo x86_64 + elif [[ ${arch} =~ arm64|aarch64 ]]; then + echo aarch64 + else + die "Pants is not supported for this chip architecture (${arch}). Please reach out to us at ${help_url} for help." + fi +} + +check_cmd cat + +function usage() { + cat < 0)); do + case "$1" in + --help | -h) + usage + exit 0 + ;; + --bin-dir | -d) + bin_dir="$2" + shift + ;; + --base-name | -b) + base_name="$2" + shift + ;; + --version | -V) + version="download/v$2" + shift + ;; + *) + usage + die "Unexpected argument $1\n" + ;; + esac + shift +done + +ARCH="$(calculate_arch)" +URL="https://github.com/pantsbuild/scie-pants/releases/${version}/scie-pants-${OS}-${ARCH}" +dest="${bin_dir}/${base_name}" + +log "Downloading and installing the pants launcher ..." +install_from_url "${URL}" "${dest}" +green "Installed the pants launcher from ${URL} to ${dest}" +if ! command -v "${base_name}" >/dev/null; then + warn "${dest} is not on the PATH." + log "You'll either need to invoke ${dest} explicitly or else add ${bin_dir} to your shell's PATH." +fi + +green "\nRunning \`pants\` in a Pants-enabled repo will use the version of Pants configured for that repo." +green "In a repo not yet Pants-enabled, it will prompt you to set up Pants for that repo."