Skip to content

Build binaries

Build binaries #29

Workflow file for this run

name: Build binaries
on:
workflow_dispatch
#schedule:
# - cron: '5 5 * * *'
permissions:
contents: write
env:
APT: apt -y -qq -o=Dpkg::Use-Pty=0
S_APT: sudo $APT
OPENSSL_DL: "https://github.com/openssl/openssl/releases/download/openssl-3.5.4/openssl-3.5.4.tar.gz"
OPENSSL_TAR_PATH: "/tmp/openssl.tar.gz"
OPENSSL_EXTRACT_DIR_PATH: "/tmp/openssl"
OPENSSL_BUILD_PATH: "/tmp/openssl/install"
ZLIB_DL: "https://zlib.net/current/zlib.tar.gz"
ZLIB_TAR_PATH: "/tmp/zlib.tar.gz"
ZLIB_EXTRACT_DIR_PATH: "/tmp/zlib"
ZLIB_BUILD_PATH: "/tmp/zlib/install"
LIBEVENT_DL: "https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz"
LIBEVENT_TAR_PATH: "/tmp/libevent.tar.gz"
LIBEVENT_EXTRACT_DIR_PATH: "/tmp/libevent"
LIBEVENT_BUILD_PATH: "/tmp/libevent/install"
TOR_DL: "https://dist.torproject.org/tor-0.4.8.19.tar.gz"
TOR_TAR_PATH: "/tmp/tor.tar.gz"
TOR_EXTRACT_DIR_PATH: "/tmp/tor"
TOR_STATIC_BUILD_PATH: "/tmp/tor_build"
TOR_STATIC_PACKAGE_DIR_PATH: "/tmp/tor_package"
defaults:
run:
shell: bash
jobs:
build:
continue-on-error: true
strategy:
fail-fast: false
matrix:
ARCH: [x86_64, aarch64]
LIBC: [glibc, musl]
include:
- OS: ubuntu-latest
ARCH: x86_64
- OS: ubuntu-24.04-arm
ARCH: aarch64
- CONTAINER: debian:bookworm
LIBC: glibc
# remember to build a custom alpine image with bash
- CONTAINER: frolvlad/alpine-bash:latest
LIBC: musl
runs-on: ${{ matrix.OS }}
container:
image: ${{ matrix.CONTAINER }}
env:
OS: ${{ matrix.OS }}
ARCH: ${{ matrix.ARCH }}
CONTAINER: ${{ matrix.CONTAINER }}
LIBC: ${{ matrix.LIBC }}
outputs:
TOR_VERSION: ${{ steps.release_version.outputs.TOR_VERSION }}
steps:
- name: Install prerequisites
run: |
if [[ $CONTAINER =~ "debian" ]]; then
$APT update && $APT install -y build-essential file sudo bash wget tar pkg-config zip
dpkg --get-selections | grep -i libssl
$APT autoremove --purge libssl-dev
fi
if [[ $CONTAINER =~ "alpine" ]]; then
apk -q update && apk add build-base file sudo bash shadow musl wget make tar perl linux-headers pkgconfig zip
apk del openssl-dev
fi
sudo chsh root -s /bin/bash
- name: Create the necessary folders
run: |
cd /tmp/
mkdir -p $OPENSSL_EXTRACT_DIR_PATH $ZLIB_EXTRACT_DIR_PATH $LIBEVENT_EXTRACT_DIR_PATH $TOR_EXTRACT_DIR_PATH $TOR_STATIC_PACKAGE_DIR_PATH
- name: Download the necessary packages
run: |
wget -nv $OPENSSL_DL -O $OPENSSL_TAR_PATH
wget -nv $ZLIB_DL -O $ZLIB_TAR_PATH
wget -nv $LIBEVENT_DL -O $LIBEVENT_TAR_PATH
wget -nv $TOR_DL -O $TOR_TAR_PATH
- name: Compile OpenSSL
run: |
cd /tmp/
tar -xzf $OPENSSL_TAR_PATH -C $OPENSSL_EXTRACT_DIR_PATH --strip-components=1
cd $OPENSSL_EXTRACT_DIR_PATH
./config --prefix=$OPENSSL_BUILD_PATH no-shared no-dso no-docs > /dev/null
make -j$(nproc) > /dev/null
make install
find $OPENSSL_BUILD_PATH -type f -exec ls -alh {} \;
if [[ $ARCH =~ "aarch64" ]]; then
echo "OPENSSL_LIB_DIR=$OPENSSL_BUILD_PATH/lib" >> $GITHUB_ENV
echo "OPENSSL_LIB_DIR_PKGCONFIG=$OPENSSL_BUILD_PATH/lib/pkgconfig" >> $GITHUB_ENV
elif [[ $ARCH =~ "x86_64" ]]; then
echo "OPENSSL_LIB_DIR=$OPENSSL_BUILD_PATH/lib64" >> $GITHUB_ENV
echo "OPENSSL_LIB_DIR_PKGCONFIG=$OPENSSL_BUILD_PATH/lib64/pkgconfig" >> $GITHUB_ENV
fi
- name: Compile ZLIB
run: |
cd /tmp/
tar -xzf $ZLIB_TAR_PATH -C $ZLIB_EXTRACT_DIR_PATH --strip-components=1
cd $ZLIB_EXTRACT_DIR_PATH
./configure --prefix=$ZLIB_BUILD_PATH --static
make -j$(nproc) > /dev/null
make install
find $ZLIB_BUILD_PATH -type f -exec ls -alh {} \;
- name: Compile Libevent
run: |
cd /tmp/
tar -xzf $LIBEVENT_TAR_PATH -C $LIBEVENT_EXTRACT_DIR_PATH --strip-components=1
cd $LIBEVENT_EXTRACT_DIR_PATH
PKG_CONFIG_PATH=$OPENSSL_LIB_DIR_PKGCONFIG ./configure --prefix=$LIBEVENT_BUILD_PATH --disable-shared --enable-static --with-pic
make -j$(nproc) > /dev/null
make install
find $LIBEVENT_BUILD_PATH -type f -exec ls -alh {} \;
- name: Compile TOR
run: |
cd /tmp/
tar -xzf $TOR_TAR_PATH -C $TOR_EXTRACT_DIR_PATH --strip-components=1
cd $TOR_EXTRACT_DIR_PATH
CPPFLAGS="-I$OPENSSL_BUILD_PATH/include" ./configure --prefix=$TOR_STATIC_BUILD_PATH \
--disable-asciidoc --disable-manpage --disable-html-manual --disable-unittests \
--enable-static-tor --enable-static-libevent \
--with-libevent-dir=$LIBEVENT_BUILD_PATH \
--enable-static-openssl --with-openssl-dir=$OPENSSL_LIB_DIR \
--enable-static-zlib --with-zlib-dir=$ZLIB_BUILD_PATH
make -j$(nproc) > /dev/null
make install
find $TOR_STATIC_BUILD_PATH -type f -exec ls -alh {} \;
- name: Check static-ness of TOR binaries and display build information
run: |
cd /tmp/
ldd "$TOR_STATIC_BUILD_PATH/bin/tor" || true
"$TOR_STATIC_BUILD_PATH/bin/tor" --version
- name: Make package
id: release_version
run: |
cd $TOR_STATIC_PACKAGE_DIR_PATH
TOR_PREFIX=$(basename $TOR_DL .tar.gz)
TOR_VERSION="$(date +'%Y-%m-%d')-$TOR_PREFIX"
echo "TOR_VERSION=$TOR_PREFIX" >> $GITHUB_OUTPUT
TOR_STATIC_PACKAGE_FILENAME="$TOR_PREFIX-linux-$ARCH-$LIBC.zip"
TOR_STATIC_PACKAGE_FILE_PATH="$TOR_STATIC_PACKAGE_DIR_PATH/$TOR_STATIC_PACKAGE_FILENAME"
echo "TOR_STATIC_PACKAGE_FILE_PATH=$TOR_STATIC_PACKAGE_FILE_PATH" >> $GITHUB_ENV
TOR_STATIC_PACKAGE_HASH_PATH="$TOR_STATIC_PACKAGE_DIR_PATH/$TOR_STATIC_PACKAGE_FILENAME.sha256.txt"
echo "TOR_STATIC_PACKAGE_HASH_PATH=$TOR_STATIC_PACKAGE_HASH_PATH" >> $GITHUB_ENV
zip -r "$TOR_STATIC_PACKAGE_FILENAME" "$TOR_STATIC_BUILD_PATH"
sha256sum --tag "$(basename "$TOR_STATIC_PACKAGE_FILENAME")" | tee "$TOR_STATIC_PACKAGE_HASH_PATH"
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: binary-${{ matrix.ARCH }}-${{ matrix.LIBC }}
path: |
${{ env.TOR_STATIC_PACKAGE_FILE_PATH }}
${{ env.TOR_STATIC_PACKAGE_HASH_PATH }}
######################################################
deploy_release:
needs: build
runs-on: ubuntu-latest
env:
TOR_VERSION: ${{ needs.build.outputs.TOR_VERSION }}
steps:
- name: Download Artifact
uses: actions/download-artifact@v4
with:
pattern: binary-*
merge-multiple: true
path: /tmp/results
- name: List target
run: |
cd "/tmp/results"
ls -alh
RELEASE_NOTES="/tmp/release_notes.txt"
echo "RELEASE_NOTES=$RELEASE_NOTES" >> $GITHUB_ENV
cat *.sha256.txt > "$RELEASE_NOTES"
mkdir -p "/tmp/hashes"
mv -f *.sha256.txt "/tmp/hashes/"
- name: Create a new Github release
uses: softprops/action-gh-release@72f2c25fcb47643c292f7107632f7a47c1df5cd8 #v2.3.2
with:
body_path: ${{ env.RELEASE_NOTES }}
name: ${{ env.TOR_VERSION }}
tag_name: ${{ env.TOR_VERSION }}
files: |
/tmp/results/tor-*