Build binaries #29
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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-* |