name: Build / Debian DEB concurrency: group: "build-debian-${{ forge.ref }}" cancel-in-progress: true on: push: tags: - "v*.*.*" workflow_dispatch: schedule: - cron: '30 0 * * 1' jobs: build: runs-on: ubuntu-latest strategy: matrix: container: [ "ubuntu-latest", "ubuntu-previous", "debian-latest", "debian-oldstable" ] arch: [ "amd64", "arm64" ] container: image: "ghcr.io/tcpipuk/act-runner:${{ matrix.container }}" steps: - name: Get Debian version id: debian-version run: | VERSION=$(cat /etc/debian_version) DISTRIBUTION=$(lsb_release -sc 2>/dev/null) echo "version=$VERSION" >> $GITHUB_OUTPUT echo "distribution=$DISTRIBUTION" >> $GITHUB_OUTPUT echo "Debian distribution: $DISTRIBUTION ($VERSION)" #- name: Work around llvm-project#153385 # id: llvm-workaround # run: | # if [ -f /usr/share/apt/default-sequoia.config ]; then # echo "Applying workaround for llvm-project#153385" # mkdir -p /etc/crypto-policies/back-ends/ # cp /usr/share/apt/default-sequoia.config /etc/crypto-policies/back-ends/apt-sequoia.config # sed -i 's/\(sha1\.second_preimage_resistance = \)2026-02-01/\12026-06-01/' /etc/crypto-policies/back-ends/apt-sequoia.config # else # echo "No workaround needed for llvm-project#153385" # fi - name: Checkout repository with full history uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: fetch-depth: 0 ref: ${{ github.ref_name }} - name: Cache Cargo registry uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 with: path: | ~/.cargo/registry ~/.cargo/git key: cargo-debian-${{ steps.debian-version.outputs.distribution }}-${{ matrix.arch }}-${{ hashFiles('**/Cargo.lock') }} restore-keys: | cargo-debian-${{ steps.debian-version.outputs.distribution }}-${{ matrix.arch }}- - name: Setup sccache uses: https://git.tomfos.tr/tom/sccache-action@v1 - name: Configure sccache environment run: | echo "RUSTC_WRAPPER=sccache" >> $GITHUB_ENV echo "CMAKE_C_COMPILER_LAUNCHER=sccache" >> $GITHUB_ENV echo "CMAKE_CXX_COMPILER_LAUNCHER=sccache" >> $GITHUB_ENV echo "SCCACHE_CACHE_SIZE=10G" >> $GITHUB_ENV # Aggressive GC since cache restores don't increment counter echo "CARGO_INCREMENTAL_GC_TRIGGER=5" >> $GITHUB_ENV - name: Install cross-compilation tools for arm64 if: matrix.arch == 'arm64' run: | dpkg --add-architecture arm64 if ! apt-get update; then # Older Ubuntu releases (e.g. noble) advertise arm64 in their # Release files but only serve amd64/i386 from archive.ubuntu.com, # so apt update 404s. Restrict the main sources to amd64 and # fetch arm64 from ports.ubuntu.com instead. CODENAME=$(lsb_release -sc) # deb822 sources (noble and newer) if [ -f /etc/apt/sources.list.d/ubuntu.sources ]; then sed -i '/^Components:/a Architectures: amd64' /etc/apt/sources.list.d/ubuntu.sources fi # one-line sources (jammy and older) if [ -f /etc/apt/sources.list ]; then sed -i 's/^deb /deb [arch=amd64] /' /etc/apt/sources.list fi printf 'deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports %s main restricted universe multiverse\n' \ "$CODENAME" "$CODENAME-updates" "$CODENAME-security" \ > /etc/apt/sources.list.d/arm64-ports.list apt-get update fi apt-get install -y \ gcc-aarch64-linux-gnu \ g++-aarch64-linux-gnu \ libc6-dev-arm64-cross - name: Setup Rust uses: ./.forgejo/actions/setup-rust with: github-token: ${{ secrets.GH_PUBLIC_RO }} - name: Add Rust target run: | TARGET=${{ matrix.arch == 'arm64' && 'aarch64-unknown-linux-gnu' || 'x86_64-unknown-linux-gnu' }} rustup target add $TARGET - name: Configure cross-compilation for arm64 if: matrix.arch == 'arm64' run: | echo "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV echo "CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc" >> $GITHUB_ENV echo "CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++" >> $GITHUB_ENV # rust-rocksdb's build script probes liburing via pkg-config, which # refuses to run when host != target unless explicitly allowed echo "PKG_CONFIG_ALLOW_CROSS=1" >> $GITHUB_ENV echo "PKG_CONFIG_PATH_aarch64_unknown_linux_gnu=/usr/lib/aarch64-linux-gnu/pkgconfig" >> $GITHUB_ENV - name: Get package version and component id: package-meta run: | BASE_VERSION=$(cargo metadata --no-deps --format-version 1 | jq -r ".packages[] | select(.name == \"conduwuit\").version" | sed 's/[^a-zA-Z0-9.+]/~/g') # VERSION is the package version, COMPONENT is used in # apt's repository config like a git repo branch VERSION=$BASE_VERSION if [[ ${{ forge.ref_name }} =~ ^v+[0-9]+\.+[0-9]+\.+[0-9]+$ ]]; then # Use the "stable" component for tagged semver releases COMPONENT="stable" elif [[ ${{ forge.ref_name }} =~ ^v+[0-9]+\.+[0-9]+\.+[0-9]+ ]]; then # Use the "unstable" component for tagged semver pre-releases COMPONENT="unstable" else # Use the "dev" component for development builds SHA=$(echo "${{ forge.sha }}" | cut -c1-7) DATE=$(date +%Y%m%d) if [ "${{ forge.ref_name }}" = "main" ]; then COMPONENT="dev" else # Use the sanitized ref name as the component for feature branches COMPONENT="dev-$(echo '${{ forge.ref_name }}' | sed 's/[^a-zA-Z0-9.+]/-/g' | tr '[:upper:]' '[:lower:]' | cut -c1-30)" fi CLEAN_COMPONENT=$(echo $COMPONENT | sed 's/[^a-zA-Z0-9.+]/~/g') VERSION="$BASE_VERSION~git$DATE.$SHA-$CLEAN_COMPONENT" fi echo "component=$COMPONENT" >> $GITHUB_OUTPUT echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Component: $COMPONENT" echo "Version: $VERSION" - name: Install cargo-deb run: | if command -v cargo-deb &> /dev/null; then echo "cargo-deb already available" else echo "Installing cargo-deb" cargo-binstall -y --no-symlinks cargo-deb fi - name: Install build dependencies run: | apt-get update -y # Build dependencies for rocksdb apt-get install -y liburing-dev clang # For arm64 builds, install cross-compiled dependencies. # libstdc++6:arm64 is needed by dpkg-shlibdeps to resolve the # dynamically-linked libstdc++ when cargo-deb computes $auto depends. if [ "${{ matrix.arch }}" = "arm64" ]; then apt-get install -y liburing-dev:arm64 libstdc++6:arm64 fi - name: Run cargo-deb id: cargo-deb run: | TARGET=${{ matrix.arch == 'arm64' && 'aarch64-unknown-linux-gnu' || 'x86_64-unknown-linux-gnu' }} DEB_PATH=$(cargo deb --target $TARGET --deb-version ${{ steps.package-meta.outputs.version }}) echo "path=$DEB_PATH" >> $GITHUB_OUTPUT - name: Test deb installation if: matrix.arch == 'amd64' run: | echo "Installing: ${{ steps.cargo-deb.outputs.path }}" apt-get install -y ${{ steps.cargo-deb.outputs.path }} dpkg -s continuwuity [ -f /usr/bin/conduwuit ] && echo "✅ Binary installed successfully" [ -f /usr/lib/systemd/system/conduwuit.service ] && echo "✅ Systemd service installed" [ -f /etc/conduwuit/conduwuit.toml ] && echo "✅ Config file installed" - name: Upload deb artifact uses: forgejo/upload-artifact@v4 with: name: continuwuity-${{ steps.debian-version.outputs.distribution }}-${{ matrix.arch }} path: ${{ steps.cargo-deb.outputs.path }} - name: Publish to Forgejo package registry if: ${{ forge.event_name == 'push' || forge.event_name == 'workflow_dispatch' || forge.event_name == 'schedule' }} run: | OWNER="continuwuation" DISTRIBUTION=${{ steps.debian-version.outputs.distribution }} COMPONENT=${{ steps.package-meta.outputs.component }} DEB=${{ steps.cargo-deb.outputs.path }} echo "Publishing: $DEB in component $COMPONENT for distribution $DISTRIBUTION" curl --fail-with-body \ -X PUT \ -H "Authorization: token ${{ secrets.BUILTIN_REGISTRY_PASSWORD || secrets.GITHUB_TOKEN }}" \ --upload-file "$DEB" \ "${{ forge.server_url }}/api/packages/$OWNER/debian/pool/$DISTRIBUTION/$COMPONENT/upload"