Skip to content

libsignal-build

libsignal-build #707

name: libsignal-build
on:
workflow_dispatch:
inputs:
libsignal-ref:
description: The branch, tag or SHA to checkout for libsignal
default: '' # Use the latest commit from the default branch
schedule:
- cron: '22 22 * * *'
jobs:
compare_releases:
outputs:
upstream_ver: ${{ steps.check_releases.outputs.upstream_ver }}
release_name: ${{ steps.check_releases.outputs.release_name }}
runs-on: ubuntu-latest
steps:
- name: Checkout this repo sources
uses: actions/checkout@v4
- name: Get libs data in json
id: dummy_matrix
run: python3 generate_matrix.py '0.0.0'
- name: Check the latest official version
id: check_releases
env:
MATRIX_JSON: ${{ steps.dummy_matrix.outputs.matrix }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
upstream_ver: ${{ github.event.inputs.libsignal-ref }}
run: |
LIB_REPO=$(echo "$MATRIX_JSON" | jq -j '.lib[].repo' )
echo "LIB_REPO = $LIB_REPO"
[ -n "$upstream_ver" ] || upstream_ver=$(bash util.sh get_latest_release_name "$LIB_REPO")
echo "upstream_ver=$upstream_ver" | tee -a $GITHUB_OUTPUT
release_name=$(bash util.sh release_name "$LIB_REPO" "$upstream_ver")
this_repo_release=$(bash util.sh get_release_data "$release_name")
[ -z "$this_repo_release" ] || release_name=''
echo "release_name=$release_name" | tee -a $GITHUB_OUTPUT
new_release:
needs:
- compare_releases
if: ${{ needs.compare_releases.outputs.release_name }}
runs-on: ubuntu-latest
steps:
- name: Checkout this repo sources
uses: actions/checkout@v4
- name: Create a new release
id: create_release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_REF_NAME: ${{ github.ref_name }}
TAG_NAME: ${{ needs.compare_releases.outputs.release_name }}
run: |
gh release create \
--target "$GITHUB_REF_NAME" \
--title "$TAG_NAME" \
--notes "Produced by GitHub actions run: https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" \
"$TAG_NAME"
matrix_setup:
needs:
- new_release
- compare_releases
outputs:
matrix: ${{ steps.matrix.outputs.matrix }}
runs-on: ubuntu-latest
steps:
- name: Checkout this repo sources
uses: actions/checkout@v4
- name: Generate matrix
id: matrix
env:
LIBSIGNAL_VERSION: ${{ needs.compare_releases.outputs.upstream_ver }}
run: python3 generate_matrix.py "$LIBSIGNAL_VERSION"
build:
needs:
- matrix_setup
- compare_releases
strategy:
matrix: ${{ fromJSON(needs.matrix_setup.outputs.matrix) }}
fail-fast: false # do not abort all if some of the builds fail
name: build_${{ matrix.build-env.target || matrix.build-env.triple }}
runs-on: ${{ matrix.build-env.runner }}
container: ${{ matrix.build-env.container }}
env:
TARGET: ${{ matrix.build-env.target }}
THIS_REPO_DIR: _this_repo_checkout
defaults:
run:
shell: sh # Explicit for windows
# Ref:
# Upstream workflow:
# https://github.com/signalapp/libsignal-client/blob/master/.github/workflows/build_and_test.yml
# Signal-cli wiki:
# https://github.com/AsamK/signal-cli/wiki/Provide-native-lib-for-libsignal
steps:
- name: Dump strategy and matrix contexts
run: |
echo '${{ toJSON(strategy) }}'
echo '${{ toJSON(matrix) }}'
- name: Checkout this repo sources
uses: actions/checkout@v4
- name: Install required packages
if: ${{ matrix.build-env.req-pkg }}
env:
INSTALL_CMD: ${{ matrix.build-env.install-cmd }}
PKGS: ${{ matrix.build-env.req-pkg }}
run: |
sh -c "$INSTALL_CMD $PKGS"
- name: Run setup commands
if: ${{ matrix.build-env.setup-cmds }}
env:
SETUP_CMDS: ${{ matrix.build-env.setup-cmds }}
SETUP_ENV: ${{ matrix.build-env.setup-env }}
run: |
env -S "$SETUP_ENV" sh -c "$SETUP_CMDS"
- name: Generate file names for the current matrix item
id: filenames
env:
MATRIX_RUN: ${{ toJSON(matrix) }}
run: python3 filename_for_matrix_item.py "$MATRIX_RUN"
- name: Clone upstream source
uses: actions/checkout@v4
with:
repository: ${{ matrix.lib.repo }}
ref: ${{ matrix.lib.ref }}
- name: Install Rust toolchain
run: rustup toolchain install nightly --profile minimal
# Why nightly: https://github.com/signalapp/libsignal/issues/141#issuecomment-1211192153
- name: Add target to rust toolchain
if: ${{ matrix.build-env.target }}
run: rustup target add $TARGET
- name: Add linker to cargo config
# Alternatively can add to rust flags
#RUSTFLAGS: -C linker=${{ matrix.build-env.linker }}
if: ${{ matrix.build-env.linker }}
env:
LINKER: ${{ matrix.build-env.linker }}
run: |
cat >> $CARGO_HOME/config.toml <<EOF
[target.$TARGET]
linker = "$LINKER"
EOF
- name: Cargo build
env:
RUSTFLAGS: -C link-arg=-s ${{ matrix.build-env.rust-flags }}
CARGO_FLAGS: ${{ matrix.lib.cargo-flags }}
BUILD_ENV_VARS: ${{ matrix.build-env.build-env-vars }}
run: |
if [ -n "$TARGET" ]; then
export CARGO_BUILD_TARGET=$TARGET
fi
env -S "$BUILD_ENV_VARS" cargo build --release --verbose $CARGO_FLAGS
- name: Inspect built file
env:
FILENAME: ${{ steps.filenames.outputs.lib_filename }}
working-directory: target/${{ matrix.build-env.target }}/release
run: |
file $FILENAME
readelf --arch-specific $FILENAME || :
ldd -v $FILENAME || ldd $FILENAME || :
objdump -T $FILENAME | grep LIBC || :
readelf -V libsignal_jni.so | grep -o ' GLIBC_[^ ]*' | sort -V | tail -n 1 || :
openssl sha256 $FILENAME
- name: Create archive
env:
DIR: target/${{ matrix.build-env.target }}/release
FILENAME: ${{ steps.filenames.outputs.lib_filename }}
ARCHIVE_NAME: ${{ steps.filenames.outputs.archive_name }}
run: tar -czvf ${ARCHIVE_NAME}.tar.gz --directory ${DIR} ${FILENAME}
- name: Checkout this repo
# (for gh cli)
uses: actions/checkout@v4
with:
path: ${{ env.THIS_REPO_DIR }}
clean: false
- name: Upload release asset
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAG_NAME: ${{ needs.compare_releases.outputs.release_name }}
FILENAME: ${{ steps.filenames.outputs.archive_name }}.tar.gz
working-directory: ${{ env.THIS_REPO_DIR }}
run: gh release upload "$TAG_NAME" "${GITHUB_WORKSPACE}/${FILENAME}"