Feature: Prefixes with limit macros (e.g. limit end:all) (#336)
#203
Workflow file for this run
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 and Release qp | |
| on: | |
| push: | |
| tags: | |
| - 'v*' | |
| workflow_dispatch: # allow manual trigger from github UI | |
| inputs: | |
| ref: | |
| description: 'Git ref to build' | |
| required: true | |
| default: 'main' | |
| permissions: | |
| contents: write | |
| jobs: | |
| build: | |
| name: Build qp for ${{ matrix.arch }} | |
| runs-on: ubuntu-latest | |
| env: | |
| TAG_NAME: ${{ github.ref_type == 'tag' && github.ref_name || inputs.ref }} | |
| strategy: | |
| matrix: | |
| arch: [x86_64, armv7h, aarch64, darwin_amd64, darwin_arm64, mipsel] | |
| include: | |
| - arch: x86_64 | |
| goarch: amd64 | |
| - arch: armv7h | |
| goarch: arm | |
| goarm: 7 | |
| - arch: darwin_amd64 | |
| goarch: amd64 | |
| goos: darwin | |
| - arch: darwin_arm64 | |
| goarch: arm64 | |
| goos: darwin | |
| - arch: aarch64 | |
| goarch: arm64 | |
| - arch: mipsel | |
| goarch: mipsle | |
| gomips: softfloat | |
| steps: | |
| - name: echo TAG_NAME | |
| run: | | |
| echo "Resolved TAG_NAME is: ${{ env.TAG_NAME }}" | |
| - name: Checkout repository | |
| uses: actions/checkout@v3 | |
| with: | |
| ref: ${{ inputs.ref }} | |
| - name: Set up Go 1.24.1 | |
| uses: actions/setup-go@v4 | |
| with: | |
| go-version: 1.24.1 | |
| - name: Build qp binary | |
| run: | | |
| export GOOS=${{ matrix.goos || 'linux' }} | |
| export GOARCH=${{ matrix.goarch }} | |
| if [ -n "${{ matrix.goarm }}" ]; then | |
| export GOARM=${{ matrix.goarm }} | |
| fi | |
| if [ -n "${{ matrix.gomips }}" ]; then | |
| export GOMIPS=${{ matrix.gomips }} | |
| fi | |
| go build -trimpath -ldflags="-s -w \ | |
| -X qp/internal/about.Version=${{ env.TAG_NAME }} \ | |
| -X qp/internal/about.Commit=$(git rev-parse HEAD) \ | |
| -X qp/internal/about.Date=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ | |
| -v -o qp-${{ matrix.arch }} ./cmd/qp | |
| - name: Upload built binary | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: qp-${{ matrix.arch }} | |
| path: qp-${{ matrix.arch }} | |
| release: | |
| name: Release qp | |
| needs: build | |
| runs-on: ubuntu-latest | |
| env: | |
| TAG_NAME: ${{ github.ref_type == 'tag' && github.ref_name || inputs.ref }} | |
| steps: | |
| - name: echo TAG_NAME | |
| run: | | |
| echo "Resolved TAG_NAME is: ${{ env.TAG_NAME }}" | |
| - name: Install dependencies for .SRCINFO and NEWS generation | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y pacman fakeroot makepkg gh git python3 | |
| - name: Checkout repository | |
| uses: actions/checkout@v3 | |
| with: | |
| ref: ${{ inputs.ref }} | |
| - name: Download artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: ./release | |
| merge-multiple: true | |
| - name: Import GPG key | |
| run: | | |
| echo "$GPG_PRIVATE_KEY" | gpg --batch --import | |
| KEY_ID=$(gpg --list-keys --with-colons | awk -F: '/^pub/ { print $5; exit }') | |
| echo -e "5\ny\n" | gpg --batch --yes --no-tty --command-fd 0 --expert --edit-key "$KEY_ID" trust | |
| env: | |
| GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} | |
| - name: Inject version and date into man page | |
| run: | | |
| VERSION="${TAG_NAME#v}" | |
| DATE=$(date -u +'%B %Y') | |
| sed -e "s/@VERSION@/${VERSION}/g" -e "s/@DATE@/$DATE/g" qp.1 > ./release/qp.1 | |
| - name: Checkout packaging branch | |
| run: | | |
| git fetch origin packaging | |
| git checkout packaging | |
| - name: Create Draft Release | |
| run: | | |
| gh release create "${{ env.TAG_NAME }}" \ | |
| --draft \ | |
| --generate-notes | |
| echo "created=true" >> $GITHUB_ENV | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| - name: Generate NEWS file | |
| run: | | |
| touch ./release/NEWS | |
| echo "# qp Release Notes" > ./release/NEWS | |
| gh release list --limit 100 | \ | |
| cut -f1 | \ | |
| grep -E '^v[0-9]+\.' | \ | |
| sort -Vr | \ | |
| awk -v min="4.1.4" '{ | |
| ver = $1; | |
| sub(/^v/, "", ver); | |
| if (system("dpkg --compare-versions " ver " ge " min) == 0) print $1 | |
| }' | \ | |
| while read tag; do | |
| echo "" >> ./release/NEWS | |
| echo "## $tag" >> ./release/NEWS | |
| gh release view "$tag" --json body --template '{{.body}}' | sed 's/^#/##/' >> ./release/NEWS | |
| echo "" >> ./release/NEWS | |
| done | |
| # clean up spacing between sections | |
| sed -e 's/\r$//' -e '/^[[:space:]]*$/d' ./release/NEWS > ./release/NEWS.cleaned | |
| awk -f ./normalize_news.awk ./release/NEWS.cleaned > ./release/NEWS.final | |
| mv ./release/NEWS.final ./release/NEWS | |
| rm -f ./release/NEWS.cleaned ./release/NEWS.final | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| - name: Checkout source branch | |
| run: | | |
| git checkout ${{ env.TAG_NAME }} | |
| - name: Package AUR source tarball with manpage and NEWS | |
| run: | | |
| mkdir -p ./release/temp-qp/qp-${{ env.TAG_NAME }} | |
| git archive --format=tar HEAD | tar -x -C ./release/temp-qp/qp-${{ env.TAG_NAME }} | |
| cp ./release/NEWS ./release/temp-qp/qp-${{ env.TAG_NAME }}/ | |
| echo "-s -w \ | |
| -X qp/internal/about.Version=${TAG_NAME} \ | |
| -X qp/internal/about.Commit=$(git rev-parse HEAD) \ | |
| -X qp/internal/about.Date=$(date -u +%Y-%m-%dT%H:%M:%SZ)" > ./release/temp-qp/qp-${TAG_NAME}/.ldflags | |
| cp ./release/qp.1 ./release/temp-qp/qp-${{ env.TAG_NAME }}/qp.1 | |
| tar -czf ./release/qp-${{ env.TAG_NAME }}.tar.gz -C ./release/temp-qp qp-${{ env.TAG_NAME }} | |
| - name: Checkout packaging branch | |
| run: | | |
| git checkout packaging | |
| - name: Package AUR binaries with manpage and NEWS | |
| run: | | |
| source ./packaging_targets.sh | |
| for binary in ./release/qp-*; do | |
| arch=$(basename "$binary" | cut -d'-' -f2) | |
| if should_package aur_archs "$arch"; then | |
| echo "Packaging $binary for AUR" | |
| tar -czvf ./release/qp-${{ env.TAG_NAME }}-${arch}.tar.gz -C ./release "$(basename "$binary")" qp.1 NEWS | |
| else | |
| echo "Skipping $binary for AUR packaging" | |
| fi | |
| done | |
| - name: Package Homebrew tarballs | |
| run: | | |
| source ./packaging_targets.sh | |
| for binary in ./release/qp-*; do | |
| arch=$(basename "$binary" | cut -d'-' -f2) | |
| mkdir -p ./release/homebrew-tmp | |
| cp "$binary" ./release/homebrew-tmp/qp | |
| cp ./release/qp.1 ./release/homebrew-tmp/ | |
| cp ./release/NEWS ./release/homebrew-tmp/ | |
| if should_package brew_archs "$arch"; then | |
| echo "Packaging $binary for Homebrew" | |
| tar -czvf ./release/qp-${{ env.TAG_NAME }}-brew-${arch}.tar.gz -C ./release/homebrew-tmp qp qp.1 NEWS | |
| rm -rf ./release/homebrew-tmp | |
| else | |
| echo "Skipping $binary for Homebrew packaging" | |
| fi | |
| done | |
| - name: Package .deb | |
| run: | | |
| source ./packaging_targets.sh | |
| chmod +x ./package_deb.sh | |
| for binary in ./release/qp-*; do | |
| arch=$(basename "$binary" | cut -d'-' -f2) | |
| if should_package deb_archs "$arch"; then | |
| echo "Packaging $binary as .deb" | |
| ./package_deb.sh "${TAG_NAME#v}" "" "$binary" ./release/NEWS ./release/qp.1 ./debian/copyright ./release | |
| else | |
| echo "Skipping $binary for .deb packaging" | |
| fi | |
| done | |
| - name: Package .ipk for opkg | |
| run: | | |
| source ./packaging_targets.sh | |
| chmod +x ./package_opkg.sh | |
| git clone https://git.yoctoproject.org/opkg-utils | |
| cd opkg-utils && sudo make install && cd .. | |
| for binary in ./release/qp-*; do | |
| arch=$(basename "$binary" | cut -d'-' -f2) | |
| if should_package opkg_archs "$arch"; then | |
| ./package_opkg.sh "${TAG_NAME#v}" "$arch" "$binary" ./release/NEWS ./release/qp.1 ./release | |
| fi | |
| done | |
| - name: Generate SHA256 checksums | |
| run: | | |
| cd ./release | |
| sha256sum qp-*.tar.gz > SHA256SUMS.txt | |
| - name: Sign release tarballs | |
| run: | | |
| for file in ./release/qp-*.tar.gz; do | |
| gpg --batch --yes --armor --detach-sign "$file" | |
| done | |
| - name: Upload signatures to query-packages-signatures release | |
| run: | | |
| gh release create "${{ env.TAG_NAME }}" \ | |
| --repo Zweih/query-packages-signatures \ | |
| --title "Signatures for qp ${{ env.TAG_NAME }}" \ | |
| --notes "Detached signatures for qp release ${{ env.TAG_NAME }}" \ | |
| ./release/qp-*.asc | |
| env: | |
| GH_TOKEN: ${{ secrets.QP_SIGNATURES_TOKEN }} | |
| - name: Update Homebrew Tap Formula | |
| run: | | |
| git clone https://${HOMEBREW_QP_TOKEN}@github.com/Zweih/homebrew-qp.git | |
| cd homebrew-qp | |
| FORMULA="Formula/qp.rb" | |
| VERSION="${TAG_NAME#v}" | |
| CHECKSUM_FILE="../release/SHA256SUMS.txt" | |
| SHA256_AMD64=$(grep "qp-${TAG_NAME}-brew-darwin_amd64.tar.gz" "$CHECKSUM_FILE" | cut -d ' ' -f1) | |
| SHA256_ARM64=$(grep "qp-${TAG_NAME}-brew-darwin_arm64.tar.gz" "$CHECKSUM_FILE" | cut -d ' ' -f1) | |
| SHA256_LINUX_X86_64=$(grep "qp-${TAG_NAME}-brew-x86_64.tar.gz" "$CHECKSUM_FILE" | cut -d ' ' -f1) | |
| SHA256_LINUX_AARCH64=$(grep "qp-${TAG_NAME}-brew-aarch64.tar.gz" "$CHECKSUM_FILE" | cut -d ' ' -f1) | |
| sed -i "s/^ version \".*\"/ version \"${VERSION}\"/" "$FORMULA" | |
| sed -i "s/^ sha256_amd64 = \".*\"/ sha256_amd64 = \"${SHA256_AMD64}\"/" "$FORMULA" | |
| sed -i "s/^ sha256_arm64 = \".*\"/ sha256_arm64 = \"${SHA256_ARM64}\"/" "$FORMULA" | |
| sed -i "s/^ sha256_linux_x86_64 = \".*\"/ sha256_linux_x86_64 = \"${SHA256_LINUX_X86_64}\"/" "$FORMULA" | |
| sed -i "s/^ sha256_linux_aarch64 = \".*\"/ sha256_linux_aarch64 = \"${SHA256_LINUX_AARCH64}\"/" "$FORMULA" | |
| git config user.name "github-actions[bot]" | |
| git config user.email "github-actions[bot]@users.noreply.github.com" | |
| git add $FORMULA | |
| git commit -m "Update qp formula to v${VERSION}" | |
| git push origin master | |
| env: | |
| TAG_NAME: ${{ env.TAG_NAME }} | |
| HOMEBREW_QP_TOKEN: ${{ secrets.HOMEBREW_QP_TOKEN }} | |
| - name: Update PKGBUILDs for qp-bin and qp-src | |
| run: | | |
| source ./packaging_targets.sh | |
| chmod +x ./update_checksums.sh | |
| VERSION="${TAG_NAME#v}" | |
| CHECKSUMS_FILE=./release/SHA256SUMS.txt | |
| for pkg in qp-bin qp-src; do | |
| sed -i "s/^pkgver=.*/pkgver=${VERSION}/" $pkg/PKGBUILD | |
| sed -i "s/^pkgrel=.*/pkgrel=1/" $pkg/PKGBUILD | |
| for binary in ./release/qp-*; do | |
| arch=$(basename "$binary" | cut -d'-' -f2) | |
| if should_package aur_archs "$arch"; then | |
| ./update_checksums.sh $pkg/PKGBUILD $CHECKSUMS_FILE | |
| fi | |
| done | |
| done | |
| - name: Generate pkgver for qp-git | |
| run: | | |
| cd qp-git | |
| makepkg --nobuild --nodeps --clean --cleanbuild --noconfirm | |
| echo "Updated qp-git/pkgver to $(grep '^pkgver=' PKGBUILD | cut -d'=' -f2)" | |
| rm -rf src pkg qp | |
| - name: Generate .SRCINFO for qp-bin, qp-src, and qp-git | |
| run: | | |
| for pkg in qp-bin qp-src qp-git; do | |
| (cd $pkg && makepkg --printsrcinfo --noconfirm > .SRCINFO) | |
| done | |
| - name: Commit updated PKGBUILDs, .SRCINFOs, and NEWS to packaging branch | |
| run: | | |
| git config --global user.name "github-actions[bot]" | |
| git config --global user.email "github-actions[bot]@users.noreply.github.com" | |
| cp ./release/NEWS . | |
| git add NEWS | |
| for pkg in qp-bin qp-src qp-git; do | |
| git add $pkg/PKGBUILD $pkg/.SRCINFO | |
| done | |
| git commit -m "Update packaging for release ${{ env.TAG_NAME }}" | |
| git push origin packaging | |
| - name: Filter .ipk packages to main vs extra repo | |
| run: | | |
| chmod +x ./filter_release_ipks.sh | |
| ./filter_release_ipks.sh | |
| - name: Publish Release | |
| run: | | |
| cd ./release | |
| gh release upload "${{ env.TAG_NAME }}" qp-*.tar.gz qp-*.deb qp-*.ipk --clobber | |
| cd .. | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| - name: Publish extra .ipk packages to qp-extra-packages | |
| if: ${{ env.TAG_NAME != '' }} | |
| run: | | |
| cd ./release-extra | |
| if ls *.ipk 1> /dev/null 2>&1; then | |
| echo "Creating draft release in qp-extra-packages..." | |
| gh release create "${{ env.TAG_NAME }}" \ | |
| --repo Zweih/qp-extra-packages \ | |
| --title "qp ${{ env.TAG_NAME }} extra packages" \ | |
| --notes "Extended architecture packages for qp ${{ env.TAG_NAME }}" \ | |
| --draft | |
| echo "Uploading extra .ipk packages..." | |
| gh release upload "${{ env.TAG_NAME }}" *.ipk \ | |
| --repo Zweih/qp-extra-packages \ | |
| --clobber | |
| else | |
| echo "No extra .ipk packages to upload." | |
| fi | |
| cd .. | |
| env: | |
| GH_TOKEN: ${{ secrets.QP_EXTRA_PACKAGES_TOKEN }} | |
| - name: Delete Draft Release if Job Failed | |
| if: ${{ (failure() || cancelled()) && env.created == 'true' }} | |
| run: | | |
| echo "Workflow failed. Deleting draft release ${TAG_NAME}..." | |
| gh release delete "${TAG_NAME}" --yes || echo "No release found or already deleted." | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |