mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c08cad592d | |||
| c9504ffd2e | |||
| 96822983ed | |||
| f9d5c0010d | |||
| 9b1a69a1b3 | |||
| 58dd638fb6 | |||
| ead59ac7ff |
@@ -3,6 +3,11 @@
|
|||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
|
||||||
|
## v184 (2020-10-21)
|
||||||
|
|
||||||
|
- Vendor buildpack-stdlib instead of fetching from S3 (#1100).
|
||||||
|
- Fix metric names for metrics emitted within `sub_env` (#1099).
|
||||||
|
|
||||||
## v183 (2020-10-12)
|
## v183 (2020-10-12)
|
||||||
|
|
||||||
- Add support for Heroku-20 (#968).
|
- Add support for Heroku-20 (#968).
|
||||||
|
|||||||
+13
-13
@@ -3,13 +3,13 @@ GEM
|
|||||||
specs:
|
specs:
|
||||||
diff-lcs (1.4.4)
|
diff-lcs (1.4.4)
|
||||||
erubis (2.7.0)
|
erubis (2.7.0)
|
||||||
excon (0.76.0)
|
excon (0.78.0)
|
||||||
heroics (0.1.1)
|
heroics (0.1.1)
|
||||||
erubis (~> 2.0)
|
erubis (~> 2.0)
|
||||||
excon
|
excon
|
||||||
moneta
|
moneta
|
||||||
multi_json (>= 1.9.2)
|
multi_json (>= 1.9.2)
|
||||||
heroku_hatchet (7.3.1)
|
heroku_hatchet (7.3.3)
|
||||||
excon (~> 0)
|
excon (~> 0)
|
||||||
platform-api (~> 3)
|
platform-api (~> 3)
|
||||||
rrrretry (~> 1)
|
rrrretry (~> 1)
|
||||||
@@ -28,21 +28,21 @@ GEM
|
|||||||
rake (13.0.1)
|
rake (13.0.1)
|
||||||
rate_throttle_client (0.1.2)
|
rate_throttle_client (0.1.2)
|
||||||
rrrretry (1.0.0)
|
rrrretry (1.0.0)
|
||||||
rspec (3.9.0)
|
rspec (3.10.0)
|
||||||
rspec-core (~> 3.9.0)
|
rspec-core (~> 3.10.0)
|
||||||
rspec-expectations (~> 3.9.0)
|
rspec-expectations (~> 3.10.0)
|
||||||
rspec-mocks (~> 3.9.0)
|
rspec-mocks (~> 3.10.0)
|
||||||
rspec-core (3.9.2)
|
rspec-core (3.10.0)
|
||||||
rspec-support (~> 3.9.3)
|
rspec-support (~> 3.10.0)
|
||||||
rspec-expectations (3.9.2)
|
rspec-expectations (3.10.0)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.9.0)
|
rspec-support (~> 3.10.0)
|
||||||
rspec-mocks (3.9.1)
|
rspec-mocks (3.10.0)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.9.0)
|
rspec-support (~> 3.10.0)
|
||||||
rspec-retry (0.6.2)
|
rspec-retry (0.6.2)
|
||||||
rspec-core (> 3.3)
|
rspec-core (> 3.3)
|
||||||
rspec-support (3.9.3)
|
rspec-support (3.10.0)
|
||||||
thor (1.0.1)
|
thor (1.0.1)
|
||||||
threaded (0.0.4)
|
threaded (0.0.4)
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
.PHONY: check test builder-image buildenv deploy-runtimes tools
|
.PHONY: check test builder-image buildenv deploy-runtimes tools
|
||||||
|
|
||||||
STACK ?= heroku-18
|
STACK ?= heroku-18
|
||||||
STACKS ?= cedar-14 heroku-16 heroku-18
|
STACKS ?= cedar-14 heroku-16 heroku-18 heroku-20
|
||||||
TEST_CMD ?= test/run-versions && test/run-features && test/run-deps
|
TEST_CMD ?= test/run-versions && test/run-features && test/run-deps
|
||||||
ENV_FILE ?= builds/dockerenv.default
|
ENV_FILE ?= builds/dockerenv.default
|
||||||
BUILDER_IMAGE_PREFIX := heroku-python-build
|
BUILDER_IMAGE_PREFIX := heroku-python-build
|
||||||
|
|||||||
+2
-4
@@ -15,10 +15,8 @@
|
|||||||
# Fail fast and fail hard.
|
# Fail fast and fail hard.
|
||||||
set -eo pipefail
|
set -eo pipefail
|
||||||
|
|
||||||
# Boostrap the Buildpack Standard Library.
|
# Used by buildpack-stdlib's metrics features.
|
||||||
# Disable unused env var warning since shellcheck doesn't know about the stdlib.
|
export BPLOG_PREFIX="buildpack.python"
|
||||||
# shellcheck disable=2034
|
|
||||||
BPLOG_PREFIX="buildpack.python"
|
|
||||||
export BUILDPACK_LOG_FILE=${BUILDPACK_LOG_FILE:-/dev/null}
|
export BUILDPACK_LOG_FILE=${BUILDPACK_LOG_FILE:-/dev/null}
|
||||||
|
|
||||||
[ "$BUILDPACK_XTRACE" ] && set -o xtrace
|
[ "$BUILDPACK_XTRACE" ] && set -o xtrace
|
||||||
|
|||||||
@@ -2,12 +2,13 @@
|
|||||||
shopt -s extglob
|
shopt -s extglob
|
||||||
shopt -s nullglob
|
shopt -s nullglob
|
||||||
|
|
||||||
# The standard library.
|
# This is necessary since this script is sometimes sourced from
|
||||||
if [[ ! -f /tmp/stdlib.sh ]]; then
|
# subshells that don't have the variables from bin/compile.
|
||||||
curl --retry 3 -s https://lang-common.s3.amazonaws.com/buildpack-stdlib/v8/stdlib.sh > /tmp/stdlib.sh
|
# Remove this once we no longer wrap all the things in `sub_env`.
|
||||||
fi
|
BIN_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||||
# shellcheck source=/dev/null
|
ROOT_DIR=$(dirname "${BIN_DIR}")
|
||||||
source /tmp/stdlib.sh
|
# shellcheck source=vendor/buildpack-stdlib_v8.sh
|
||||||
|
source "${ROOT_DIR}/vendor/buildpack-stdlib_v8.sh"
|
||||||
|
|
||||||
if [ "$(uname)" == Darwin ]; then
|
if [ "$(uname)" == Darwin ]; then
|
||||||
sed() { command sed -l "$@"; }
|
sed() { command sed -l "$@"; }
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ testHooks() {
|
|||||||
local expected_env_vars=(
|
local expected_env_vars=(
|
||||||
_
|
_
|
||||||
BIN_DIR
|
BIN_DIR
|
||||||
|
BPLOG_PREFIX
|
||||||
BUILD_DIR
|
BUILD_DIR
|
||||||
BUILDPACK_LOG_FILE
|
BUILDPACK_LOG_FILE
|
||||||
CACHE_DIR
|
CACHE_DIR
|
||||||
|
|||||||
+195
@@ -0,0 +1,195 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# From:
|
||||||
|
# https://raw.githubusercontent.com/heroku/buildpack-stdlib/v8/stdlib.sh
|
||||||
|
|
||||||
|
# Buildpack defaults
|
||||||
|
# ---------------
|
||||||
|
|
||||||
|
export BUILDPACK_LOG_FILE="${BUILDPACK_LOG_FILE:-/dev/null}"
|
||||||
|
|
||||||
|
# Standard Output
|
||||||
|
# ---------------
|
||||||
|
|
||||||
|
# Buildpack Steps.
|
||||||
|
puts_step() {
|
||||||
|
if [[ "$*" == "-" ]]; then
|
||||||
|
read -r output
|
||||||
|
else
|
||||||
|
output=$*
|
||||||
|
fi
|
||||||
|
echo -e "\\e[1m\\e[36m=== $output\\e[0m"
|
||||||
|
unset output
|
||||||
|
}
|
||||||
|
|
||||||
|
# Buildpack Error.
|
||||||
|
puts_error() {
|
||||||
|
if [[ "$*" == "-" ]]; then
|
||||||
|
read -r output
|
||||||
|
else
|
||||||
|
output=$*
|
||||||
|
fi
|
||||||
|
echo -e "\\e[1m\\e[31m=!= $output\\e[0m"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Buildpack Warning.
|
||||||
|
puts_warn() {
|
||||||
|
if [[ "$*" == "-" ]]; then
|
||||||
|
read -r output
|
||||||
|
else
|
||||||
|
output=$*
|
||||||
|
fi
|
||||||
|
echo -e "\\e[1m\\e[33m=!= $output\\e[0m"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Is verbose set?
|
||||||
|
is_verbose() {
|
||||||
|
if [[ -n $BUILDPACK_VERBOSE ]]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Buildpack Verbose.
|
||||||
|
puts_verbose() {
|
||||||
|
if is_verbose; then
|
||||||
|
if [[ "$*" == "-" ]]; then
|
||||||
|
read -r output
|
||||||
|
else
|
||||||
|
output=$*
|
||||||
|
fi
|
||||||
|
echo "$output"
|
||||||
|
unset output
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Buildpack Utilities
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
# Usage: $ set-env key value
|
||||||
|
# NOTICE: Expects PROFILE_PATH & EXPORT_PATH to be set!
|
||||||
|
set_env() {
|
||||||
|
# TODO: automatically create profile path directory if it doesn't exist.
|
||||||
|
echo "export $1=$2" >> "$PROFILE_PATH"
|
||||||
|
echo "export $1=$2" >> "$EXPORT_PATH"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Usage: $ set-default-env key value
|
||||||
|
# NOTICE: Expects PROFILE_PATH & EXPORT_PATH to be set!
|
||||||
|
set_default_env() {
|
||||||
|
echo "export $1=\${$1:-$2}" >> "$PROFILE_PATH"
|
||||||
|
echo "export $1=\${$1:-$2}" >> "$EXPORT_PATH"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Usage: $ un-set-env key
|
||||||
|
# NOTICE: Expects PROFILE_PATH to be set!
|
||||||
|
un_set_env() {
|
||||||
|
echo "unset $1" >> "$PROFILE_PATH"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Usage: $ _env-blacklist pattern
|
||||||
|
# Outputs a regex of default blacklist env vars.
|
||||||
|
_env_blacklist() {
|
||||||
|
local regex=${1:-''}
|
||||||
|
if [ -n "$regex" ]; then
|
||||||
|
regex="|$regex"
|
||||||
|
fi
|
||||||
|
echo "^(PATH|GIT_DIR|CPATH|CPPATH|LD_PRELOAD|LIBRARY_PATH$regex)$"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Usage: $ export-env ENV_DIR WHITELIST BLACKLIST
|
||||||
|
# Exports the environment variables defined in the given directory.
|
||||||
|
export_env() {
|
||||||
|
local env_dir=${1:-$ENV_DIR}
|
||||||
|
local whitelist=${2:-''}
|
||||||
|
local blacklist
|
||||||
|
blacklist="$(_env_blacklist "$3")"
|
||||||
|
if [ -d "$env_dir" ]; then
|
||||||
|
# Environment variable names won't contain characters affected by:
|
||||||
|
# shellcheck disable=SC2045
|
||||||
|
for e in $(ls "$env_dir"); do
|
||||||
|
echo "$e" | grep -E "$whitelist" | grep -qvE "$blacklist" &&
|
||||||
|
export "$e=$(cat "$env_dir/$e")"
|
||||||
|
:
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Usage: $ sub-env command
|
||||||
|
# Runs a subshell of specified command with user-provided config.
|
||||||
|
# NOTICE: Expects ENV_DIR to be set. WHITELIST & BLACKLIST are optional.
|
||||||
|
# Examples:
|
||||||
|
# WHITELIST=${2:-''}
|
||||||
|
# BLACKLIST=${3:-'^(GIT_DIR|PYTHONHOME|LD_LIBRARY_PATH|LIBRARY_PATH|PATH)$'}
|
||||||
|
sub_env() {
|
||||||
|
(
|
||||||
|
# TODO: Fix https://github.com/heroku/buildpack-stdlib/issues/37
|
||||||
|
# shellcheck disable=SC2153
|
||||||
|
export_env "$ENV_DIR" "$WHITELIST" "$BLACKLIST"
|
||||||
|
|
||||||
|
"$@"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
# -------
|
||||||
|
|
||||||
|
# Notice: These functions expect BPLOG_PREFIX and BUILDPACK_LOG_FILE to be defined (BUILDPACK_LOG_FILE can point to /dev/null if not provided by the buildpack).
|
||||||
|
# Example: BUILDPACK_LOG_FILE=${BUILDPACK_LOG_FILE:-/dev/null}; BPLOG_PREFIX="buildpack.go"
|
||||||
|
|
||||||
|
# Returns now, in milleseconds. Useful for logging.
|
||||||
|
# Example: $ let start=$(nowms); sleep 30; mtime "glide.install.time" "${start}"
|
||||||
|
nowms() {
|
||||||
|
date +%s%3N
|
||||||
|
}
|
||||||
|
|
||||||
|
# Log arbitrary data to the logfile (e.g. a packaging file).
|
||||||
|
# Usage: $ bplog "$(<${vendorJSON})
|
||||||
|
bplog() {
|
||||||
|
echo -n "${@}" | awk 'BEGIN {printf "msg=\""; f="%s"} {gsub(/"/, "\\\"", $0); printf f, $0} {if (NR == 1) f="\\n%s" } END { print "\"" }' >> "${BUILDPACK_LOG_FILE}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Measures time elapsed for a specific build step.
|
||||||
|
# Usage: $ let start=$(nowms); mtime "glide.install.time" "${start}"
|
||||||
|
# https://github.com/heroku/engineering-docs/blob/master/guides/logs-as-data.md#distributions-measure
|
||||||
|
mtime() {
|
||||||
|
local key="${BPLOG_PREFIX}.${1}"
|
||||||
|
local start="${2}"
|
||||||
|
local end="${3:-$(nowms)}"
|
||||||
|
echo "${key} ${start} ${end}" | awk '{ printf "measure#%s=%.3f\n", $1, ($3 - $2)/1000 }' >> "${BUILDPACK_LOG_FILE}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Logs a count for a specific built step.
|
||||||
|
# Usage: $ mcount "tool.govendor"
|
||||||
|
# https://github.com/heroku/engineering-docs/blob/master/guides/logs-as-data.md#counting-count
|
||||||
|
mcount() {
|
||||||
|
local k="${BPLOG_PREFIX}.${1}"
|
||||||
|
local v="${2:-1}"
|
||||||
|
echo "count#${k}=${v}" >> "${BUILDPACK_LOG_FILE}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Logs a measure for a specific build step.
|
||||||
|
# Usage: $ mmeasure "tool.installed_dependencies" 42
|
||||||
|
# https://github.com/heroku/engineering-docs/blob/master/guides/logs-as-data.md#distributions-measure
|
||||||
|
mmeasure() {
|
||||||
|
local k="${BPLOG_PREFIX}.${1}"
|
||||||
|
local v="${2}"
|
||||||
|
echo "measure#${k}=${v}" >> "${BUILDPACK_LOG_FILE}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Logs a unuique measurement build step.
|
||||||
|
# Usage: $ munique "versions.count" 2.7.13
|
||||||
|
# https://github.com/heroku/engineering-docs/blob/master/guides/logs-as-data.md#uniques-unique
|
||||||
|
munique() {
|
||||||
|
local k="${BPLOG_PREFIX}.${1}"
|
||||||
|
local v="${2}"
|
||||||
|
echo "unique#${k}=${v}" >> "${BUILDPACK_LOG_FILE}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Measures when an exit path to the buildpack is reached, given a name, then exits 1.
|
||||||
|
# Usage: $ mcount-exi "binExists"
|
||||||
|
mcount_exit() {
|
||||||
|
mcount "error.${1}"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user