Skip to content

Commit

Permalink
Add "tip" version
Browse files Browse the repository at this point in the history
This is pinned to the latest commit merged upstream before midnight (UTC) on Monday of the current week.
  • Loading branch information
tianon committed Aug 15, 2024
1 parent 8d99221 commit 819b765
Show file tree
Hide file tree
Showing 8 changed files with 794 additions and 28 deletions.
67 changes: 66 additions & 1 deletion Dockerfile-linux.template
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,15 @@ FROM buildpack-deps:{{ env.variant }}-scm AS build

ENV PATH /usr/local/go/bin:$PATH

{{ if env.version != "tip" then ( -}}
ENV GOLANG_VERSION {{ .version }}
{{ ) else ( -}}
COPY --from=golang:{{ env.variant }} /usr/local/go /usr/local/goroot-bootstrap

# {{ .version }}: https://github.com/golang/go/tree/{{ .commit.version }}
ARG GOLANG_COMMIT={{ .commit.version | @sh }}
ENV GOLANG_COMMIT $GOLANG_COMMIT
{{ ) end -}}

{{
def os_arches:
Expand Down Expand Up @@ -54,16 +62,23 @@ RUN set -eux; \
now="$(date '+%s')"; \
{{ if is_alpine then ( -}}
apk add --no-cache --virtual .fetch-deps \
{{ if env.version != "tip" then ( -}}
ca-certificates \
gnupg \
# busybox's "tar" doesn't handle directory mtime correctly, so our SOURCE_DATE_EPOCH lookup doesn't work (the mtime of "/usr/local/go" always ends up being the extraction timestamp)
tar \
{{ ) else ( -}}
bash \
git \
{{ ) end -}}
; \
arch="$(apk --print-arch)"; \
{{ ) else ( -}}
arch="$(dpkg --print-architecture)"; arch="${arch##*-}"; \
{{ ) end -}}
{{ if env.version != "tip" then ( -}}
url=; \
{{ ) else "" end -}}
case "$arch" in \
{{
[
Expand All @@ -78,8 +93,12 @@ RUN set -eux; \
| (
-}}
{{ $osArch | @sh }}) \
{{ if env.version != "tip" then ( -}}
url={{ .url | @sh }}; \
sha256={{ .sha256 | @sh }}; \
{{ ) else ( -}}
export {{ .env | to_entries | sort_by(.key) | map(.key + "=" + (.value | @sh)) | join(" ") }}; \
{{ ) end -}}
;; \
{{
)
Expand All @@ -88,6 +107,7 @@ RUN set -eux; \
*) echo >&2 "error: unsupported architecture '$arch' (likely packaging update needed)"; exit 1 ;; \
esac; \
\
{{ if env.version != "tip" then ( -}}
wget -O go.tgz.asc "$url.asc"; \
wget -O go.tgz "$url"{{ if is_alpine then "" else " --progress=dot:giga" end }}; \
echo "$sha256 *go.tgz" | sha256sum -c -; \
Expand All @@ -107,14 +127,57 @@ RUN set -eux; \
\
# save the timestamp from the tarball so we can restore it for reproducibility, if necessary (see below)
SOURCE_DATE_EPOCH="$(stat -c '%Y' /usr/local/go)"; \
{{ ) else ( -}}
# before we get too far, let's validate that our "bootstrap" Go works
export GOROOT_BOOTSTRAP=/usr/local/goroot-bootstrap; \
# TODO figure out why QEMU's user-mode emulation with Go 1.23.0 causes "can't start telemetry child process: fork/exec /usr/local/go/bin/go: invalid argument" (it works if we run it a second time, but then later "go build" fails to fork/exec the compile process 🙃)
"$GOROOT_BOOTSTRAP/bin/go" version; \
\
git init --quiet /usr/local/go; \
git -C /usr/local/go fetch --depth 1 https://github.com/golang/go.git "$GOLANG_COMMIT:"; \
git -C /usr/local/go checkout --quiet FETCH_HEAD; \
\
# save the Git timestamp so we can use it for reproducibility
SOURCE_DATE_EPOCH="$(git -C /usr/local/go log -1 --format='format:%ct' HEAD)"; \
{{ ) end -}}
export SOURCE_DATE_EPOCH; \
touchy="$(date -d "@$SOURCE_DATE_EPOCH" '+%Y%m%d%H%M.%S')"; \
# for logging validation/edification
date --date "@$SOURCE_DATE_EPOCH" --rfc-2822; \
# sanity check (detected value should be older than our wall clock)
[ "$SOURCE_DATE_EPOCH" -lt "$now" ]; \
\
{{ if .arches["arm32v7"].url // "" | contains("armv6") then ( -}}
{{ if env.version == "tip" then ( -}}
( \
export \
GOCACHE='/tmp/gocache' \
# set GOHOST* to make sure explicitly 32bit builds on 64bit infra work correctly
GOHOSTOS="$GOOS" \
GOHOSTARCH="$GOARCH" \
; \
\
cd /usr/local/go/src; \
./make.bash; \
\
# remove a few intermediate / bootstrapping files the official binary release tarballs do not contain (and ".git" that is hard to make reproducible)
rm -rf \
/usr/local/go/.git* \
/usr/local/go/pkg/*/cmd \
/usr/local/go/pkg/bootstrap \
/usr/local/go/pkg/obj \
/usr/local/go/pkg/tool/*/api \
/usr/local/go/pkg/tool/*/go_bootstrap \
/usr/local/go/src/cmd/dist/dist \
"$GOCACHE" \
; \
\
# clamp timestamps for reproducibility (allows "COPY --link" to be more clever/useful)
touch -t "$touchy" /usr/local/.go-date-stamp; \
find /usr/local/go -depth -newer /usr/local/.go-date-stamp -exec touch -ht "$touchy" '{}' +; \
rm /usr/local/.go-date-stamp; \
); \
\
{{ ) elif .arches["arm32v7"].url // "" | contains("armv6") then ( -}}
if [ "$arch" = {{ os_arches["arm32v7"] | @sh }} ]; then \
[ -s /usr/local/go/go.env ]; \
before="$(go env GOARM)"; [ "$before" != {{ .arches["arm32v7"].env["GOARM"] | @sh }} ]; \
Expand Down Expand Up @@ -166,8 +229,10 @@ RUN set -eux; \
rm -rf /var/lib/apt/lists/*
{{ ) end -}}

{{ if env.version != "tip" then ( -}}
ENV GOLANG_VERSION {{ .version }}

{{ ) else "" end -}}
# don't auto-upgrade the gotoolchain
# https://github.com/docker-library/golang/issues/472
ENV GOTOOLCHAIN=local
Expand Down
2 changes: 0 additions & 2 deletions generate-stackbrew-library.sh
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,6 @@ for version; do

fullVersion="$(jq -r '.[env.version].version' versions.json)"

[[ "$fullVersion" == *.*[^0-9]* ]] || fullVersion+='.0'

if [ "$version" = "$fullVersion" ]; then
baseAliases=( "${versionAliases[@]}" )
else
Expand Down
127 changes: 127 additions & 0 deletions tip/alpine3.19/Dockerfile

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

127 changes: 127 additions & 0 deletions tip/alpine3.20/Dockerfile

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 819b765

Please sign in to comment.