11name : Publish Docker Image to GHCR
22
33on :
4+ push :
5+ branches :
6+ - main
7+ tags :
8+ - ' v*.*.*' # Semantic versioning pattern
9+ pull_request :
10+ # This triggers on any PR, but we filter by source branch in the job
11+ types : [opened, synchronize, reopened]
412 workflow_dispatch :
5- # push:
6- # branches: [main]
7- # paths:
8- # - '.devcontainer/Dockerfile'
9- # - '.github/workflows/publish.yml'
1013
1114permissions :
1215 contents : read
@@ -19,15 +22,89 @@ jobs:
1922 steps :
2023 - uses : actions/checkout@v4
2124
25+ # Only continue for PRs if the source branch is dev or release
26+ - name : Check PR source branch
27+ if : github.event_name == 'pull_request'
28+ run : |
29+ echo "PR source branch: ${{ github.head_ref }}"
30+ if [[ "${{ github.head_ref }}" != "dev" && "${{ github.head_ref }}" != "release" ]]; then
31+ echo "Not a PR from dev or release branch. Skipping workflow."
32+ exit 1
33+ fi
34+
2235 - name : Log in to GHCR
2336 uses : docker/login-action@v3
2437 with :
2538 registry : ghcr.io
2639 username : ${{ github.actor }}
27- password : ${{ secrets.GH_PAT }}
40+ password : ${{ secrets.GITHUB_TOKEN }}
2841
2942 - name : Build and push Docker image
3043 run : |
31- IMAGE_NAME=ghcr.io/eed-solutions/eed_docker_python_uv:latest
32- docker build -t $IMAGE_NAME -f .devcontainer/Dockerfile .
33- docker push $IMAGE_NAME
44+ IMAGE_NAME=ghcr.io/eed-solutions/eed_docker_python_uv
45+ TAG=latest
46+ SHOULD_BUILD_PUSH=false
47+
48+ echo "GITHUB_EVENT_NAME: $GITHUB_EVENT_NAME"
49+ echo "GITHUB_REF: $GITHUB_REF"
50+ echo "GITHUB_HEAD_REF: $GITHUB_HEAD_REF"
51+
52+ # Determine context: PR or push/tag
53+ if [[ "$GITHUB_EVENT_NAME" == "pull_request" ]]; then
54+ BRANCH_NAME="$GITHUB_HEAD_REF"
55+ REF_TYPE="pr"
56+ elif [[ "$GITHUB_REF" == refs/heads/* ]]; then
57+ BRANCH_NAME="${GITHUB_REF#refs/heads/}"
58+ REF_TYPE="branch"
59+ elif [[ "$GITHUB_REF" == refs/tags/* ]]; then
60+ BRANCH_NAME="${GITHUB_REF#refs/tags/}"
61+ REF_TYPE="tag"
62+ else
63+ BRANCH_NAME=""
64+ REF_TYPE=""
65+ fi
66+ echo "REF_TYPE: $REF_TYPE"
67+ echo "BRANCH_NAME: $BRANCH_NAME"
68+
69+ # Determine tag and build indicator based on context
70+ if [[ "$REF_TYPE" == "branch" || "$REF_TYPE" == "pr" ]]; then
71+ case "$BRANCH_NAME" in
72+ "main")
73+ TAG=main
74+ SHOULD_BUILD_PUSH=true
75+ ;;
76+ "dev")
77+ TAG=dev
78+ SHOULD_BUILD_PUSH=true
79+ ;;
80+ "release")
81+ TAG=release
82+ SHOULD_BUILD_PUSH=true
83+ ;;
84+ *)
85+ TAG="$BRANCH_NAME"
86+ ;;
87+ esac
88+ elif [[ "$REF_TYPE" == "tag" ]]; then
89+ TAG="$BRANCH_NAME"
90+ if [[ "$BRANCH_NAME" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
91+ SHOULD_BUILD_PUSH=true
92+ fi
93+ fi
94+
95+ echo "Determined TAG: $TAG"
96+ echo "SHOULD_BUILD_PUSH: $SHOULD_BUILD_PUSH"
97+
98+ # Build and push the image if indicated
99+ if [[ "$SHOULD_BUILD_PUSH" == "true" ]]; then
100+ docker build -t $IMAGE_NAME:$TAG -f .devcontainer/Dockerfile .
101+ docker push $IMAGE_NAME:$TAG
102+ else
103+ echo "Skipping build and push: not a main/dev/release branch or semantic version tag."
104+ fi
105+
106+ # Push additional 'latest' tag for semantic version tags
107+ if [[ "${GITHUB_REF}" == refs/tags/v* ]]; then
108+ docker tag $IMAGE_NAME:$TAG $IMAGE_NAME:latest
109+ docker push $IMAGE_NAME:latest
110+ fi
0 commit comments