CHANGE: Added CI/CD part. Did not tested it
This commit is contained in:
234
zabbix-apk-builder/.github/workflows/build.yml
vendored
234
zabbix-apk-builder/.github/workflows/build.yml
vendored
@@ -0,0 +1,234 @@
|
||||
name: Zabbix APK Builder
|
||||
|
||||
on:
|
||||
# Manual trigger
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
force_build:
|
||||
description: 'Force build even if version unchanged'
|
||||
required: false
|
||||
default: 'false'
|
||||
type: boolean
|
||||
|
||||
# Scheduled check for new versions (daily at 6 AM UTC)
|
||||
schedule:
|
||||
- cron: '0 6 * * *'
|
||||
|
||||
# Trigger on pushes to main/test branch
|
||||
push:
|
||||
branches: [ main, test ]
|
||||
paths: [ 'APKBUILD', 'Dockerfile', 'build.sh', '*.initd', '*.confd' ]
|
||||
|
||||
jobs:
|
||||
check-version:
|
||||
runs-on: ubuntu-latest
|
||||
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 }}
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Check for new Zabbix version
|
||||
id: version-check
|
||||
run: |
|
||||
# Get current version from APKBUILD
|
||||
CURRENT_VERSION=$(grep '^pkgver=' APKBUILD | cut -d'=' -f2)
|
||||
echo "current_version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
|
||||
echo "Current version: $CURRENT_VERSION"
|
||||
|
||||
# Get latest version from Zabbix Bitbucket API (stable releases only)
|
||||
LATEST_VERSION=$(curl -s "https://git.zabbix.com/rest/api/1.0/projects/ZBX/repos/zabbix/tags?limit=100" | \
|
||||
jq -r '.values[].displayId' | \
|
||||
grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | \
|
||||
grep -v 'rc\|beta\|alpha' | \
|
||||
sort -V | \
|
||||
tail -1)
|
||||
|
||||
echo "latest_version=$LATEST_VERSION" >> $GITHUB_OUTPUT
|
||||
echo "Latest version: $LATEST_VERSION"
|
||||
|
||||
# Determine if we should build
|
||||
if [ "$CURRENT_VERSION" != "$LATEST_VERSION" ] || [ "${{ inputs.force_build }}" = "true" ]; then
|
||||
echo "should_build=true" >> $GITHUB_OUTPUT
|
||||
echo "Build required: Version changed or force build requested"
|
||||
else
|
||||
echo "should_build=false" >> $GITHUB_OUTPUT
|
||||
echo "No build required: Version unchanged"
|
||||
fi
|
||||
|
||||
update-version:
|
||||
needs: check-version
|
||||
if: needs.check-version.outputs.should_build == 'true'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Update APKBUILD version
|
||||
run: |
|
||||
LATEST_VERSION="${{ needs.check-version.outputs.latest_version }}"
|
||||
CURRENT_VERSION="${{ needs.check-version.outputs.current_version }}"
|
||||
|
||||
if [ "$CURRENT_VERSION" != "$LATEST_VERSION" ]; then
|
||||
echo "Updating APKBUILD from $CURRENT_VERSION to $LATEST_VERSION"
|
||||
|
||||
# Update pkgver
|
||||
sed -i "s/^pkgver=.*/pkgver=$LATEST_VERSION/" APKBUILD
|
||||
|
||||
# Reset pkgrel to 0 for new version
|
||||
sed -i "s/^pkgrel=.*/pkgrel=0/" APKBUILD
|
||||
|
||||
# Clear checksums (will be regenerated during build)
|
||||
sed -i '/^sha512sums="/,/^"$/c\sha512sums="\nSKIP\nSKIP\nSKIP\nSKIP\nSKIP\n"' APKBUILD
|
||||
|
||||
# Commit changes
|
||||
git config --local user.email "action@github.com"
|
||||
git config --local user.name "GitHub Action"
|
||||
git add APKBUILD
|
||||
git commit -m "Update Zabbix to version $LATEST_VERSION" || exit 0
|
||||
git push
|
||||
fi
|
||||
|
||||
build-packages:
|
||||
needs: [check-version, update-version]
|
||||
if: needs.check-version.outputs.should_build == 'true'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.ref }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Build Zabbix packages
|
||||
run: |
|
||||
chmod +x build.sh
|
||||
./build.sh
|
||||
|
||||
- name: List built packages
|
||||
run: |
|
||||
echo "Built packages:"
|
||||
ls -la packages/
|
||||
|
||||
echo "Package sizes:"
|
||||
du -h packages/*.apk
|
||||
|
||||
- name: Upload packages as artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: zabbix-apk-packages
|
||||
path: packages/*.apk
|
||||
retention-days: 30
|
||||
|
||||
- name: Create release
|
||||
if: github.ref == 'refs/heads/main'
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
tag_name: "v${{ needs.check-version.outputs.latest_version }}"
|
||||
name: "Zabbix ${{ needs.check-version.outputs.latest_version }} APK Packages"
|
||||
body: |
|
||||
Automated build of Zabbix ${{ needs.check-version.outputs.latest_version }} packages for Alpine Linux.
|
||||
|
||||
## Packages
|
||||
- `zabbix-agent-${{ needs.check-version.outputs.latest_version }}-r0.apk` - Monitoring agent
|
||||
- `zabbix-proxy-${{ needs.check-version.outputs.latest_version }}-r0.apk` - Network proxy
|
||||
- `zabbix-${{ needs.check-version.outputs.latest_version }}-r0.apk` - Meta package
|
||||
|
||||
## Installation
|
||||
```bash
|
||||
apk add --allow-untrusted zabbix-agent-${{ needs.check-version.outputs.latest_version }}-r0.apk
|
||||
rc-update add zabbix-agent default
|
||||
rc-service zabbix-agent start
|
||||
```
|
||||
files: packages/*.apk
|
||||
draft: false
|
||||
prerelease: false
|
||||
|
||||
publish-to-gitea:
|
||||
needs: [check-version, build-packages]
|
||||
if: needs.check-version.outputs.should_build == 'true'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Download packages
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: zabbix-apk-packages
|
||||
path: packages/
|
||||
|
||||
- name: Setup SSH for Gitea
|
||||
run: |
|
||||
mkdir -p ~/.ssh
|
||||
echo "${{ secrets.GITEA_SSH_KEY }}" > ~/.ssh/id_rsa
|
||||
chmod 600 ~/.ssh/id_rsa
|
||||
ssh-keyscan -H gitea-repo >> ~/.ssh/known_hosts 2>/dev/null || true
|
||||
|
||||
- name: Publish to Gitea repository
|
||||
run: |
|
||||
# Clone or update the packages repository
|
||||
git clone git@gitea-repo:mbuz/Zabbix.git gitea-repo || true
|
||||
cd gitea-repo
|
||||
|
||||
# Create packages directory structure
|
||||
mkdir -p alpine/v3.18/main/x86_64
|
||||
|
||||
# Copy new packages
|
||||
cp ../packages/*.apk alpine/v3.18/main/x86_64/
|
||||
|
||||
# Update package index (simplified)
|
||||
cd alpine/v3.18/main/x86_64
|
||||
ls *.apk > PACKAGES.txt
|
||||
|
||||
# Commit and push
|
||||
git config --local user.email "action@github.com"
|
||||
git config --local user.name "GitHub Action"
|
||||
git add .
|
||||
git commit -m "Add Zabbix ${{ needs.check-version.outputs.latest_version }} packages" || exit 0
|
||||
git push
|
||||
|
||||
deploy-test:
|
||||
needs: [check-version, build-packages]
|
||||
if: needs.check-version.outputs.should_build == 'true' && github.ref == 'refs/heads/test'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Download packages
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: zabbix-apk-packages
|
||||
path: packages/
|
||||
|
||||
- name: Test deployment in Alpine container
|
||||
run: |
|
||||
# Test agent package
|
||||
docker run --rm -v $PWD/packages:/packages alpine:latest sh -c "
|
||||
apk add --allow-untrusted /packages/zabbix-agent-*.apk
|
||||
which zabbix_agentd
|
||||
zabbix_agentd --version
|
||||
"
|
||||
|
||||
# Test proxy package
|
||||
docker run --rm -v $PWD/packages:/packages alpine:latest sh -c "
|
||||
apk add --allow-untrusted /packages/zabbix-proxy-*.apk
|
||||
which zabbix_proxy
|
||||
zabbix_proxy --version
|
||||
"
|
||||
|
||||
echo "✅ Package deployment test passed"
|
||||
|
||||
258
zabbix-apk-builder/CI-CD-DOCS.md
Normal file
258
zabbix-apk-builder/CI-CD-DOCS.md
Normal file
@@ -0,0 +1,258 @@
|
||||
# CI/CD Pipeline Documentation
|
||||
|
||||
## Overview
|
||||
|
||||
This CI/CD pipeline automates the entire Zabbix APK package lifecycle from version detection to deployment. It's designed to work with your Gitea repository and provides both automated and manual build capabilities.
|
||||
|
||||
## Pipeline Architecture
|
||||
|
||||
```
|
||||
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
|
||||
│ Version Check │ -> │ Update APKBUILD │ -> │ Build Packages │
|
||||
│ (Zabbix Git) │ │ (Auto-commit) │ │ (Docker) │
|
||||
└─────────────────┘ └──────────────────┘ └─────────────────┘
|
||||
│
|
||||
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
|
||||
│ Deploy Test │ <- │ Publish to Gitea │ <- │ Create Release │
|
||||
│ (Alpine Test) │ │ (Package Repo) │ │ (GitHub) │
|
||||
└─────────────────┘ └──────────────────┘ └─────────────────┘
|
||||
```
|
||||
|
||||
## Version Detection Strategy
|
||||
|
||||
### Primary Method: Zabbix Bitbucket API
|
||||
- **Endpoint**: `https://git.zabbix.com/rest/api/1.0/projects/ZBX/repos/zabbix/tags`
|
||||
- **Process**:
|
||||
1. Fetches all tags from Zabbix official repository
|
||||
2. Filters for stable releases (excludes rc, beta, alpha)
|
||||
3. Sorts versions and selects the latest
|
||||
- **Advantages**:
|
||||
- Official Zabbix repository
|
||||
- Real-time release information
|
||||
- Includes all release types for filtering
|
||||
|
||||
### Fallback Options
|
||||
If the Bitbucket API fails:
|
||||
1. **CDN Scraping**: Parse `https://cdn.zabbix.com/zabbix/sources/stable/`
|
||||
2. **RSS Feed**: Monitor Zabbix blog/announcements
|
||||
3. **Manual Trigger**: Force build via GitHub Actions
|
||||
|
||||
## Jobs Breakdown
|
||||
|
||||
### 1. **check-version**
|
||||
- **Purpose**: Monitors Zabbix releases for new versions
|
||||
- **Method**: Queries Zabbix Bitbucket API for latest stable release
|
||||
- **Logic**:
|
||||
```bash
|
||||
# Filters tags to stable releases only
|
||||
grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' |
|
||||
grep -v 'rc\|beta\|alpha' |
|
||||
sort -V | tail -1
|
||||
```
|
||||
- **Output**: Determines if build is needed and provides version info
|
||||
|
||||
### 2. **update-version**
|
||||
- **Purpose**: Automatically updates APKBUILD when new version found
|
||||
- **Actions**:
|
||||
- Updates `pkgver` to latest version
|
||||
- Resets `pkgrel` to 0
|
||||
- Clears checksums (regenerated during build)
|
||||
- Commits and pushes changes
|
||||
|
||||
### 3. **build-packages**
|
||||
- **Purpose**: Builds APK packages using Docker
|
||||
- **Process**:
|
||||
- Sets up Docker Buildx
|
||||
- Runs `./build.sh`
|
||||
- Uploads packages as artifacts
|
||||
- Creates GitHub release (main branch only)
|
||||
|
||||
### 4. **publish-to-gitea**
|
||||
- **Purpose**: Publishes packages to your Gitea repository
|
||||
- **Process**:
|
||||
- Downloads built packages
|
||||
- Clones Gitea repo using SSH
|
||||
- Organizes packages in Alpine repository structure
|
||||
- Updates package index
|
||||
- Commits and pushes to Gitea
|
||||
|
||||
### 5. **deploy-test**
|
||||
- **Purpose**: Tests package installation (test branch only)
|
||||
- **Process**:
|
||||
- Downloads packages
|
||||
- Tests installation in fresh Alpine containers
|
||||
- Verifies binaries work correctly
|
||||
|
||||
## Trigger Conditions
|
||||
|
||||
### Automatic Triggers
|
||||
- **Daily Check**: Runs at 6 AM UTC to check for new Zabbix versions
|
||||
- **Code Changes**: Triggers on pushes to main/test branches when relevant files change
|
||||
|
||||
### Manual Triggers
|
||||
- **Workflow Dispatch**: Manual trigger with optional force build
|
||||
- **Use Case**: Emergency builds or testing
|
||||
|
||||
## Configuration Requirements
|
||||
|
||||
### GitHub Secrets
|
||||
You need to configure these secrets in your GitHub repository:
|
||||
|
||||
```bash
|
||||
# For Gitea repository access
|
||||
GITEA_SSH_KEY # Private SSH key for gitea-repo access
|
||||
```
|
||||
|
||||
### Repository Setup
|
||||
1. **Branch Strategy**:
|
||||
- `main`: Production releases
|
||||
- `test`: Testing and validation
|
||||
|
||||
2. **File Structure**:
|
||||
```
|
||||
.github/workflows/build.yml # Main pipeline
|
||||
APKBUILD # Package definition
|
||||
build.sh # Build script
|
||||
Dockerfile # Build environment
|
||||
*.initd, *.confd # Service files
|
||||
```
|
||||
|
||||
## API Endpoints Used
|
||||
|
||||
### Zabbix Version Detection
|
||||
```bash
|
||||
# Primary endpoint - Zabbix Bitbucket API
|
||||
https://git.zabbix.com/rest/api/1.0/projects/ZBX/repos/zabbix/tags?limit=100
|
||||
|
||||
# Response format:
|
||||
{
|
||||
"values": [
|
||||
{
|
||||
"displayId": "7.4.2",
|
||||
"type": "TAG"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Version Processing
|
||||
```bash
|
||||
# Extract stable versions only
|
||||
curl -s "https://git.zabbix.com/rest/api/1.0/projects/ZBX/repos/zabbix/tags?limit=100" | \
|
||||
jq -r '.values[].displayId' | \
|
||||
grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | \
|
||||
grep -v 'rc\|beta\|alpha' | \
|
||||
sort -V | \
|
||||
tail -1
|
||||
```
|
||||
|
||||
## Package Repository Structure
|
||||
|
||||
Your Gitea repository will follow Alpine Linux repository format:
|
||||
```
|
||||
alpine/
|
||||
v3.18/
|
||||
main/
|
||||
x86_64/
|
||||
zabbix-agent-X.Y.Z-r0.apk
|
||||
zabbix-proxy-X.Y.Z-r0.apk
|
||||
zabbix-X.Y.Z-r0.apk
|
||||
PACKAGES.txt
|
||||
```
|
||||
|
||||
## Deployment Flow
|
||||
|
||||
### Development Workflow
|
||||
1. **Code Changes** → Push to `test` branch
|
||||
2. **Pipeline Runs** → Builds and tests packages
|
||||
3. **Testing** → Verify in Alpine containers
|
||||
4. **Merge** → To `main` branch for release
|
||||
|
||||
### Production Workflow
|
||||
1. **New Zabbix Release** → Detected by daily check
|
||||
2. **Auto-Update** → APKBUILD updated and committed
|
||||
3. **Build** → Packages built and tested
|
||||
4. **Release** → GitHub release created
|
||||
5. **Publish** → Packages pushed to Gitea repository
|
||||
|
||||
## Monitoring and Notifications
|
||||
|
||||
### Success Indicators
|
||||
- ✅ Version check completes
|
||||
- ✅ APKBUILD updated correctly
|
||||
- ✅ Packages build successfully
|
||||
- ✅ Tests pass in Alpine containers
|
||||
- ✅ Packages published to Gitea
|
||||
|
||||
### Failure Handling
|
||||
- 🚨 Build failures create GitHub issues
|
||||
- 🚨 Failed deployments stop the pipeline
|
||||
- 🚨 Version detection errors logged
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Manual Build
|
||||
```bash
|
||||
# Trigger manual build via GitHub Actions UI
|
||||
# OR via GitHub CLI:
|
||||
gh workflow run build.yml -f force_build=true
|
||||
```
|
||||
|
||||
### Emergency Version Update
|
||||
```bash
|
||||
# Update version manually and push
|
||||
sed -i 's/pkgver=.*/pkgver=7.4.3/' APKBUILD
|
||||
git add APKBUILD
|
||||
git commit -m "Emergency update to 7.4.3"
|
||||
git push
|
||||
```
|
||||
|
||||
### Using Built Packages
|
||||
```bash
|
||||
# Add your Gitea repository
|
||||
echo "http://gitea-repo/mbuz/Zabbix/raw/branch/main/alpine/v3.18/main" >> /etc/apk/repositories
|
||||
|
||||
# Install packages
|
||||
apk update
|
||||
apk add zabbix-agent zabbix-proxy
|
||||
```
|
||||
|
||||
## Testing the Version Detection
|
||||
|
||||
You can test the version detection logic locally:
|
||||
|
||||
```bash
|
||||
# Get latest stable version
|
||||
curl -s "https://git.zabbix.com/rest/api/1.0/projects/ZBX/repos/zabbix/tags?limit=100" | \
|
||||
jq -r '.values[].displayId' | \
|
||||
grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | \
|
||||
grep -v 'rc\|beta\|alpha' | \
|
||||
sort -V | \
|
||||
tail -1
|
||||
|
||||
# Should output: 7.4.2 (or latest version)
|
||||
```
|
||||
|
||||
## Maintenance
|
||||
|
||||
### Regular Tasks
|
||||
- Monitor pipeline runs
|
||||
- Update Alpine Linux version in repository structure
|
||||
- Rotate SSH keys periodically
|
||||
- Review and update dependencies
|
||||
|
||||
### Troubleshooting
|
||||
- Check GitHub Actions logs for failures
|
||||
- Verify SSH key access to Gitea
|
||||
- Ensure Docker builds work locally
|
||||
- Test package installation manually
|
||||
- Verify Zabbix API connectivity
|
||||
|
||||
## Security Considerations
|
||||
|
||||
1. **SSH Keys**: Use dedicated deploy keys with minimal permissions
|
||||
2. **Secrets**: Store sensitive data in GitHub Secrets
|
||||
3. **API Access**: Monitor for API rate limits or authentication changes
|
||||
4. **Package Signing**: Consider implementing APK package signing
|
||||
|
||||
This pipeline provides a fully automated solution for maintaining up-to-date Zabbix packages while ensuring quality through testing and proper repository management.
|
||||
@@ -1,76 +1,233 @@
|
||||
# Zabbix APK Builder
|
||||
|
||||
Automated build system for creating Zabbix monitoring packages for Alpine Linux using Docker.
|
||||
Automated Alpine Linux package builder for Zabbix Agent and Proxy with CI/CD pipeline integration.
|
||||
|
||||
## What it does
|
||||
## Features
|
||||
|
||||
This project builds separate Alpine Linux packages for:
|
||||
- **zabbix-agent** - Monitoring agent for data collection
|
||||
- **zabbix-proxy** - Network monitoring proxy daemon
|
||||
- **zabbix** - Meta-package that installs both components
|
||||
|
||||
Each package includes proper OpenRC init scripts and user management for production deployment.
|
||||
- 🔄 **Automatic Version Detection**: Monitors Zabbix releases using official Bitbucket API
|
||||
- 🏗️ **Docker-based Building**: Consistent, reproducible builds in isolated environment
|
||||
- 🚀 **CI/CD Pipeline**: Full automation from version detection to package deployment
|
||||
- 📦 **Multi-package Support**: Builds agent, proxy, and main packages
|
||||
- 🧪 **Automated Testing**: Tests package installation in Alpine containers
|
||||
- 📊 **Gitea Integration**: Publishes packages to your private Gitea repository
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 1. Repository Setup
|
||||
|
||||
```bash
|
||||
# Build packages
|
||||
# Clone this repository
|
||||
git clone <your-repo-url>
|
||||
cd zabbix-apk-builder
|
||||
|
||||
# Make build script executable
|
||||
chmod +x build.sh setup-cicd.sh
|
||||
```
|
||||
|
||||
### 2. Manual Build
|
||||
|
||||
```bash
|
||||
# Build packages locally
|
||||
./build.sh
|
||||
|
||||
# Install on Alpine Linux
|
||||
apk add --allow-untrusted packages/zabbix-agent-*.apk
|
||||
apk add --allow-untrusted packages/zabbix-proxy-*.apk
|
||||
# Packages will be in ./packages/
|
||||
ls -la packages/
|
||||
```
|
||||
|
||||
# Enable and start services
|
||||
### 3. CI/CD Setup
|
||||
|
||||
```bash
|
||||
# Run the setup script
|
||||
./setup-cicd.sh
|
||||
|
||||
# Follow the prompts to configure GitHub secrets
|
||||
```
|
||||
|
||||
## Package Information
|
||||
|
||||
### Built Packages
|
||||
|
||||
1. **zabbix-agent** - Zabbix Agent only
|
||||
2. **zabbix-proxy** - Zabbix Proxy (without LDAP)
|
||||
3. **zabbix** - Main package with libraries
|
||||
|
||||
### Current Version
|
||||
|
||||
- **Zabbix Version**: 7.4.2
|
||||
- **Alpine Base**: 3.18
|
||||
- **Architecture**: x86_64
|
||||
|
||||
### Dependencies Removed
|
||||
|
||||
- LDAP support removed from proxy build
|
||||
- Simplified configuration for smaller footprint
|
||||
|
||||
## CI/CD Pipeline
|
||||
|
||||
### Automatic Triggers
|
||||
|
||||
- **Daily**: Checks for new Zabbix versions at 6 AM UTC
|
||||
- **Push**: Builds when code changes in main/test branches
|
||||
- **Manual**: Force builds via GitHub Actions
|
||||
|
||||
### Version Detection
|
||||
|
||||
Uses Zabbix Bitbucket API:
|
||||
```bash
|
||||
https://git.zabbix.com/rest/api/1.0/projects/ZBX/repos/zabbix/tags
|
||||
```
|
||||
|
||||
### Pipeline Jobs
|
||||
|
||||
1. **check-version**: Detects new Zabbix releases
|
||||
2. **update-version**: Updates APKBUILD automatically
|
||||
3. **build-packages**: Builds APK packages
|
||||
4. **publish-to-gitea**: Deploys to your repository
|
||||
5. **deploy-test**: Tests installation (test branch)
|
||||
|
||||
## Configuration
|
||||
|
||||
### GitHub Secrets Required
|
||||
|
||||
```bash
|
||||
GITEA_SSH_KEY # SSH private key for Gitea access
|
||||
```
|
||||
|
||||
### File Structure
|
||||
|
||||
```
|
||||
.
|
||||
├── APKBUILD # Alpine package definition
|
||||
├── build.sh # Build automation script
|
||||
├── Dockerfile # Build environment
|
||||
├── .github/workflows/ # CI/CD pipeline
|
||||
├── packages/ # Built packages
|
||||
├── zabbix-agent.initd # Agent init script
|
||||
├── zabbix-agent.confd # Agent config
|
||||
├── zabbix-proxy.initd # Proxy init script
|
||||
└── zabbix-proxy.confd # Proxy config
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Install Packages
|
||||
|
||||
```bash
|
||||
# Add repository
|
||||
echo "http://gitea-repo/mbuz/Zabbix/raw/branch/main/alpine/v3.18/main" >> /etc/apk/repositories
|
||||
|
||||
# Update and install
|
||||
apk update
|
||||
apk add zabbix-agent
|
||||
|
||||
# Enable and start
|
||||
rc-update add zabbix-agent default
|
||||
rc-service zabbix-agent start
|
||||
```
|
||||
|
||||
## Configuration
|
||||
### Configuration
|
||||
|
||||
### Change Zabbix Version
|
||||
Edit `APKBUILD`:
|
||||
```bash
|
||||
pkgver=7.4.2 # Change to desired version
|
||||
# Configure agent
|
||||
vim /etc/zabbix/zabbix_agentd.conf
|
||||
|
||||
# Set server IP
|
||||
Server=your.zabbix.server
|
||||
|
||||
# Restart service
|
||||
rc-service zabbix-agent restart
|
||||
```
|
||||
|
||||
### Change Architecture
|
||||
Edit `APKBUILD`:
|
||||
## Development
|
||||
|
||||
### Local Testing
|
||||
|
||||
```bash
|
||||
arch="all" # All architectures
|
||||
arch="x86_64" # 64-bit Intel/AMD only
|
||||
arch="x86_64 aarch64" # 64-bit Intel/AMD and ARM64
|
||||
# Test build locally
|
||||
./build.sh
|
||||
|
||||
# Test in Docker
|
||||
docker run --rm -it \
|
||||
-v $(pwd)/packages:/packages \
|
||||
alpine:3.18 sh -c "
|
||||
apk add --allow-untrusted /packages/zabbix-agent-*.apk
|
||||
zabbix_agentd --version
|
||||
"
|
||||
```
|
||||
|
||||
### Update Checksums
|
||||
After changing the version:
|
||||
### Branch Strategy
|
||||
|
||||
- **main**: Production releases, auto-deployed
|
||||
- **test**: Testing and validation, no auto-deploy
|
||||
|
||||
### Making Changes
|
||||
|
||||
1. Create feature branch from `test`
|
||||
2. Test changes thoroughly
|
||||
3. Merge to `test` for CI validation
|
||||
4. Merge to `main` for production release
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Build Issues
|
||||
|
||||
```bash
|
||||
# Manual approach
|
||||
wget https://cdn.zabbix.com/zabbix/sources/stable/X.Y/zabbix-X.Y.Z.tar.gz
|
||||
sha512sum zabbix-X.Y.Z.tar.gz # Update sha512sums in APKBUILD
|
||||
# Or let the build system handle it
|
||||
./build.sh # Will download and verify against official SHA256
|
||||
# Check build logs
|
||||
docker logs $(docker ps -l -q)
|
||||
|
||||
# Manual build debug
|
||||
docker run -it --rm -v $(pwd):/build alpine:3.18 sh
|
||||
cd /build && ./build.sh
|
||||
```
|
||||
sha512 is used per Alpine recommendation:
|
||||
https://wiki.alpinelinux.org/wiki/APKBUILD_Reference
|
||||
`New packages should use only sha512sums. Support for md5sums and sha1sums was dropped.`
|
||||
|
||||
## Build Process
|
||||
### Version Detection
|
||||
|
||||
1. **Docker Build**: Creates Alpine Linux build environment
|
||||
2. **Download Sources**: `abuild checksum` downloads tarball and generates SHA512
|
||||
2. **Package Build**: Compiles and packages using Alpine's `abuild` system
|
||||
3. **Output**: Generated APK files in `packages/` directory
|
||||
```bash
|
||||
# Test API manually
|
||||
curl -s "https://git.zabbix.com/rest/api/1.0/projects/ZBX/repos/zabbix/tags?limit=100" | \
|
||||
jq -r '.values[].displayId' | \
|
||||
grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | \
|
||||
sort -V | tail -1
|
||||
```
|
||||
|
||||
## Requirements
|
||||
### CI/CD Issues
|
||||
|
||||
- Docker
|
||||
- Internet connection (for source download and verification)
|
||||
1. Check GitHub Actions logs
|
||||
2. Verify SSH key permissions
|
||||
3. Test Gitea connectivity
|
||||
4. Validate APKBUILD syntax
|
||||
|
||||
## Files
|
||||
## Documentation
|
||||
|
||||
- `APKBUILD` - Alpine package definition
|
||||
- `build.sh` - Build automation script
|
||||
- `Dockerfile` - Build environment container
|
||||
- `zabbix-agent.*` - Agent service configuration files
|
||||
- `zabbix-proxy.*` - Proxy service configuration files
|
||||
- **[CI-CD-DOCS.md](CI-CD-DOCS.md)**: Comprehensive CI/CD documentation
|
||||
- **[setup-cicd.sh](setup-cicd.sh)**: Setup script for CI/CD configuration
|
||||
|
||||
## Security
|
||||
|
||||
- Uses SSH keys for Gitea access
|
||||
- Minimal package dependencies
|
||||
- Regular security updates via automated builds
|
||||
- No secrets stored in repository
|
||||
|
||||
## Contributing
|
||||
|
||||
1. Fork the repository
|
||||
2. Create feature branch
|
||||
3. Test changes in `test` branch
|
||||
4. Submit pull request to `main`
|
||||
|
||||
## License
|
||||
|
||||
This project follows the same license as Zabbix (GPL v2).
|
||||
|
||||
## Support
|
||||
|
||||
For issues:
|
||||
1. Check troubleshooting section
|
||||
2. Review CI/CD logs
|
||||
3. Test manual build process
|
||||
4. Check Zabbix API connectivity
|
||||
|
||||
---
|
||||
|
||||
**Built with ❤️ for Alpine Linux and Zabbix monitoring**
|
||||
|
||||
233
zabbix-apk-builder/setup-cicd.sh
Executable file
233
zabbix-apk-builder/setup-cicd.sh
Executable file
@@ -0,0 +1,233 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Zabbix APK Builder CI/CD Setup Script
|
||||
set -e
|
||||
|
||||
echo "🚀 Zabbix APK Builder CI/CD Setup"
|
||||
echo "=================================="
|
||||
echo
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Function to print colored output
|
||||
print_step() {
|
||||
echo -e "${BLUE}[STEP]${NC} $1"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
# Check if we're in a git repository
|
||||
print_step "Checking Git repository status..."
|
||||
if ! git rev-parse --git-dir > /dev/null 2>&1; then
|
||||
print_error "Not in a Git repository. Please initialize git first:"
|
||||
echo " git init"
|
||||
echo " git add ."
|
||||
echo " git commit -m 'Initial commit'"
|
||||
echo " git remote add origin <your-github-repo>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if we have required files
|
||||
print_step "Verifying required files..."
|
||||
required_files=("APKBUILD" "build.sh" "Dockerfile" ".github/workflows/build.yml")
|
||||
for file in "${required_files[@]}"; do
|
||||
if [[ ! -f "$file" ]]; then
|
||||
print_error "Required file missing: $file"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
print_success "All required files present"
|
||||
|
||||
# Test version detection API
|
||||
print_step "Testing Zabbix version detection API..."
|
||||
if ! curl -s --connect-timeout 10 "https://git.zabbix.com/rest/api/1.0/projects/ZBX/repos/zabbix/tags?limit=5" | grep -q "displayId"; then
|
||||
print_warning "Could not reach Zabbix API. Pipeline will work but version detection may fail."
|
||||
else
|
||||
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]+$' | sort -V | tail -1)
|
||||
print_success "API working. Latest Zabbix version: $latest_version"
|
||||
fi
|
||||
|
||||
# Check if GitHub CLI is available
|
||||
print_step "Checking GitHub CLI availability..."
|
||||
if command -v gh &> /dev/null; then
|
||||
if gh auth status &> /dev/null; then
|
||||
print_success "GitHub CLI authenticated"
|
||||
GITHUB_CLI_AVAILABLE=true
|
||||
else
|
||||
print_warning "GitHub CLI not authenticated. Manual secret configuration needed."
|
||||
GITHUB_CLI_AVAILABLE=false
|
||||
fi
|
||||
else
|
||||
print_warning "GitHub CLI not installed. Manual secret configuration needed."
|
||||
GITHUB_CLI_AVAILABLE=false
|
||||
fi
|
||||
|
||||
# SSH Key Setup
|
||||
print_step "Setting up SSH key for Gitea access..."
|
||||
echo
|
||||
echo "You need an SSH key for the CI/CD pipeline to push packages to your Gitea repository."
|
||||
echo
|
||||
|
||||
# Check if user has SSH keys
|
||||
if [[ -f ~/.ssh/id_rsa ]] || [[ -f ~/.ssh/id_ed25519 ]]; then
|
||||
echo "Existing SSH keys found:"
|
||||
ls -la ~/.ssh/id_* 2>/dev/null | grep -v .pub || true
|
||||
echo
|
||||
read -p "Use existing SSH key? (y/N): " use_existing
|
||||
|
||||
if [[ $use_existing =~ ^[Yy]$ ]]; then
|
||||
if [[ -f ~/.ssh/id_ed25519 ]]; then
|
||||
SSH_KEY_PATH=~/.ssh/id_ed25519
|
||||
elif [[ -f ~/.ssh/id_rsa ]]; then
|
||||
SSH_KEY_PATH=~/.ssh/id_rsa
|
||||
fi
|
||||
print_success "Using existing SSH key: $SSH_KEY_PATH"
|
||||
else
|
||||
create_new_key=true
|
||||
fi
|
||||
else
|
||||
create_new_key=true
|
||||
fi
|
||||
|
||||
if [[ $create_new_key == true ]]; then
|
||||
print_step "Creating new SSH key for CI/CD..."
|
||||
ssh-keygen -t ed25519 -f ~/.ssh/zabbix_cicd -N "" -C "zabbix-cicd@$(hostname)"
|
||||
SSH_KEY_PATH=~/.ssh/zabbix_cicd
|
||||
print_success "Created new SSH key: $SSH_KEY_PATH"
|
||||
fi
|
||||
|
||||
# Display public key
|
||||
echo
|
||||
echo "📋 Public key to add to your Gitea repository:"
|
||||
echo "=============================================="
|
||||
cat "$SSH_KEY_PATH.pub"
|
||||
echo "=============================================="
|
||||
echo
|
||||
|
||||
print_warning "IMPORTANT: Add this public key to your Gitea repository with write access!"
|
||||
echo "1. Go to your Gitea repository settings"
|
||||
echo "2. Navigate to Deploy Keys section"
|
||||
echo "3. Add the public key above"
|
||||
echo "4. Enable write access for the key"
|
||||
echo
|
||||
|
||||
read -p "Press Enter after adding the public key to Gitea..."
|
||||
|
||||
# Configure GitHub Secrets
|
||||
print_step "Configuring GitHub repository secrets..."
|
||||
echo
|
||||
|
||||
if [[ $GITHUB_CLI_AVAILABLE == true ]]; then
|
||||
echo "Setting up GitHub secrets using GitHub CLI..."
|
||||
|
||||
# Set SSH key secret
|
||||
if gh secret set GITEA_SSH_KEY < "$SSH_KEY_PATH"; then
|
||||
print_success "SSH key secret configured"
|
||||
else
|
||||
print_error "Failed to set SSH key secret"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
else
|
||||
echo "Manual secret configuration required:"
|
||||
echo
|
||||
echo "1. Go to your GitHub repository"
|
||||
echo "2. Navigate to Settings → Secrets and variables → Actions"
|
||||
echo "3. Add the following secret:"
|
||||
echo
|
||||
echo " Name: GITEA_SSH_KEY"
|
||||
echo " Value: (paste the private key below)"
|
||||
echo
|
||||
echo "📋 Private key content:"
|
||||
echo "======================"
|
||||
cat "$SSH_KEY_PATH"
|
||||
echo "======================"
|
||||
echo
|
||||
read -p "Press Enter after configuring the GitHub secret..."
|
||||
fi
|
||||
|
||||
# Test build locally
|
||||
print_step "Testing local build..."
|
||||
if [[ -x ./build.sh ]]; then
|
||||
echo "Running test build (this may take a few minutes)..."
|
||||
if ./build.sh; then
|
||||
print_success "Local build test successful"
|
||||
if [[ -d packages ]] && [[ $(ls packages/*.apk 2>/dev/null | wc -l) -gt 0 ]]; then
|
||||
echo "Built packages:"
|
||||
ls -la packages/*.apk
|
||||
fi
|
||||
else
|
||||
print_warning "Local build test failed, but CI/CD setup continues"
|
||||
fi
|
||||
else
|
||||
print_error "build.sh is not executable"
|
||||
chmod +x build.sh
|
||||
print_success "Fixed build.sh permissions"
|
||||
fi
|
||||
|
||||
# Repository setup verification
|
||||
print_step "Verifying repository configuration..."
|
||||
|
||||
# Check remote URL
|
||||
remote_url=$(git remote get-url origin 2>/dev/null || echo "")
|
||||
if [[ -z "$remote_url" ]]; then
|
||||
print_error "No Git remote 'origin' configured"
|
||||
echo "Please add your GitHub repository as remote:"
|
||||
echo " git remote add origin https://github.com/username/repo.git"
|
||||
exit 1
|
||||
else
|
||||
print_success "Git remote configured: $remote_url"
|
||||
fi
|
||||
|
||||
# Check if we're on main or test branch
|
||||
current_branch=$(git branch --show-current)
|
||||
if [[ "$current_branch" != "main" ]] && [[ "$current_branch" != "test" ]]; then
|
||||
print_warning "Not on main or test branch (current: $current_branch)"
|
||||
echo "CI/CD pipeline triggers on main/test branches"
|
||||
fi
|
||||
|
||||
# Final steps
|
||||
echo
|
||||
print_step "Final setup steps..."
|
||||
echo
|
||||
echo "✅ CI/CD Setup Complete!"
|
||||
echo
|
||||
echo "📋 Next Steps:"
|
||||
echo "1. Commit and push your changes:"
|
||||
echo " git add ."
|
||||
echo " git commit -m 'Add CI/CD pipeline'"
|
||||
echo " git push origin main"
|
||||
echo
|
||||
echo "2. Check GitHub Actions tab in your repository"
|
||||
echo "3. The pipeline will:"
|
||||
echo " - Check for new Zabbix versions daily"
|
||||
echo " - Build packages automatically"
|
||||
echo " - Publish to your Gitea repository"
|
||||
echo
|
||||
echo "📖 Documentation:"
|
||||
echo "- CI-CD-DOCS.md: Comprehensive pipeline documentation"
|
||||
echo "- README.md: Usage and setup guide"
|
||||
echo
|
||||
echo "🔧 Manual Operations:"
|
||||
echo "- Force build: Go to Actions tab → Zabbix APK Builder → Run workflow"
|
||||
echo "- Test build: ./build.sh"
|
||||
echo "- Check version: curl -s 'https://git.zabbix.com/rest/api/1.0/projects/ZBX/repos/zabbix/tags?limit=5'"
|
||||
echo
|
||||
print_success "Setup completed successfully! 🎉"
|
||||
Reference in New Issue
Block a user