Files
Zabbix/.gitea/workflows/build.yaml

203 lines
7.2 KiB
YAML

name: Zabbix APK Builder
on:
# Trigger on pushes to main/test branch into the zabbix-apk-builder directory
push:
branches: [ main, test ]
paths: [ 'zabbix-apk-builder/**' ]
# Scheduled runs at 06:00 UTC daily
schedule:
- cron: '0 6 * * *'
jobs:
check-version:
runs-on: ubuntu-latest
# Skip the execution if the commit author is the bot itself to prevent loops
if: ${{ gitea.event.head_commit.author.name != 'Gitea Action' }}
outputs:
should_build: ${{ steps.version-check.outputs.should_build }}
latest_version: ${{ steps.version-check.outputs.latest_version }}
current_version: ${{ steps.version-check.outputs.current_version }}
is_push_trigger: ${{ steps.version-check.outputs.is_push_trigger }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Check for new Zabbix version
id: version-check
run: |
set -euo pipefail
# Remove jq installation
# apt-get update && apt-get install -y jq
# Detect trigger type
IS_PUSH="${{ gitea.event_name == 'push' }}"
echo "is_push_trigger=${IS_PUSH}" >> "${GITHUB_OUTPUT}"
# Get versions
CURRENT_VERSION=$(grep '^pkgver=' zabbix-apk-builder/APKBUILD | cut -d'=' -f2)
LATEST_VERSION=$(curl -s "https://git.zabbix.com/rest/api/1.0/projects/ZBX/repos/zabbix/tags?limit=100" | \
grep -o '"displayId":"[^"]*"' | cut -d'"' -f4 | \
grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | grep -v 'rc\|beta\|alpha' | \
sort -V | tail -1)
echo "current_version=${CURRENT_VERSION}" >> "${GITHUB_OUTPUT}"
echo "latest_version=${LATEST_VERSION}" >> "${GITHUB_OUTPUT}"
# Always build on push, build on schedule if versions differ
if [[ "${IS_PUSH}" == "true" || "${CURRENT_VERSION}" != "${LATEST_VERSION}" ]]; then
echo "should_build=true" >> "${GITHUB_OUTPUT}"
else
echo "should_build=false" >> "${GITHUB_OUTPUT}"
fi
update-version:
needs: check-version
# Only update version during scheduled runs when new version is available
if: ${{ needs.check-version.outputs.should_build == 'true' && needs.check-version.outputs.is_push_trigger == 'false' && needs.check-version.outputs.current_version != needs.check-version.outputs.latest_version }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.ACCESS_TOKEN }}
- name: Update APKBUILD version
run: |
set -euo pipefail
LATEST_VERSION="${{ needs.check-version.outputs.latest_version }}"
CURRENT_VERSION="${{ needs.check-version.outputs.current_version }}"
echo "Updating APKBUILD from ${CURRENT_VERSION} to ${LATEST_VERSION}"
# Update pkgver
sed -i "s/^pkgver=.*/pkgver=${LATEST_VERSION}/" zabbix-apk-builder/APKBUILD
# Reset pkgrel to 0 for new version
sed -i "s/^pkgrel=.*/pkgrel=0/" zabbix-apk-builder/APKBUILD
# Clear checksums (will be regenerated during build)
sed -i 's/^sha512sums=.*/sha512sums="SKIP"/' zabbix-apk-builder/APKBUILD
# Commit changes with [ci skip] to prevent recursive triggers
git config --local user.email "action@gitea.com"
git config --local user.name "Gitea Action"
git add zabbix-apk-builder/APKBUILD
git commit -m "AUTO: Update Zabbix to version ${LATEST_VERSION} [ci skip]" || exit 0
git push
build-packages:
# Build packages after version update (for scheduled runs) or immediately (for push runs)
needs: [check-version, update-version]
# Run if should_build=true AND either update-version ran successfully OR it was skipped due to push trigger
if: ${{ needs.check-version.outputs.should_build == 'true' && (success() || needs.check-version.outputs.is_push_trigger == 'true') }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
# Use token to ensure we get the latest version if it was updated
token: ${{ secrets.ACCESS_TOKEN }}
ref: ${{ gitea.ref }}
- name: Verify build environment
run: |
set -euo pipefail
echo "=== Build Environment ==="
echo "Trigger type: ${{ gitea.event_name }}"
echo "Current branch: $(git branch --show-current)"
echo "APKBUILD version: $(grep '^pkgver=' zabbix-apk-builder/APKBUILD | cut -d'=' -f2)"
echo "Target version: ${{ needs.check-version.outputs.latest_version }}"
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Zabbix packages
env:
CI_RUN_ID: ${{ gitea.run_id }}
run: |
set -euo pipefail
cd zabbix-apk-builder
chmod +x build.sh
./build.sh
- name: Verify and list built packages
run: |
set -euo pipefail
cd zabbix-apk-builder
# Verify packages exist somewhere
PACKAGE_COUNT=$(find packages -name "*.apk" | wc -l)
if [[ $PACKAGE_COUNT -eq 0 ]]; then
echo "ERROR: No packages found"
find packages -type f 2>/dev/null || echo "packages directory is empty"
exit 1
fi
echo "Found $PACKAGE_COUNT packages:"
find packages -name "*.apk" -exec ls -lh {} \;
- name: Upload packages as artifacts
uses: actions/upload-artifact@v3
with:
name: zabbix-apk-packages-${{ gitea.run_number }}
path: zabbix-apk-builder/packages/**/*.apk
retention-days: 30
if-no-files-found: error
deploy-test:
needs: [check-version, build-packages]
if: ${{ needs.check-version.outputs.should_build == 'true' && contains(gitea.ref, 'test') }}
runs-on: ubuntu-latest
steps:
- name: Download packages
uses: actions/download-artifact@v3
with:
name: zabbix-apk-packages-${{ gitea.run_number }}
path: packages/
- name: Test deployment in Alpine container
run: |
set -euo pipefail
# Find packages
AGENT_PKG=$(find packages -name "zabbix-agent-*.apk" | head -1)
PROXY_PKG=$(find packages -name "zabbix-proxy-*.apk" | head -1)
# Test function
test_package() {
local pkg="$1"
local binary="$2"
if [[ -f "$pkg" ]]; then
echo "Testing $(basename "$pkg")..."
CONTAINER_ID=$(docker run -d alpine:latest sleep 30)
docker cp "$pkg" "$CONTAINER_ID:/$(basename "$pkg")"
if docker exec "$CONTAINER_ID" sh -c "
apk add --allow-untrusted /$(basename "$pkg") >/dev/null 2>&1
which $binary >/dev/null 2>&1
$binary --version >/dev/null 2>&1
"; then
echo "SUCCESS: $(basename "$pkg") test passed"
else
echo "FAIL: $(basename "$pkg") test failed"
fi
docker rm -f "$CONTAINER_ID" >/dev/null
else
echo "ERROR: Package not found: $pkg"
fi
}
test_package "$AGENT_PKG" "zabbix_agentd"
test_package "$PROXY_PKG" "zabbix_proxy"