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! 🎉"
 |