Skip to content

Feature: Add multi-line input (#438) #305

Feature: Add multi-line input (#438)

Feature: Add multi-line input (#438) #305

Workflow file for this run

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 }}