Skip to content

matrix multi build and release - qbt-workflow-files #148

matrix multi build and release - qbt-workflow-files

matrix multi build and release - qbt-workflow-files #148

# @credits https://github.com/c0re100/qBittorrent-Enhanced-Edition
name: matrix multi build and release - qbt-workflow-files
on:
workflow_dispatch:
inputs:
distinct_id:
description: "Distinct id"
skip_rerun:
description: "Skip rerun?"
required: true
default: true
type: boolean
retries:
description: "Number of rerun retries"
required: true
default: "1"
type: choice
options: ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
permissions:
id-token: write
contents: read
attestations: write
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
os_id: [alpine]
os_version_id: [edge]
# qbt_cross_name: [armel,armhf,armv7,aarch64,x86_64,x86,s390x,powerpc,ppc64el,mips,mipsel,mips64,mips64el,riscv64]
qbt_cross_name: ["armhf", "armv7", "aarch64", "x86_64", "x86"]
qbt_libtorrent_version: ["1.2", "2.0"]
qbt_build_tool: ["", "qmake"]
include:
- qbt_build_tool: "qmake"
qbt_qt_version_name: "qt5-"
qbt_qt_version: "5"
- qbt_build_tool: ""
qbt_qt_version_name: ""
qbt_qt_version: "6"
- qbt_libtorrent_version: 1.2
qbt_boost_tag: boost-1.86.0
name: "${{ matrix.qbt_cross_name }}-${{ matrix.qbt_qt_version_name }}libtorrent-v${{ matrix.qbt_libtorrent_version }}"
env:
qbt_build_dir: "qbt-build"
steps:
- name: Checkout ${{ github.event.inputs.distinct_id }}
uses: actions/checkout@v4
- name: Host - phased updates ${{ github.event.inputs.distinct_id }}
run: printf '%s\n' 'APT::Get::Always-Include-Phased-Updates "false";' | sudo tee /etc/apt/apt.conf.d/99-phased-updates
- name: Host - update ${{ github.event.inputs.distinct_id }}
run: sudo apt-get update
- name: Host - upgrade ${{ github.event.inputs.distinct_id }}
run: sudo apt-get -y upgrade
- name: Host - set up qemu-user-static binfmt-support ${{ github.event.inputs.distinct_id }}
run: sudo apt install libpipeline1 qemu-user-static binfmt-support
- name: Host - Create Docker template env file ${{ github.event.inputs.distinct_id }}
run: |
printf '%s\n' "qbt_libtorrent_version=${{ matrix.qbt_libtorrent_version }}" > env.custom
printf '%s\n' "qbt_qt_version=${{ matrix.qbt_qt_version }}" >> env.custom
printf '%s\n' "qbt_build_tool=${{ matrix.qbt_build_tool }}" >> env.custom
printf '%s\n' "qbt_cross_name=${{ matrix.qbt_cross_name }}" >> env.custom
printf '%s\n' "qbt_patches_url=${{ github.repository }}" >> env.custom
printf '%s\n' "qbt_skip_icu=yes" >> env.custom
printf '%s\n' "qbt_boost_tag=${{ matrix.qbt_boost_tag }}" >> env.custom
printf '%s\n' "qbt_libtorrent_tag=" >> env.custom
printf '%s\n' "qbt_qt_tag=" >> env.custom
printf '%s\n' "qbt_qbittorrent_tag=" >> env.custom
printf '%s\n' "qbt_libtorrent_master_jamfile=no" >> env.custom
printf '%s\n' "qbt_workflow_files=yes" >> env.custom
printf '%s\n' "qbt_workflow_artifacts=no" >> env.custom
printf '%s\n' "qbt_cache_dir=" >> env.custom
printf '%s\n' "qbt_optimise_strip=yes" >> env.custom
printf '%s\n' "qbt_build_debug=no" >> env.custom
printf '%s\n' "qbt_revision_url=${{ github.repository }}" >> env.custom
printf '%s\n' "qbt_standard=" >> env.custom
printf '%s\n' "qbt_static_ish=no" >> env.custom
- name: Host - Create docker multiarch container ${{ github.event.inputs.distinct_id }}
run: docker run --name multiarch -it -d --env-file env.custom -w /root -v ${{ github.workspace }}:/root ${{ matrix.os_id }}:${{ matrix.os_version_id }}
- name: Docker - apk update ${{ github.event.inputs.distinct_id }}
run: docker exec -w /root multiarch apk update
- name: Docker - apk install bash ${{ github.event.inputs.distinct_id }}
run: docker exec -w /root multiarch apk add bash
- name: Docker - Bootstrap ${{ github.event.inputs.distinct_id }}
run: docker exec -w /root multiarch bash qbittorrent-nox-static.sh -bs-a
- name: Docker - Copy repo patches to build folder ${{ github.event.inputs.distinct_id }}
run: if [[ -d patches ]]; then docker exec -w /root multiarch cp -r patches/* /root/${{ env.qbt_build_dir }}/patches; fi
- name: Docker - zlib-ng ${{ github.event.inputs.distinct_id }}
run: docker exec -w /root multiarch bash qbittorrent-nox-static.sh zlib
- name: Docker - iconv ${{ github.event.inputs.distinct_id }}
run: docker exec -w /root multiarch bash qbittorrent-nox-static.sh iconv
- name: Docker - icu ${{ github.event.inputs.distinct_id }}
run: docker exec -w /root multiarch bash qbittorrent-nox-static.sh icu
- name: Docker - openssl ${{ github.event.inputs.distinct_id }}
run: docker exec -w /root multiarch bash qbittorrent-nox-static.sh openssl
- name: Docker - boost ${{ github.event.inputs.distinct_id }}
run: docker exec -w /root multiarch bash qbittorrent-nox-static.sh boost
- name: Docker - libtorrent ${{ github.event.inputs.distinct_id }}
run: docker exec -w /root multiarch bash qbittorrent-nox-static.sh libtorrent
- name: Docker - double_conversion ${{ github.event.inputs.distinct_id }}
if: matrix.qbt_build_tool == 'cmake'
run: docker exec -w /root multiarch bash qbittorrent-nox-static.sh double_conversion
- name: Docker - qtbase ${{ github.event.inputs.distinct_id }}
run: docker exec -w /root multiarch bash qbittorrent-nox-static.sh qtbase
- name: Docker - qttools ${{ github.event.inputs.distinct_id }}
run: docker exec -w /root multiarch bash qbittorrent-nox-static.sh qttools
- name: Docker - qbittorrent ${{ github.event.inputs.distinct_id }}
run: docker exec -w /root multiarch bash qbittorrent-nox-static.sh qbittorrent
- name: Host - qBittorrent v5 transition
run: |
# When qBittorrent v5 is released, remove this
if [[ -f ${{ env.qbt_build_dir }}/release_info/disable-qt5 ]]; then
printf '%s\n' "disable_qt5=yes" >> $GITHUB_ENV
fi
- name: Docker - Set release asset name ${{ github.event.inputs.distinct_id }}
if: env.disable_qt5 != 'yes' # When qBittorrent v5 is released, remove this
run: docker exec -w /root/${{ env.qbt_build_dir }}/completed multiarch mv -f qbittorrent-nox ${{ matrix.qbt_cross_name }}-${{ matrix.qbt_qt_version_name }}qbittorrent-nox
- name: Generate artifact attestation ${{ github.event.inputs.distinct_id }}
if: env.disable_qt5 != 'yes' # When qBittorrent v5 is released, remove this
uses: actions/attest-build-provenance@v2
with:
subject-path: "${{ env.qbt_build_dir }}/completed/${{ matrix.qbt_cross_name }}-${{ matrix.qbt_qt_version_name }}qbittorrent-nox"
- name: Docker - Release Info ${{ github.event.inputs.distinct_id }}
if: env.disable_qt5 != 'yes' # When qBittorrent v5 is released, remove this
run: docker exec -w /root/${{ env.qbt_build_dir }}/release_info multiarch bash -c 'mv *.md *.json '/root/${{ env.qbt_build_dir }}/completed''
# - name: Docker - upx compression ${{ github.event.inputs.distinct_id }}
# run: |
# docker exec -w /root multiarch apk add upx
# docker exec -w /root/${{ env.qbt_build_dir }}/completed multiarch upx --brute --no-lzma ${{ matrix.qbt_cross_name }}-${{ matrix.qbt_qt_version_name }}qbittorrent-nox
- name: Host - Upload libtorrent-v${{ matrix.qbt_libtorrent_version }}-qbittorrent-nox and release info artifact ${{ github.event.inputs.distinct_id }}
if: env.disable_qt5 != 'yes' # When qBittorrent v5 is released, remove this
uses: actions/upload-artifact@v4
with:
name: libtorrent-v${{ matrix.qbt_libtorrent_version }}-${{ matrix.qbt_cross_name }}-${{ matrix.qbt_qt_version_name }}qbittorrent-nox
path: |
${{ env.qbt_build_dir }}/completed/*
!${{ env.qbt_build_dir }}/completed/*.png
- name: Host - Upload cmake graphs artifact ${{ github.event.inputs.distinct_id }}
if: matrix.qbt_build_tool == 'cmake' && env.disable_qt5 != 'yes' # When qBittorrent v5 is released, remove this
uses: actions/upload-artifact@v4
with:
name: "${{ matrix.qbt_cross_name }}-libtorrent-v${{ matrix.qbt_libtorrent_version }}-graphs"
path: "${{ env.qbt_build_dir }}/completed/*.png"
release:
runs-on: ubuntu-latest
permissions:
contents: write
needs: build
if: always() && contains(needs.*.result, 'success') && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled')
strategy:
fail-fast: false
matrix:
qbt_libtorrent_version: ["1.2", "2.0"]
include:
- qbt_libtorrent_version: "1.2"
preview_release: true
- qbt_libtorrent_version: "2.0"
preview_release: false
name: "Publish release libtorrent-v${{ matrix.qbt_libtorrent_version }}"
env:
qbt_build_dir: "qbt-build"
steps:
- name: Checkout ${{ github.event.inputs.distinct_id }}
uses: actions/checkout@v4
- name: Pandoc - Bootstrap
run: |
pandoc_git_tag="$(git ls-remote -q -t --refs https://github.com/jgm/pandoc.git | awk '/tags\/[0-9]/{sub("refs/tags/", ""); print $2 }' | awk '!/^$/' | sort -rV | head -n 1)"
curl -sLo- "https://github.com/jgm/pandoc/releases/latest/download/pandoc-${pandoc_git_tag}-linux-amd64.tar.gz" | tar xzf - --strip-components 2 -C "$(pwd)" --exclude="share"
- name: Host - Download 1.2 qbittorrent-nox artifacts ${{ github.event.inputs.distinct_id }}
uses: actions/download-artifact@v4
with:
path: "1.2"
pattern: libtorrent-v1.2-*-qbittorrent-nox
merge-multiple: true
- name: Host - Download 2.0 qbittorrent-nox artifacts ${{ github.event.inputs.distinct_id }}
uses: actions/download-artifact@v4
with:
path: "2.0"
pattern: libtorrent-v2.0-*-qbittorrent-nox
merge-multiple: true
- name: Host - merge release-info ${{ github.event.inputs.distinct_id }}
run: |
if [[ ${{ matrix.qbt_libtorrent_version }} == "1.2" ]]; then
for release in 1\.2/*-release.md; do
[[ -f "${release}" ]] && release+=("${release}")
done
revision="$(jq -r .revision 1\.2/*-dependency-version.json | head -n1)"
boost="$(jq -r .boost 1\.2/*-dependency-version.json | head -n1)"
fi
if [[ ${{ matrix.qbt_libtorrent_version }} == "2.0" ]]; then
for release in 2\.0/*-release.md; do
[[ -f "${release}" ]] && release+=("${release}")
done
revision="$(jq -r .revision 2\.0/*-dependency-version.json | head -n1)"
boost="$(jq -r .boost 2\.0/*-dependency-version.json | head -n1)"
fi
readarray -t release_sorted < <(printf '%s\n' "${release[@]}" | sort)
for dependency_version_files in 1\.2/*-dependency-version.json 2\.0/*-dependency-version.json; do
if [[ -f "${dependency_version_files}" ]]; then
sed -r 's/"boost": (.*)/BOOST_PLACEHOLDER/g' -i "${dependency_version_files}"
sed -r 's/"revision": (.*)/REVISION_PLACEHOLDER/g' -i "${dependency_version_files}"
dependency_version+=("${dependency_version_files}")
fi
done
readarray -t dependency_version_sorted < <(printf '%s\n' "${dependency_version[@]}" | sort)
paste -d '\n' "${release_sorted[@]}" | uniq | awk '!(NF && seen[$0]++) || /^>/' > "tmp-release.md"
paste -d '\n' "${dependency_version_sorted[@]}" | uniq | awk '!(NF && seen[$0]++)' > "dependency-version.json"
sed -i "s|BOOST_PLACEHOLDER|\"boost\": \"${boost}\",|" dependency-version.json
sed -i "s|REVISION_PLACEHOLDER|\"revision\": \"${revision}\"|" dependency-version.json
./pandoc --wrap=preserve -f gfm tmp-release.md -t gfm -o release.md
- name: Host - Bootstrap release tag ${{ github.event.inputs.distinct_id }}
run: printf '%s\n' "release_tag=$(cat ${{ matrix.qbt_libtorrent_version }}/tag.md)" >> $GITHUB_ENV
- name: Host - Bootstrap release title ${{ github.event.inputs.distinct_id }}
run: printf '%s\n' "release_title=$(cat ${{ matrix.qbt_libtorrent_version }}/title.md)" >> $GITHUB_ENV
- name: Host- Create release - tag - assets ${{ github.event.inputs.distinct_id }}
uses: ncipollo/release-action@v1
with:
prerelease: "${{ matrix.preview_release }}"
artifacts: "${{ matrix.qbt_libtorrent_version }}/*-qbittorrent-nox,dependency-version.json"
replacesArtifacts: true
tag: "${{ env.release_tag }}"
name: "${{ env.release_title }}"
bodyFile: "release.md"
allowUpdates: true
token: "${{ github.TOKEN }}"
rerun-on-failure:
if: failure() && inputs.skip_rerun == '0'
name: rerun-on-failure
needs: release
permissions:
actions: write
runs-on: ubuntu-latest
env:
GH_TOKEN: "${{ github.TOKEN }}"
steps:
- uses: actions/checkout@v4
- name: Trigger rerun workflow on job failures
run: |
inputs_retries="${{ inputs.retries }}"
gh workflow run rerun.yml -f run_id=${{ github.run_id }} -f attempts=${{ github.run_attempt }} -f retries=${inputs_retries:-1}