name: Build and Publish Unified Docker Image on: push: tags: - 'v*' workflow_dispatch: env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} jobs: test: name: Run Tests uses: ./.github/workflows/run-tests.yml secrets: WEBHOOK_URL: ${{ secrets.WEBHOOK_URL }} build-and-push: needs: test runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to GitHub Container Registry if: github.event_name != 'pull_request' uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata (tags, labels) id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | type=ref,event=branch type=ref,event=pr type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} type=sha,prefix=sha- type=raw,value=latest,enable={{is_default_branch}} labels: | org.opencontainers.image.title=ReadMeABook Unified org.opencontainers.image.description=All-in-one audiobook request and automation system (PostgreSQL + Redis + App) org.opencontainers.image.vendor=ReadMeABook - name: Capture version information id: version run: | echo "app_version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT echo "git_commit=$(git rev-parse --short=7 HEAD)" >> $GITHUB_OUTPUT echo "build_date=$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> $GITHUB_OUTPUT - name: Build and push unified Docker image uses: docker/build-push-action@v5 with: context: . file: ./dockerfile.unified platforms: linux/amd64,linux/arm64 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max build-args: | APP_VERSION=${{ steps.version.outputs.app_version }} GIT_COMMIT=${{ steps.version.outputs.git_commit }} BUILD_DATE=${{ steps.version.outputs.build_date }} - name: Generate deployment instructions if: github.event_name != 'pull_request' run: | echo "## 🎉 Docker image published successfully!" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### 📦 Available tags:" >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY echo "${{ steps.meta.outputs.tags }}" >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### 🚀 Quick start:" >> $GITHUB_STEP_SUMMARY echo '```bash' >> $GITHUB_STEP_SUMMARY echo "docker run -d \\" >> $GITHUB_STEP_SUMMARY echo " --name readmeabook \\" >> $GITHUB_STEP_SUMMARY echo " -p 3030:3030 \\" >> $GITHUB_STEP_SUMMARY echo " -v ./config:/app/config \\" >> $GITHUB_STEP_SUMMARY echo " -v ./downloads:/downloads \\" >> $GITHUB_STEP_SUMMARY echo " -v ./media:/media \\" >> $GITHUB_STEP_SUMMARY echo " -v readmeabook-data:/var/lib/postgresql/data \\" >> $GITHUB_STEP_SUMMARY echo " ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY - name: Send Discord notification if: github.event_name != 'pull_request' && success() run: | curl -H "Content-Type: application/json" \ -X POST \ -d '{ "embeds": [{ "title": "📦 Docker Image Published", "description": "**ReadMeABook v${{ steps.version.outputs.app_version }}** has been built and published to GitHub Container Registry.", "color": 5763719, "fields": [ { "name": "🔖 Version", "value": "`v${{ steps.version.outputs.app_version }}`", "inline": true }, { "name": "🌿 Branch", "value": "`${{ github.ref_name }}`", "inline": true }, { "name": "📋 Commit", "value": "[`${{ steps.version.outputs.git_commit }}`](${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }})", "inline": true }, { "name": "📥 Pull Command", "value": "```docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest```", "inline": false } ], "footer": { "text": "ReadMeABook v${{ steps.version.outputs.app_version }} • Built with GitHub Actions" }, "timestamp": "${{ steps.version.outputs.build_date }}" }] }' \ ${{ secrets.WEBHOOK_URL }}