| name: Build and Push Docker Image |
| on: |
| push: |
| |
| tags: [ 'v*.*.*' ] |
| pull_request: |
| branches: [ "main" ] |
| |
| workflow_dispatch: |
| jobs: |
| build-and-push: |
| 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: Login to GitHub Container Registry |
| uses: docker/login-action@v3 |
| with: |
| registry: ghcr.io |
| username: ${{ github.repository_owner }} |
| password: ${{ secrets.GITHUB_TOKEN }} |
| |
| - name: Extract repository name |
| id: repo-name |
| run: echo "REPO_NAME=$(echo ${{ github.repository }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT |
| |
| |
| - name: Extract tag version |
| id: tag-version |
| if: startsWith(github.ref, 'refs/tags/v') |
| run: echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT |
|
|
| |
| - name: Set default version |
| id: version |
| run: | |
| if [[ "${{ github.ref }}" == refs/tags/v* ]]; then |
| echo "TAG=${{ steps.tag-version.outputs.VERSION }}" >> $GITHUB_OUTPUT |
| else |
| SHORT_SHA=$(echo ${GITHUB_SHA} | cut -c1-7) |
| DATE=$(date +'%Y%m%d') |
| echo "TAG=${DATE}-${SHORT_SHA}" >> $GITHUB_OUTPUT |
| fi |
| |
| - name: Build and Push Images |
| uses: docker/build-push-action@v5 |
| with: |
| context: . |
| push: true |
| tags: | |
| ghcr.io/${{ steps.repo-name.outputs.REPO_NAME }}:latest |
| ghcr.io/${{ steps.repo-name.outputs.REPO_NAME }}:${{ steps.version.outputs.TAG }} |
| |
| |
| - name: Build and Push ARM64 Image |
| uses: docker/build-push-action@v5 |
| with: |
| context: . |
| push: true |
| platforms: linux/arm64 |
| tags: | |
| ghcr.io/${{ steps.repo-name.outputs.REPO_NAME }}:arm-latest |
| ${{ github.ref_type == 'tag' && format('ghcr.io/{0}:arm-{1}', steps.repo-name.outputs.REPO_NAME, steps.version.outputs.TAG) || '' }} |
| |
| |
| - name: Image digest |
| run: | |
| echo " image has been pushed to ghcr.io/${{ steps.repo-name.outputs.REPO_NAME }}:latest" |
| echo " image has been pushed to ghcr.io/${{ steps.repo-name.outputs.REPO_NAME }}:${{ steps.version.outputs.TAG }}" |
| echo "ARM64-only image has been pushed to ghcr.io/${{ steps.repo-name.outputs.REPO_NAME }}:arm-latest" |
| if [[ "${{ github.ref }}" == refs/tags/v* ]]; then |
| echo "ARM64-only image has been pushed to ghcr.io/${{ steps.repo-name.outputs.REPO_NAME }}:arm-${{ steps.version.outputs.TAG }}" |
| fi |
| |