Skip to content

Commit 07dc5f1

Browse files
added github actions
1 parent 110f1b0 commit 07dc5f1

3 files changed

Lines changed: 217 additions & 0 deletions

File tree

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
name: Build and Push Docker Images
2+
3+
on:
4+
push:
5+
branches:
6+
- '**'
7+
tags:
8+
- 'v*'
9+
pull_request:
10+
branches:
11+
- main
12+
- develop
13+
workflow_dispatch:
14+
15+
permissions:
16+
contents: write
17+
packages: write
18+
19+
env:
20+
REGISTRY: ghcr.io
21+
IMAGE_NAME: ${{ github.repository_owner }}/geolab-base
22+
23+
jobs:
24+
build:
25+
runs-on: ubuntu-latest
26+
27+
strategy:
28+
matrix:
29+
image:
30+
- geolab-base
31+
32+
steps:
33+
- name: Checkout code
34+
uses: actions/checkout@v4
35+
with:
36+
fetch-depth: 0
37+
38+
- name: Determine semantic version and changelog entry
39+
id: version
40+
shell: bash
41+
run: |
42+
set -euo pipefail
43+
44+
VERSION_FILE="VERSION"
45+
CHANGELOG_FILE="CHANGELOG.md"
46+
CURRENT_VERSION="0.1.0"
47+
48+
if [[ -f "$VERSION_FILE" ]]; then
49+
CURRENT_VERSION="$(tr -d '\r\n' < "$VERSION_FILE")"
50+
fi
51+
52+
if [[ "$CURRENT_VERSION" =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then
53+
MAJOR="${BASH_REMATCH[1]}"
54+
MINOR="${BASH_REMATCH[2]}"
55+
PATCH="${BASH_REMATCH[3]}"
56+
else
57+
MAJOR="0"
58+
MINOR="1"
59+
PATCH="0"
60+
CURRENT_VERSION="0.1.0"
61+
fi
62+
63+
BASE_REF="${{ github.event.before }}"
64+
HEAD_REF="${{ github.sha }}"
65+
66+
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
67+
git fetch origin "${{ github.base_ref }}" --depth=1
68+
BASE_REF="origin/${{ github.base_ref }}"
69+
HEAD_REF="HEAD"
70+
elif [[ -z "$BASE_REF" || "$BASE_REF" == "0000000000000000000000000000000000000000" ]]; then
71+
BASE_REF="HEAD^"
72+
fi
73+
74+
CHANGED_FILES="$(git diff --name-only "$BASE_REF" "$HEAD_REF" -- geolab-base/Dockerfile geolab-base/environment.yml geolab-base/requirements.txt geolab-base/apt.txt || true)"
75+
76+
BASE_IMAGE_CHANGED="0"
77+
PACKAGE_CHANGE="0"
78+
CHANGE_TYPE="patch"
79+
CHANGE_SUMMARY="Security or functional patch to a package"
80+
DETAILS=()
81+
82+
if echo "$CHANGED_FILES" | grep -q 'geolab-base/Dockerfile'; then
83+
BASE_BEFORE="$(git show "$BASE_REF:geolab-base/Dockerfile" 2>/dev/null | sed -n 's/^FROM //p' | head -n 1 || true)"
84+
BASE_AFTER="$(git show "$HEAD_REF:geolab-base/Dockerfile" 2>/dev/null | sed -n 's/^FROM //p' | head -n 1 || true)"
85+
if [[ -n "$BASE_BEFORE" && -n "$BASE_AFTER" && "$BASE_BEFORE" != "$BASE_AFTER" ]]; then
86+
BASE_IMAGE_CHANGED="1"
87+
CHANGE_TYPE="major"
88+
CHANGE_SUMMARY="Major version change of the base image"
89+
DETAILS+=("- Base image changed from $BASE_BEFORE to $BASE_AFTER")
90+
fi
91+
fi
92+
93+
if echo "$CHANGED_FILES" | grep -E -q 'geolab-base/(environment.yml|requirements.txt|apt.txt)'; then
94+
DIFF_OUTPUT="$(git diff --unified=0 "$BASE_REF" "$HEAD_REF" -- geolab-base/environment.yml geolab-base/requirements.txt geolab-base/apt.txt 2>/dev/null || true)"
95+
if echo "$DIFF_OUTPUT" | grep -Eq '^[+-][[:space:]]*[A-Za-z0-9_.-]+'; then
96+
PACKAGE_CHANGE="1"
97+
DETAILS+=("- Package definitions changed in geolab-base environment files")
98+
fi
99+
fi
100+
101+
if [[ "$BASE_IMAGE_CHANGED" == "1" ]]; then
102+
NEW_VERSION="$((MAJOR + 1)).0.0"
103+
CHANGE_TYPE="major"
104+
elif [[ "$PACKAGE_CHANGE" == "1" ]]; then
105+
NEW_VERSION="$MAJOR.$((MINOR + 1)).0"
106+
CHANGE_TYPE="minor"
107+
CHANGE_SUMMARY="Addition or removal of a package"
108+
else
109+
NEW_VERSION="$MAJOR.$MINOR.$((PATCH + 1))"
110+
CHANGE_TYPE="patch"
111+
CHANGE_SUMMARY="Security or functional patch to a package"
112+
fi
113+
114+
echo "$NEW_VERSION" > "$VERSION_FILE"
115+
116+
DATE_STAMP="$(date -u +%Y-%m-%d)"
117+
if [[ ! -f "$CHANGELOG_FILE" ]]; then
118+
printf '# Changelog\n\n## %s - %s\n- %s\n' "$NEW_VERSION" "$DATE_STAMP" "$CHANGE_SUMMARY" > "$CHANGELOG_FILE"
119+
else
120+
TEMP_FILE="$(mktemp)"
121+
{
122+
printf '# Changelog\n\n'
123+
printf '## %s - %s\n' "$NEW_VERSION" "$DATE_STAMP"
124+
printf '- %s\n\n' "$CHANGE_SUMMARY"
125+
sed '/^# Changelog$/d' "$CHANGELOG_FILE"
126+
} > "$TEMP_FILE"
127+
mv "$TEMP_FILE" "$CHANGELOG_FILE"
128+
fi
129+
130+
echo "version=$NEW_VERSION" >> "$GITHUB_OUTPUT"
131+
echo "change_type=$CHANGE_TYPE" >> "$GITHUB_OUTPUT"
132+
echo "change_summary=$CHANGE_SUMMARY" >> "$GITHUB_OUTPUT"
133+
echo "Resolved version: $NEW_VERSION"
134+
echo "## Versioning summary" >> "$GITHUB_STEP_SUMMARY"
135+
echo "- Change type: $CHANGE_TYPE" >> "$GITHUB_STEP_SUMMARY"
136+
echo "- Change summary: $CHANGE_SUMMARY" >> "$GITHUB_STEP_SUMMARY"
137+
echo "- Next version: $NEW_VERSION" >> "$GITHUB_STEP_SUMMARY"
138+
if (( ${#DETAILS[@]} > 0 )); then
139+
echo "- Details:" >> "$GITHUB_STEP_SUMMARY"
140+
for item in "${DETAILS[@]}"; do
141+
echo " $item" >> "$GITHUB_STEP_SUMMARY"
142+
done
143+
fi
144+
145+
- name: Commit version and changelog updates
146+
if: github.event_name != 'pull_request' && github.actor != 'github-actions[bot]'
147+
env:
148+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
149+
run: |
150+
set -euo pipefail
151+
git config user.name "github-actions[bot]"
152+
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
153+
git add VERSION CHANGELOG.md
154+
if ! git diff --cached --quiet; then
155+
git commit -m "chore: bump image version to ${{ steps.version.outputs.version }}"
156+
git push origin HEAD:${GITHUB_REF_NAME}
157+
fi
158+
159+
- name: Set up Docker Buildx
160+
uses: docker/setup-buildx-action@v3
161+
162+
- name: Log in to GitHub Container Registry
163+
if: github.event_name != 'pull_request'
164+
uses: docker/login-action@v3
165+
with:
166+
registry: ${{ env.REGISTRY }}
167+
username: ${{ github.actor }}
168+
password: ${{ secrets.GITHUB_TOKEN }}
169+
170+
- name: Set package visibility to public
171+
if: github.event_name != 'pull_request'
172+
env:
173+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
174+
run: |
175+
set +e
176+
OWNER="${{ github.repository_owner }}"
177+
PACKAGE_NAME="${{ matrix.image }}"
178+
echo "Setting package visibility to public for ${PACKAGE_NAME}"
179+
if gh api "/orgs/${OWNER}/packages/container/${PACKAGE_NAME}" >/dev/null 2>&1; then
180+
gh api --method PATCH "/orgs/${OWNER}/packages/container/${PACKAGE_NAME}" -f visibility=public
181+
else
182+
gh api --method PATCH "/users/${OWNER}/packages/container/${PACKAGE_NAME}" -f visibility=public
183+
fi
184+
exit 0
185+
186+
- name: Extract Docker metadata
187+
id: meta
188+
uses: docker/metadata-action@v5
189+
with:
190+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
191+
tags: |
192+
type=raw,value=dev-${{ steps.version.outputs.version }}
193+
type=raw,value=dev-${{ steps.version.outputs.version }}-${{ github.sha }}
194+
type=ref,event=branch
195+
type=ref,event=pr
196+
type=ref,event=tag
197+
type=sha,format=short
198+
type=raw,value=latest,enable={{is_default_branch}}
199+
200+
- name: Build and push Docker image
201+
uses: docker/build-push-action@v5
202+
with:
203+
context: ./${{ matrix.image }}
204+
push: ${{ github.event_name != 'pull_request' }}
205+
tags: ${{ steps.meta.outputs.tags }}
206+
labels: ${{ steps.meta.outputs.labels }}
207+
build-args: |
208+
IMAGE_TITLE=${{ matrix.image }}
209+
IMAGE_AUTHORS=EarthScope
210+
cache-from: type=gha
211+
cache-to: type=gha,mode=max
212+
platforms: linux/amd64,linux/arm64

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Changelog
2+
3+
## 0.1.0 - 2026-07-10
4+
- Initial release

VERSION

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0.1.0

0 commit comments

Comments
 (0)