Derive all build timestamps from BUILDDATE
Some checks failed
C/C++ CI Linux / ${{ matrix.target }} (ubuntu-24.04-arm) (push) Has been cancelled
C/C++ CI Linux / ${{ matrix.target }} (ubuntu-latest) (push) Has been cancelled
C/C++ CI MacOS / ${{ matrix.target }} (macos-15) (push) Has been cancelled

The build date stored in version.h is now the single time source for a
release. Each package workflow converts it to SOURCE_DATE_EPOCH and passes
that into the build containers, the debian changelog entry is stamped from it
rather than from the build clock, and rpmbuild is told to use it as the build
time and to clamp file mtimes to it.

rpm also records the build host, which is a container id and therefore differs
on every run, so pin it as well - otherwise the timestamps alone do not make
the package reproducible.

Rebuilding the same commit now produces byte identical packages, verified for
both formats by building twice and comparing checksums.

In the version workflow the clock is read exactly once, when a new build date
is minted. YEAR3PROXY is derived from the build date instead of being read
separately, so the two cannot straddle a year boundary and a re-run in a later
year no longer rewrites version.h.
This commit is contained in:
Vladimir Dubrovin 2026-08-22 13:53:29 +03:00
parent ff77d222e4
commit 754ba7115a
4 changed files with 31 additions and 11 deletions

View File

@ -27,8 +27,10 @@ jobs:
pwd pwd
echo "RELEASE=$(cat RELEASE)" >> $GITHUB_ENV echo "RELEASE=$(cat RELEASE)" >> $GITHUB_ENV
BUILDDATE=$(sed -n 's/^#define BUILDDATE "\(.*\)"$/\1/p' src/version.h) BUILDDATE=$(sed -n 's/^#define BUILDDATE "\(.*\)"$/\1/p' src/version.h)
[ -n "$BUILDDATE" ] || BUILDDATE=$(date +%y%m%d%H%M%S) [ -n "$BUILDDATE" ] || BUILDDATE=$(date -u +%y%m%d%H%M%S)
echo "VERSION=$BUILDDATE" >> $GITHUB_ENV echo "VERSION=$BUILDDATE" >> $GITHUB_ENV
SOURCE_DATE_EPOCH=$(date -u -d "20${BUILDDATE:0:2}-${BUILDDATE:2:2}-${BUILDDATE:4:2} ${BUILDDATE:6:2}:${BUILDDATE:8:2}:${BUILDDATE:10:2}" +%s)
echo "SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH" >> $GITHUB_ENV
- name: echo env - name: echo env
run: echo "release $RELEASE version $VERSION" run: echo "release $RELEASE version $VERSION"
- name: Linux libraries - name: Linux libraries
@ -52,6 +54,7 @@ jobs:
-v "$PWD/scripts/rh/3proxy.spec:/3proxy.spec:ro" \ -v "$PWD/scripts/rh/3proxy.spec:/3proxy.spec:ro" \
-v "$PWD/rpmout:/out" \ -v "$PWD/rpmout:/out" \
-e RELEASE="$RELEASE" -e HOSTUID="$(id -u)" -e HOSTGID="$(id -g)" \ -e RELEASE="$RELEASE" -e HOSTUID="$(id -u)" -e HOSTGID="$(id -g)" \
-e SOURCE_DATE_EPOCH="$SOURCE_DATE_EPOCH" \
"almalinux:$EL" bash -c ' "almalinux:$EL" bash -c '
set -e set -e
dnf -y install rpm-build gcc make openssl-devel pcre2-devel pam-devel tar gzip dnf -y install rpm-build gcc make openssl-devel pcre2-devel pam-devel tar gzip
@ -60,7 +63,11 @@ jobs:
ln -sf ~/rpmbuild/SOURCES/3proxy-$RELEASE.tar.gz ~/rpmbuild/SOURCES/$RELEASE.tar.gz ln -sf ~/rpmbuild/SOURCES/3proxy-$RELEASE.tar.gz ~/rpmbuild/SOURCES/$RELEASE.tar.gz
cp /3proxy.spec ~/rpmbuild/SPECS/3proxy-$RELEASE.spec cp /3proxy.spec ~/rpmbuild/SPECS/3proxy-$RELEASE.spec
cd ~/rpmbuild/SPECS cd ~/rpmbuild/SPECS
rpmbuild -ba 3proxy-$RELEASE.spec rpmbuild -ba \
--define "use_source_date_epoch_as_buildtime 1" \
--define "clamp_mtime_to_source_date_epoch 1" \
--define "_buildhost 3proxy.org" \
3proxy-$RELEASE.spec
cp ~/rpmbuild/RPMS/*/*.rpm /out/ cp ~/rpmbuild/RPMS/*/*.rpm /out/
chown "$HOSTUID:$HOSTGID" /out/*.rpm || chmod 0666 /out/*.rpm' chown "$HOSTUID:$HOSTGID" /out/*.rpm || chmod 0666 /out/*.rpm'
done done
@ -81,6 +88,7 @@ jobs:
docker run --rm \ docker run --rm \
-v "$HOME/debian:/debian" \ -v "$HOME/debian:/debian" \
-e RELEASE="$RELEASE" -e VERSION="$VERSION" \ -e RELEASE="$RELEASE" -e VERSION="$VERSION" \
-e SOURCE_DATE_EPOCH="$SOURCE_DATE_EPOCH" \
ubuntu:22.04 bash -c ' ubuntu:22.04 bash -c '
set -e set -e
export DEBIAN_FRONTEND=noninteractive export DEBIAN_FRONTEND=noninteractive
@ -93,7 +101,7 @@ jobs:
echo " " echo " "
echo " *3proxy $RELEASE build" echo " *3proxy $RELEASE build"
echo " " echo " "
echo " -- z3APA3A <3apa3a@3proxy.org> $(date "+%a, %d %b %Y %H:%M:%S %z")" echo " -- z3APA3A <3apa3a@3proxy.org> $(date -R -u -d @$SOURCE_DATE_EPOCH)"
echo "" echo ""
} > debian/changelog } > debian/changelog
dpkg-buildpackage' dpkg-buildpackage'

View File

@ -27,8 +27,10 @@ jobs:
pwd pwd
echo "RELEASE=$(cat RELEASE)" >> $GITHUB_ENV echo "RELEASE=$(cat RELEASE)" >> $GITHUB_ENV
BUILDDATE=$(sed -n 's/^#define BUILDDATE "\(.*\)"$/\1/p' src/version.h) BUILDDATE=$(sed -n 's/^#define BUILDDATE "\(.*\)"$/\1/p' src/version.h)
[ -n "$BUILDDATE" ] || BUILDDATE=$(date +%y%m%d%H%M%S) [ -n "$BUILDDATE" ] || BUILDDATE=$(date -u +%y%m%d%H%M%S)
echo "VERSION=$BUILDDATE" >> $GITHUB_ENV echo "VERSION=$BUILDDATE" >> $GITHUB_ENV
SOURCE_DATE_EPOCH=$(date -u -d "20${BUILDDATE:0:2}-${BUILDDATE:2:2}-${BUILDDATE:4:2} ${BUILDDATE:6:2}:${BUILDDATE:8:2}:${BUILDDATE:10:2}" +%s)
echo "SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH" >> $GITHUB_ENV
- name: configure deb env - name: configure deb env
run: | run: |
mkdir ~/debian mkdir ~/debian
@ -42,6 +44,7 @@ jobs:
docker run --rm \ docker run --rm \
-v "$HOME/debian:/debian" \ -v "$HOME/debian:/debian" \
-e RELEASE="$RELEASE" -e VERSION="$VERSION" \ -e RELEASE="$RELEASE" -e VERSION="$VERSION" \
-e SOURCE_DATE_EPOCH="$SOURCE_DATE_EPOCH" \
ubuntu:22.04 bash -c ' ubuntu:22.04 bash -c '
set -e set -e
export DEBIAN_FRONTEND=noninteractive export DEBIAN_FRONTEND=noninteractive
@ -60,7 +63,7 @@ jobs:
echo " " echo " "
echo " *3proxy $RELEASE build" echo " *3proxy $RELEASE build"
echo " " echo " "
echo " -- z3APA3A <3apa3a@3proxy.org> $(date "+%a, %d %b %Y %H:%M:%S %z")" echo " -- z3APA3A <3apa3a@3proxy.org> $(date -R -u -d @$SOURCE_DATE_EPOCH)"
echo "" echo ""
} > debian/changelog } > debian/changelog
export PATH=/usr/arm-linux-gnueabihf/bin:$PATH export PATH=/usr/arm-linux-gnueabihf/bin:$PATH

View File

@ -27,8 +27,10 @@ jobs:
pwd pwd
echo "RELEASE=$(cat RELEASE)" >> $GITHUB_ENV echo "RELEASE=$(cat RELEASE)" >> $GITHUB_ENV
BUILDDATE=$(sed -n 's/^#define BUILDDATE "\(.*\)"$/\1/p' src/version.h) BUILDDATE=$(sed -n 's/^#define BUILDDATE "\(.*\)"$/\1/p' src/version.h)
[ -n "$BUILDDATE" ] || BUILDDATE=$(date +%y%m%d%H%M%S) [ -n "$BUILDDATE" ] || BUILDDATE=$(date -u +%y%m%d%H%M%S)
echo "VERSION=$BUILDDATE" >> $GITHUB_ENV echo "VERSION=$BUILDDATE" >> $GITHUB_ENV
SOURCE_DATE_EPOCH=$(date -u -d "20${BUILDDATE:0:2}-${BUILDDATE:2:2}-${BUILDDATE:4:2} ${BUILDDATE:6:2}:${BUILDDATE:8:2}:${BUILDDATE:10:2}" +%s)
echo "SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH" >> $GITHUB_ENV
- name: echo env - name: echo env
run: echo "release $RELEASE version $VERSION" run: echo "release $RELEASE version $VERSION"
- name: Linux libraries - name: Linux libraries
@ -52,6 +54,7 @@ jobs:
-v "$PWD/scripts/rh/3proxy.spec:/3proxy.spec:ro" \ -v "$PWD/scripts/rh/3proxy.spec:/3proxy.spec:ro" \
-v "$PWD/rpmout:/out" \ -v "$PWD/rpmout:/out" \
-e RELEASE="$RELEASE" -e HOSTUID="$(id -u)" -e HOSTGID="$(id -g)" \ -e RELEASE="$RELEASE" -e HOSTUID="$(id -u)" -e HOSTGID="$(id -g)" \
-e SOURCE_DATE_EPOCH="$SOURCE_DATE_EPOCH" \
"almalinux:$EL" bash -c ' "almalinux:$EL" bash -c '
set -e set -e
dnf -y install rpm-build gcc make openssl-devel pcre2-devel pam-devel tar gzip dnf -y install rpm-build gcc make openssl-devel pcre2-devel pam-devel tar gzip
@ -60,7 +63,11 @@ jobs:
ln -sf ~/rpmbuild/SOURCES/3proxy-$RELEASE.tar.gz ~/rpmbuild/SOURCES/$RELEASE.tar.gz ln -sf ~/rpmbuild/SOURCES/3proxy-$RELEASE.tar.gz ~/rpmbuild/SOURCES/$RELEASE.tar.gz
cp /3proxy.spec ~/rpmbuild/SPECS/3proxy-$RELEASE.spec cp /3proxy.spec ~/rpmbuild/SPECS/3proxy-$RELEASE.spec
cd ~/rpmbuild/SPECS cd ~/rpmbuild/SPECS
rpmbuild -ba 3proxy-$RELEASE.spec rpmbuild -ba \
--define "use_source_date_epoch_as_buildtime 1" \
--define "clamp_mtime_to_source_date_epoch 1" \
--define "_buildhost 3proxy.org" \
3proxy-$RELEASE.spec
cp ~/rpmbuild/RPMS/*/*.rpm /out/ cp ~/rpmbuild/RPMS/*/*.rpm /out/
chown "$HOSTUID:$HOSTGID" /out/*.rpm || chmod 0666 /out/*.rpm' chown "$HOSTUID:$HOSTGID" /out/*.rpm || chmod 0666 /out/*.rpm'
done done
@ -81,6 +88,7 @@ jobs:
docker run --rm \ docker run --rm \
-v "$HOME/debian:/debian" \ -v "$HOME/debian:/debian" \
-e RELEASE="$RELEASE" -e VERSION="$VERSION" \ -e RELEASE="$RELEASE" -e VERSION="$VERSION" \
-e SOURCE_DATE_EPOCH="$SOURCE_DATE_EPOCH" \
ubuntu:22.04 bash -c ' ubuntu:22.04 bash -c '
set -e set -e
export DEBIAN_FRONTEND=noninteractive export DEBIAN_FRONTEND=noninteractive
@ -93,7 +101,7 @@ jobs:
echo " " echo " "
echo " *3proxy $RELEASE build" echo " *3proxy $RELEASE build"
echo " " echo " "
echo " -- z3APA3A <3apa3a@3proxy.org> $(date "+%a, %d %b %Y %H:%M:%S %z")" echo " -- z3APA3A <3apa3a@3proxy.org> $(date -R -u -d @$SOURCE_DATE_EPOCH)"
echo "" echo ""
} > debian/changelog } > debian/changelog
dpkg-buildpackage' dpkg-buildpackage'

View File

@ -21,7 +21,6 @@ jobs:
run: | run: |
RELEASE=$(tr -d ' \t\r\n' < RELEASE) RELEASE=$(tr -d ' \t\r\n' < RELEASE)
if [ -z "$RELEASE" ]; then echo "RELEASE is empty"; exit 1; fi if [ -z "$RELEASE" ]; then echo "RELEASE is empty"; exit 1; fi
YEAR=$(date +%Y)
MAJOR=$(echo "$RELEASE" | cut -d . -f 1) MAJOR=$(echo "$RELEASE" | cut -d . -f 1)
SUBMAJOR=$(echo "$RELEASE" | cut -d . -f 2) SUBMAJOR=$(echo "$RELEASE" | cut -d . -f 2)
MINOR=$(echo "$RELEASE" | cut -d . -f 3) MINOR=$(echo "$RELEASE" | cut -d . -f 3)
@ -38,9 +37,11 @@ jobs:
if [ "$OLDRELEASE" = "$RELEASE" ] && [ -n "$OLDBUILDDATE" ]; then if [ "$OLDRELEASE" = "$RELEASE" ] && [ -n "$OLDBUILDDATE" ]; then
BUILDDATE="$OLDBUILDDATE" BUILDDATE="$OLDBUILDDATE"
else else
BUILDDATE=$(date +%y%m%d%H%M%S) BUILDDATE=$(date -u +%y%m%d%H%M%S)
fi fi
echo "release $RELEASE -> $MAJOR $SUBMAJOR $MINOR $SUBMINOR, build date $BUILDDATE" echo "release $RELEASE -> $MAJOR $SUBMAJOR $MINOR $SUBMINOR, build date $BUILDDATE"
SOURCE_DATE_EPOCH=$(date -u -d "20${BUILDDATE:0:2}-${BUILDDATE:2:2}-${BUILDDATE:4:2} ${BUILDDATE:6:2}:${BUILDDATE:8:2}:${BUILDDATE:10:2}" +%s)
YEAR=$(date -u -d @$SOURCE_DATE_EPOCH +%Y)
DEBVERSION=$(head -1 debian/changelog | cut -d "(" -f 2 | cut -d ")" -f 1) DEBVERSION=$(head -1 debian/changelog | cut -d "(" -f 2 | cut -d ")" -f 1)
if [ "$DEBVERSION" != "$RELEASE-1" ]; then if [ "$DEBVERSION" != "$RELEASE-1" ]; then
@ -49,7 +50,7 @@ jobs:
echo "" echo ""
echo " *3proxy $RELEASE initial build" echo " *3proxy $RELEASE initial build"
echo "" echo ""
echo " -- z3APA3A <3apa3a@3proxy.org> $(date -R)" echo " -- z3APA3A <3apa3a@3proxy.org> $(date -R -u -d @$SOURCE_DATE_EPOCH)"
echo "" echo ""
cat debian/changelog.old cat debian/changelog.old
} > debian/changelog } > debian/changelog