234 lines
7.1 KiB
Bash
Executable File
234 lines
7.1 KiB
Bash
Executable File
#!/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! 🎉"
|