Feature: Add multi-line input (#438) #305
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.3 | |
| uses: actions/setup-go@v4 | |
| with: | |
| go-version: 1.24.3 | |
| - name: Build qp binary | |
| run: | | |
| export GOOS=${{ matrix.goos || 'linux' }} | |
| export GOARCH=${{ matrix.goarch }} | |
| BUILD_TAGS="-tags noextradeps" | |
| if [ -n "${{ matrix.goarm }}" ]; then | |
| export GOARM=${{ matrix.goarm }} | |
| fi | |
| if [ -n "${{ matrix.gomips }}" ]; then | |
| BUILD_TAGS="${BUILD_TAGS},nosqlite" | |
| export GOMIPS=${{ matrix.gomips }} | |
| echo "Building for MIPS architecture without SQLite support" | |
| fi | |
| go build -trimpath $BUILD_TAGS -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: Copy hooks from packaging branch | |
| run: | | |
| if [ -d hooks ]; then | |
| cp -r hooks ./release/ | |
| fi | |
| - 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 | |
| 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 | |
| cp ./release/hooks/pacman/* ./release/temp-qp/qp-${{ env.TAG_NAME }}/ | |
| 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 \ | |
| -C ./hooks/pacman update-qp-cache.hook | |
| 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: 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: Upload Artifacts to qp 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: Update Homebrew Tap Formula | |
| run: | | |
| git clone https://${HOMEBREW_QP_TOKEN}@github.com/Zweih/homebrew-qp.git | |
| cd homebrew-qp | |
| BRANCH_NAME="update-qp-${TAG_NAME#v}" | |
| git checkout -b "$BRANCH_NAME" | |
| 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 "$BRANCH_NAME" | |
| gh pr create \ | |
| --title "Update qp formula to v${VERSION}" \ | |
| --body "Automated update of qp formula to version ${VERSION}" \ | |
| --head "$BRANCH_NAME" \ | |
| --base master | |
| cd .. | |
| env: | |
| TAG_NAME: ${{ env.TAG_NAME }} | |
| HOMEBREW_QP_TOKEN: ${{ secrets.HOMEBREW_QP_TOKEN }} | |
| GH_TOKEN: ${{ secrets.HOMEBREW_QP_TOKEN }} | |
| - name: Upload signatures to query-packages-signatures release | |
| run: | | |
| gh release create "${{ env.TAG_NAME }}" \ | |
| --repo Zweih/query-packages-signatures \ | |
| --draft \ | |
| --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: Delete qp Draft Release if Job Failed | |
| if: ${{ (failure() || cancelled()) && env.created == 'true' }} | |
| run: | | |
| echo "Workflow failed. Deleting draft releases for ${TAG_NAME}..." | |
| gh release delete "${TAG_NAME}" --yes || echo "No release found or already deleted." | |
| env: | |
| GH_TOKEN: ${{ github.token }} |