Build Pacman Repo #236
This file contains 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 Pacman Repo | |
on: | |
push: | |
branches: ["master"] | |
pull_request: | |
branches: ["master"] | |
schedule: | |
- cron: "0 0 * * *" | |
concurrency: | |
group: "${{ github.workflow }}-${{ github.ref }}" | |
cancel-in-progress: true | |
jobs: | |
build-pacman-repo: | |
runs-on: ubuntu-latest | |
container: | |
image: archlinux/archlinux:base-devel | |
env: | |
DISPLAY: ":1" | |
CONTAINER_DIR: pkgbuilds | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- repo: lizardbyte | |
release_name: stable | |
- repo: lizardbyte-beta | |
release_name: beta | |
steps: | |
- name: Container Setup | |
run: | | |
pacman -Syy --disable-download-timeout --needed --noconfirm \ | |
archlinux-keyring | |
pacman -Syu --disable-download-timeout --needed --noconfirm \ | |
base-devel \ | |
cmake \ | |
cuda \ | |
git \ | |
jq \ | |
wget \ | |
xorg-server-xvfb | |
pacman -Scc --noconfirm | |
- name: Download Pacman Repo Builder | |
run: | | |
wget \ | |
"https://github.com/LizardByte/pacman-repo-builder/releases/latest/download/build-pacman-repo" \ | |
-O /usr/bin/build-pacman-repo | |
chmod +x /usr/bin/build-pacman-repo | |
# patch makepkg to allow running as root | |
build-pacman-repo patch-makepkg --replace | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Configure Git directory | |
# prevent fatal error when building stable matrix | |
if: matrix.release_name == 'stable' | |
run: git config --global --add safe.directory /__w/pacman-repo/pacman-repo | |
- name: Download and Patch beta PKGBUILDs | |
if: matrix.release_name == 'beta' | |
run: | | |
# we don't want any stable packages to be built, so remove them | |
rm -rf ${CONTAINER_DIR} | |
mkdir -p ${CONTAINER_DIR} | |
cd ${CONTAINER_DIR} | |
while IFS=' ' read -r repo og_pkg_name updated_pkg_name release_asset; do | |
# Skip lines that start with # | |
[[ $repo =~ ^#.*$ ]] && continue | |
echo "repo: ${repo}" | |
echo "og_pkg_name: ${og_pkg_name}" | |
echo "updated_pkg_name: ${updated_pkg_name}" | |
echo "release_asset: ${release_asset}" | |
# get the first release with the specified asset (pre-releases first, followed by stable) | |
latest_release=$( | |
curl -s "https://api.github.com/repos/${repo}/releases" | \ | |
jq -r --arg release_asset "${release_asset}" ' | |
map(.assets[] | select(.name == $release_asset) | .browser_download_url) | | |
first | |
' | |
) | |
echo "latest_release: ${latest_release}" | |
if [[ -z "${latest_release}" ]]; then | |
echo "::warning:: No pre-release found for ${repo} with asset ${release_asset}" | |
continue | |
fi | |
mkdir -p ${updated_pkg_name} | |
pushd ${updated_pkg_name} | |
wget "${latest_release}" -O "${updated_pkg_name}.pkg.tar.gz" | |
# extract the package | |
tar -xvf "${updated_pkg_name}.pkg.tar.gz" | |
rm "${updated_pkg_name}.pkg.tar.gz" | |
# sed PKGBUILD | |
sed -i "s/pkgname='${og_pkg_name}'/pkgname='${updated_pkg_name}'/" PKGBUILD | |
sed -i "s/provides=(.*)/provides=('${og_pkg_name}')/" PKGBUILD | |
sed -i "s/conflicts=(.*)/conflicts=('${og_pkg_name}')/" PKGBUILD | |
# Check if provides is missing and append if necessary | |
if ! grep -q "^provides=" PKGBUILD; then | |
echo "provides=('${og_pkg_name}')" >> PKGBUILD | |
fi | |
# Check if conflicts is missing and append if necessary | |
if ! grep -q "^conflicts=" PKGBUILD; then | |
echo "conflicts=('${og_pkg_name}')" >> PKGBUILD | |
fi | |
echo "new PKGBUILD:" | |
cat PKGBUILD | |
# re-generate .SRCINFO | |
makepkg --printsrcinfo > .SRCINFO | |
# list files | |
echo "files in ${updated_pkg_name}:" | |
ls -a | |
popd | |
done < ../beta-repos.conf | |
- name: Init | |
run: | | |
# create the destination directory for built packages | |
mkdir -p repo | |
# patch the build flags | |
sed -i 's,#MAKEFLAGS="-j2",MAKEFLAGS="-j$(nproc)",g' /etc/makepkg.conf | |
# start Xvfb which may be used for unit tests | |
Xvfb ${DISPLAY} -screen 0 1024x768x24 & | |
- name: Build Pacman Repo | |
run: | | |
source /etc/profile # ensure cuda is in the PATH | |
# generate build-pacman-repo.yaml | |
build-pacman-repo print-config \ | |
--repository repo/${{ matrix.repo }}.db.tar.gz \ | |
--container ${CONTAINER_DIR} \ | |
--require-pkgbuild \ | |
--require-srcinfo \ | |
--with-record-failed-builds repo/failed-build-records.yaml \ | |
--with-install-missing-dependencies true \ | |
--with-clean-before-build false \ | |
--with-clean-after-build false \ | |
--with-force-rebuild true \ | |
--with-pacman pacman \ | |
--with-arch-filter x86_64 \ | |
--with-check inherit \ | |
--with-packager "${{ secrets.GH_BOT_NAME }} <${{ secrets.GH_BOT_EMAIL }}>" \ | |
--with-allow-failure false \ | |
--with-dereference-database-symlinks true \ | |
> build-pacman-repo.yaml | |
# validate .SRCINFO files | |
build-pacman-repo sync-srcinfo || \ | |
echo "::warning:: .SRCINFO files mismatch" >> $GITHUB_STEP_SUMMARY && \ | |
build-pacman-repo sync-srcinfo -u | |
# build the packages and create the repo | |
build-pacman-repo build | |
# ensure files are present in the repo | |
repo_files=$(ls repo) | |
if [[ -z "${repo_files}" ]]; then | |
echo "::error:: No files found in repo" | |
exit 1 | |
fi | |
- name: Create/Update GitHub Release | |
if: github.event_name == 'schedule' || github.event_name == 'push' | |
uses: ncipollo/[email protected] | |
with: | |
allowUpdates: true | |
artifactErrorsFailBuild: true | |
artifacts: repo/* | |
bodyFile: README.md | |
commit: master | |
makeLatest: ${{ matrix.release_name == 'stable' || false }} | |
name: ${{ matrix.release_name }} | |
prerelease: ${{ matrix.release_name == 'beta' || false }} | |
tag: ${{ matrix.release_name }} | |
token: ${{ secrets.GH_BOT_TOKEN }} |