name: Build packages in CI
on:
merge_group:
pull_request:
jobs:
changed_files:
runs-on: ubuntu-latest
name: Get changed files
outputs:
all_changed_files: ${{ steps.changed-package-files.outputs.all_changed_files }}
any_changed: ${{ steps.changed-package-files.outputs.any_changed }}
specs: ${{ steps.packages.outputs.specs }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Get directories with spec files
id: specdirs
run: |
set -x
FILESLIST="./files.txt"
find . -type f -iname '*.spec' -exec 'dirname' '{}' ';' 2>/dev/null | xargs -I{} echo "{}/**" > $FILESLIST
echo "fileslist=$FILESLIST" >> $GITHUB_OUTPUT
- name: Get all changed files from package directores
id: changed-package-files
uses: step-security/changed-files@2e07db73e5ccdb319b9a6c7766bd46d39d304bad
with:
files_from_source_file: ${{ steps.specdirs.outputs.fileslist }}
- name: Get all packages that need to be rebuilt
id: packages
if: steps.changed-package-files.outputs.any_changed == 'true'
env:
ALL_CHANGED_FILES: ${{ steps.changed-package-files.outputs.all_changed_files }}
run: |
set -x
SPEC_DIRS=()
while IFS= read -r -d $'\0'; do
SPEC_DIRS+=("$(realpath "--relative-to=${GITHUB_WORKSPACE}" "$(dirname "${REPLY}")")")
done < <(find . -type f -iname '*.spec' -print0)
ALL_SPECS=()
for file in ${ALL_CHANGED_FILES} ; do
if [ "${file##*.}" == "spec" ] ; then
ALL_SPECS+=("$(realpath --relative-to="${GITHUB_WORKSPACE}" "${file}")")
continue
fi
cd "$(dirname "${file}")"
while : ; do
pwd
while IFS= read -r -d $'\0'; do
ALL_SPECS+=("$(realpath --relative-to="${GITHUB_WORKSPACE}" "${REPLY}")")
done < <(find . -maxdepth 1 -type f -iname "*.spec" -print0)
[[ " ${SPEC_DIRS[*]} " =~ [[:space:]]$(realpath --relative-to="${GITHUB_WORKSPACE}" ${PWD})[[:space:]] ]] && break
cd ..
done
cd "${GITHUB_WORKSPACE}"
done
IFS=" " read -r -a ALL_SPECS <<< "$(tr ' ' '\n' <<< "${ALL_SPECS[@]}" | sort -u | tr '\n' ' ')"
MATRIX="{\"specs\":[]}"
for spec in "${ALL_SPECS[@]}" ; do
[ -e "$spec" ] && MATRIX=$(jq -c ".specs += [\"$spec\"]" <<< $MATRIX)
done
echo "specs=$(jq -r -c '.specs' <<< "${MATRIX}")" >> $GITHUB_OUTPUT
build_packages:
runs-on: ${{ matrix.platform == 'amd64' && 'ubuntu-26.04' || 'ubuntu-26.04-arm' }}
needs: changed_files
name: Build RPM package
if: needs.changed_files.outputs.any_changed == 'true'
strategy:
fail-fast: false
matrix:
platform: ["arm64","amd64"]
chroot: ["fedora-44", "fedora-45", "epel-10"]
spec: ${{ fromJson(needs.changed_files.outputs.specs) }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Show container tooling versions
run: |
podman --version
buildah --version
podman info
- name: Setup Just
uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3
- name: Build ${{ matrix.spec }}
id: build_package
env:
CHROOT: ${{ matrix.chroot }}
SPEC_FILE: ${{ matrix.spec }}
run: |
set -x
just=$(which just)
mkdir -p containers
MOCK_DIR=./mock
CONTAINERS_DIR=./containers
SOURCES_DIR=.
export CONTAINERS_DIR
UBLUE_OS_ORG="ublue-os"
COPR_NAMESPACE="${UBLUE_OS_ORG}/$(basename $(dirname $(dirname $SPEC_FILE)))"
export MOCK_COPRS="https://download.copr.fedorainfracloud.org/results/${COPR_NAMESPACE}/${CHROOT}-$(arch)"
if ! $just build ${SPEC_FILE} -r ${CHROOT}-$(arch) ; then
echo "Retrying with a network connection"
$just build ${SPEC_FILE} -r ${CHROOT}-$(arch) --enable-network
fi
SKIPPED_ARCH=false
if [ -e "$SOURCES_DIR/arch_skipped" ] ; then
SKIPPED_ARCH=true
fi
sudo chown -R $(id -u):$(id -g) $MOCK_DIR
echo "mock_dir=$MOCK_DIR" >> "$GITHUB_OUTPUT"
echo "containers_dir=$CONTAINERS_DIR" >> "$GITHUB_OUTPUT"
echo "sources_dir=$SOURCES_DIR" >> "$GITHUB_OUTPUT"
echo "skipped_arch=$SKIPPED_ARCH" >> "$GITHUB_OUTPUT"
echo "package=$(basename "${{ matrix.spec }}" ".spec")" >> "$GITHUB_OUTPUT"
- name: Upload to Job Artifacts
if: steps.build_package.outputs.skipped_arch == 'false'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: ${{ matrix.chroot }}-${{ matrix.platform }}-${{ steps.build_package.outputs.package }}
if-no-files-found: error
path: |
${{ steps.build_package.outputs.mock_dir }}/**/*.rpm
check:
name: Check all builds successful
if: always()
runs-on: ubuntu-latest
needs: [build_packages]
steps:
- name: Check Jobs
env:
JOBS: ${{ toJson(needs) }}
run: |
echo "Job status:"
echo $JOBS | jq -r 'to_entries[] | " - \(.key): \(.value.result)"'
for i in $(echo $JOBS | jq -r 'to_entries[] | .value.result'); do
if [ "$i" != "success" ] && [ "$i" != "skipped" ]; then
echo ""
echo "Status check not okay!"
exit 1
fi
done