1+ name : Build and Publish Docker Image
2+
3+ on :
4+ push :
5+ branches :
6+ - main
7+ tags :
8+ - ' v*'
9+ pull_request :
10+ branches :
11+ - main
12+
13+ env :
14+ REGISTRY : ghcr.io
15+ IMAGE_NAME : ${{ github.repository }}
16+
17+ jobs :
18+ build-and-push :
19+ runs-on : ubuntu-latest
20+ permissions :
21+ contents : read
22+ packages : write
23+
24+ steps :
25+ - name : Checkout repository
26+ uses : actions/checkout@v4
27+ with :
28+ fetch-depth : 0 # Fetch all history for version calculation
29+
30+ - name : Set up Docker Buildx
31+ uses : docker/setup-buildx-action@v3
32+
33+ - name : Log in to Container Registry
34+ if : github.event_name != 'pull_request'
35+ uses : docker/login-action@v3
36+ with :
37+ registry : ${{ env.REGISTRY }}
38+ username : ${{ github.actor }}
39+ password : ${{ secrets.GITHUB_TOKEN }}
40+
41+ - name : Generate version and tags
42+ id : meta
43+ run : |
44+ # Convert repository name to lowercase
45+ IMAGE_NAME_LOWER=$(echo "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}" | tr '[:upper:]' '[:lower:]')
46+
47+ # Get current date for version generation
48+ DATE=$(date +'%Y%m%d')
49+
50+ # Generate version based on context
51+ if [[ $GITHUB_REF == refs/tags/v* ]]; then
52+ # If this is a tag push, use the tag as version
53+ VERSION=${GITHUB_REF#refs/tags/v}
54+ TAGS="${IMAGE_NAME_LOWER}:${VERSION},${IMAGE_NAME_LOWER}:latest"
55+ elif [[ $GITHUB_REF == refs/heads/main ]]; then
56+ # If this is main branch, generate auto-incrementing version
57+ # Get count of commits to main for auto-incrementing
58+ COMMIT_COUNT=$(git rev-list --count HEAD)
59+ SHORT_SHA=${GITHUB_SHA::8}
60+
61+ # Generate semantic version: 1.0.COMMIT_COUNT-DATE
62+ VERSION="1.0.${COMMIT_COUNT}"
63+ TAGS="${IMAGE_NAME_LOWER}:${VERSION},${IMAGE_NAME_LOWER}:latest,${IMAGE_NAME_LOWER}:${DATE}-${SHORT_SHA}"
64+ else
65+ # For pull requests or other branches
66+ SHORT_SHA=${GITHUB_SHA::8}
67+ VERSION="pr-${SHORT_SHA}"
68+ TAGS="${IMAGE_NAME_LOWER}:${VERSION}"
69+ fi
70+
71+ echo "VERSION=${VERSION}" >> $GITHUB_OUTPUT
72+ echo "TAGS=${TAGS}" >> $GITHUB_OUTPUT
73+ echo "IMAGE_NAME_LOWER=${IMAGE_NAME_LOWER}" >> $GITHUB_OUTPUT
74+
75+ # Print for debugging
76+ echo "Generated version: ${VERSION}"
77+ echo "Generated tags: ${TAGS}"
78+
79+ - name : Extract metadata
80+ id : docker_meta
81+ uses : docker/metadata-action@v5
82+ with :
83+ images : ${{ steps.meta.outputs.IMAGE_NAME_LOWER }}
84+ tags : |
85+ type=ref,event=branch
86+ type=ref,event=pr
87+ type=semver,pattern={{version}}
88+ type=semver,pattern={{major}}.{{minor}}
89+ type=raw,value=${{ steps.meta.outputs.VERSION }}
90+ type=raw,value=latest,enable={{is_default_branch}}
91+
92+ - name : Build and push Docker image
93+ uses : docker/build-push-action@v5
94+ with :
95+ context : .
96+ file : ./Dockerfile
97+ platforms : linux/amd64,linux/arm64
98+ push : ${{ github.event_name != 'pull_request' }}
99+ tags : ${{ steps.docker_meta.outputs.tags }}
100+ labels : ${{ steps.docker_meta.outputs.labels }}
101+ cache-from : type=gha
102+ cache-to : type=gha,mode=max
103+
104+ - name : Generate summary
105+ if : github.event_name != 'pull_request'
106+ run : |
107+ echo "## 🐳 Docker Image Published" >> $GITHUB_STEP_SUMMARY
108+ echo "" >> $GITHUB_STEP_SUMMARY
109+ echo "**Version:** ${{ steps.meta.outputs.VERSION }}" >> $GITHUB_STEP_SUMMARY
110+ echo "" >> $GITHUB_STEP_SUMMARY
111+ echo "**Registry:** ${{ env.REGISTRY }}" >> $GITHUB_STEP_SUMMARY
112+ echo "" >> $GITHUB_STEP_SUMMARY
113+ echo "**Tags:**" >> $GITHUB_STEP_SUMMARY
114+ echo '```' >> $GITHUB_STEP_SUMMARY
115+ echo "${{ steps.docker_meta.outputs.tags }}" | tr ',' '\n' >> $GITHUB_STEP_SUMMARY
116+ echo '```' >> $GITHUB_STEP_SUMMARY
117+ echo "" >> $GITHUB_STEP_SUMMARY
118+ echo "**Pull command:**" >> $GITHUB_STEP_SUMMARY
119+ echo '```bash' >> $GITHUB_STEP_SUMMARY
120+ echo "docker pull ${{ steps.meta.outputs.IMAGE_NAME_LOWER }}:${{ steps.meta.outputs.VERSION }}" >> $GITHUB_STEP_SUMMARY
121+ echo '```' >> $GITHUB_STEP_SUMMARY
0 commit comments