# Gitea Actions: Docker Build, Push, and Notify # # CI/CD pipeline for Major Domo Database API: # - Builds Docker images on every push/PR # - Auto-generates CalVer version (YYYY.MM.BUILD) on main branch merges # - Pushes to Docker Hub and creates git tag on main # - Sends Discord notifications on success/failure name: Build Docker Image on: push: branches: - main pull_request: branches: - main jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 # Full history for tag counting - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} # Generate CalVer: YYYY.MM.BUILD # BUILD = count of tags matching current month + 1 - name: Generate CalVer version id: meta run: | YEAR=$(date -u +%Y) MONTH=$(date -u +%-m) PREFIX="${YEAR}.${MONTH}." # Count existing tags for this month git fetch --tags BUILD=$(git tag -l "${PREFIX}*" | wc -l) BUILD=$((BUILD + 1)) VERSION="${PREFIX}${BUILD}" SHA_SHORT=$(echo ${{ github.sha }} | cut -c1-7) echo "version=${VERSION}" >> $GITHUB_OUTPUT echo "sha_short=${SHA_SHORT}" >> $GITHUB_OUTPUT echo "version_sha=${VERSION}-${SHA_SHORT}" >> $GITHUB_OUTPUT echo "branch=${{ github.ref_name }}" >> $GITHUB_OUTPUT echo "timestamp=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT echo "CalVer version: ${VERSION}" # Dev build: push with dev + dev-SHA tags (PR/feature branches) - name: Build Docker image (dev) if: github.ref != 'refs/heads/main' uses: docker/build-push-action@v5 with: context: . push: true tags: | manticorum67/major-domo-database:dev manticorum67/major-domo-database:dev-${{ steps.meta.outputs.sha_short }} cache-from: type=registry,ref=manticorum67/major-domo-database:buildcache cache-to: type=registry,ref=manticorum67/major-domo-database:buildcache,mode=max # Production build: push with latest + CalVer tags (main only) - name: Build Docker image (production) if: github.ref == 'refs/heads/main' uses: docker/build-push-action@v5 with: context: . push: true tags: | manticorum67/major-domo-database:latest manticorum67/major-domo-database:${{ steps.meta.outputs.version }} manticorum67/major-domo-database:${{ steps.meta.outputs.version_sha }} cache-from: type=registry,ref=manticorum67/major-domo-database:buildcache cache-to: type=registry,ref=manticorum67/major-domo-database:buildcache,mode=max # Create git tag via Gitea API (avoids branch protection issues with git push) - name: Tag release if: success() && github.ref == 'refs/heads/main' run: | curl -s -X POST \ -H "Authorization: token ${{ github.token }}" \ -H "Content-Type: application/json" \ -d '{ "tag_name": "${{ steps.meta.outputs.version }}", "target": "${{ github.sha }}", "message": "Release ${{ steps.meta.outputs.version }}" }' \ "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/tags" - name: Build Summary run: | echo "## Docker Build Successful" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Image Tags:**" >> $GITHUB_STEP_SUMMARY echo "- \`manticorum67/major-domo-database:latest\`" >> $GITHUB_STEP_SUMMARY echo "- \`manticorum67/major-domo-database:${{ steps.meta.outputs.version }}\`" >> $GITHUB_STEP_SUMMARY echo "- \`manticorum67/major-domo-database:${{ steps.meta.outputs.version_sha }}\`" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Build Details:**" >> $GITHUB_STEP_SUMMARY echo "- Branch: \`${{ steps.meta.outputs.branch }}\`" >> $GITHUB_STEP_SUMMARY echo "- Commit: \`${{ github.sha }}\`" >> $GITHUB_STEP_SUMMARY echo "- Timestamp: \`${{ steps.meta.outputs.timestamp }}\`" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY if [ "${{ github.ref }}" == "refs/heads/main" ]; then echo "Pushed to Docker Hub!" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "Pull with: \`docker pull manticorum67/major-domo-database:latest\`" >> $GITHUB_STEP_SUMMARY else echo "_PR build - image not pushed to Docker Hub_" >> $GITHUB_STEP_SUMMARY fi - name: Discord Notification - Success if: success() && github.ref == 'refs/heads/main' run: | curl -H "Content-Type: application/json" \ -d '{ "embeds": [{ "title": "Major Domo Database - Build Successful", "description": "Docker image built and pushed to Docker Hub", "color": 3066993, "fields": [ { "name": "Version", "value": "`${{ steps.meta.outputs.version }}`", "inline": true }, { "name": "Image Tag", "value": "`${{ steps.meta.outputs.version_sha }}`", "inline": true }, { "name": "Commit", "value": "`${{ steps.meta.outputs.sha_short }}`", "inline": true }, { "name": "Author", "value": "${{ github.actor }}", "inline": true }, { "name": "View Run", "value": "[Click here](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})", "inline": false } ], "timestamp": "${{ steps.meta.outputs.timestamp }}" }] }' \ ${{ secrets.DISCORD_WEBHOOK_URL }} - name: Discord Notification - Failure if: failure() && github.ref == 'refs/heads/main' run: | TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ) curl -H "Content-Type: application/json" \ -d '{ "embeds": [{ "title": "Major Domo Database - Build Failed", "description": "Docker build encountered an error.", "color": 15158332, "fields": [ { "name": "Branch", "value": "`${{ github.ref_name }}`", "inline": true }, { "name": "Commit", "value": "`${{ github.sha }}`", "inline": true }, { "name": "Author", "value": "${{ github.actor }}", "inline": true }, { "name": "View Logs", "value": "[Click here](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})", "inline": false } ], "timestamp": "'"$TIMESTAMP"'" }] }' \ ${{ secrets.DISCORD_WEBHOOK_URL }}