148 lines
No EOL
5.4 KiB
YAML
148 lines
No EOL
5.4 KiB
YAML
name: Build, Tag and Push Docker Image
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
- dev
|
|
pull_request:
|
|
branches:
|
|
- main
|
|
|
|
jobs:
|
|
build-and-push:
|
|
runs-on: ubuntu-latest
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Determine version and create tag (main only)
|
|
id: version
|
|
run: |
|
|
if [ "${{ gitea.ref_name }}" = "main" ]; then
|
|
# Hole letzten Tag
|
|
LATEST_TAG=$(git tag -l "v*" --sort=-v:refname | head -n 1)
|
|
|
|
if [ -z "$LATEST_TAG" ]; then
|
|
NEW_TAG="v1.0.0"
|
|
BUMP="minor"
|
|
else
|
|
VERSION=${LATEST_TAG#v}
|
|
MAJOR=$(echo $VERSION | cut -d. -f1)
|
|
MINOR=$(echo $VERSION | cut -d. -f2)
|
|
PATCH=$(echo $VERSION | cut -d. -f3)
|
|
|
|
COMMITS=$(git log ${LATEST_TAG}..HEAD --pretty=format:"%s" 2>/dev/null || echo "")
|
|
|
|
if [ -z "$COMMITS" ]; then
|
|
echo "Keine neuen Commits seit ${LATEST_TAG}"
|
|
echo "skip=true" >> $GITHUB_OUTPUT
|
|
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
|
exit 0
|
|
fi
|
|
|
|
if echo "$COMMITS" | grep -qiE "^BREAKING CHANGE:|^[^:]+!:|breaking:|major:"; then
|
|
MAJOR=$((MAJOR + 1)); MINOR=0; PATCH=0; BUMP="major"
|
|
elif echo "$COMMITS" | grep -qiE "^feat:|^feature:|minor:"; then
|
|
MINOR=$((MINOR + 1)); PATCH=0; BUMP="minor"
|
|
else
|
|
PATCH=$((PATCH + 1)); BUMP="patch"
|
|
fi
|
|
|
|
NEW_TAG="v${MAJOR}.${MINOR}.${PATCH}"
|
|
fi
|
|
|
|
# Prüfe ob Tag bereits existiert
|
|
if git rev-parse "$NEW_TAG" >/dev/null 2>&1; then
|
|
echo "Tag ${NEW_TAG} existiert bereits"
|
|
echo "skip=true" >> $GITHUB_OUTPUT
|
|
echo "version=${NEW_TAG#v}" >> $GITHUB_OUTPUT
|
|
else
|
|
echo "Erstelle neues Tag: ${NEW_TAG} (${BUMP})"
|
|
echo "new_tag=${NEW_TAG}" >> $GITHUB_OUTPUT
|
|
echo "version=${NEW_TAG#v}" >> $GITHUB_OUTPUT
|
|
echo "skip=false" >> $GITHUB_OUTPUT
|
|
fi
|
|
else
|
|
# Dev branch: snapshot version
|
|
echo "version=dev-${{ gitea.sha }}" >> $GITHUB_OUTPUT
|
|
echo "skip=true" >> $GITHUB_OUTPUT
|
|
fi
|
|
|
|
- name: Login to Gitea Container Registry
|
|
run: |
|
|
echo "${{ secrets.REGISTRY_TOKEN }}" | docker login git.avatic.de -u "${{ gitea.actor }}" --password-stdin
|
|
|
|
- name: Prepare Docker tags
|
|
id: tags
|
|
run: |
|
|
IMAGE_BASE="git.avatic.de/lcc_public/lcc"
|
|
VERSION="${{ steps.version.outputs.version }}"
|
|
TAGS="-t ${IMAGE_BASE}:${VERSION}"
|
|
TAGS="${TAGS} -t ${IMAGE_BASE}:${{ gitea.sha }}"
|
|
|
|
if [ "${{ gitea.ref_name }}" = "main" ]; then
|
|
TAGS="${TAGS} -t ${IMAGE_BASE}:latest"
|
|
TAGS="${TAGS} -t ${IMAGE_BASE}:main"
|
|
elif [ "${{ gitea.ref_name }}" = "dev" ]; then
|
|
TAGS="${TAGS} -t ${IMAGE_BASE}:dev"
|
|
fi
|
|
|
|
echo "tags=${TAGS}" >> $GITHUB_OUTPUT
|
|
echo "image_base=${IMAGE_BASE}" >> $GITHUB_OUTPUT
|
|
|
|
- name: Build Docker image
|
|
run: |
|
|
docker build \
|
|
--build-arg BUILDKIT_INLINE_CACHE=1 \
|
|
--build-arg APP_VERSION=${{ steps.version.outputs.version }} \
|
|
${{ steps.tags.outputs.tags }} \
|
|
.
|
|
|
|
- name: Push Docker images
|
|
run: |
|
|
IMAGE_BASE="${{ steps.tags.outputs.image_base }}"
|
|
VERSION="${{ steps.version.outputs.version }}"
|
|
|
|
echo "DEBUG: ref_name = ${{ gitea.ref_name }}"
|
|
echo "DEBUG: event_name = ${{ gitea.event_name }}"
|
|
echo "DEBUG: base_ref = ${{ gitea.base_ref }}"
|
|
|
|
docker push ${IMAGE_BASE}:${VERSION}
|
|
docker push ${IMAGE_BASE}:${{ gitea.sha }}
|
|
|
|
if [ "${{ gitea.ref_name }}" = "main" ]; then
|
|
echo "Pushing latest and main tags..."
|
|
docker push ${IMAGE_BASE}:latest
|
|
docker push ${IMAGE_BASE}:main
|
|
else
|
|
echo "Skipping latest/main tags - not on main branch (current: ${{ gitea.ref_name }})"
|
|
fi
|
|
|
|
- name: Create and push git tag
|
|
if: gitea.ref_name == 'main' && steps.version.outputs.skip != 'true' && steps.version.outputs.new_tag != ''
|
|
run: |
|
|
git config user.name "Gitea Actions"
|
|
git config user.email "actions@gitea.local"
|
|
git tag -a ${{ steps.version.outputs.new_tag }} -m "Release ${{ steps.version.outputs.new_tag }}"
|
|
git push origin ${{ steps.version.outputs.new_tag }}
|
|
|
|
- name: Deploy to Docker
|
|
if: gitea.event_name == 'push' && (gitea.ref_name == 'main' || gitea.ref_name == 'dev')
|
|
run: |
|
|
mkdir -p ~/.ssh
|
|
echo "${{ secrets.DEPLOY_KEY }}" > ~/.ssh/deploy_key
|
|
chmod 600 ~/.ssh/deploy_key
|
|
ssh-keyscan -H ${{ secrets.DEPLOY_HOST }} >> ~/.ssh/known_hosts
|
|
|
|
BRANCH="${{ gitea.ref_name }}"
|
|
DEPLOY_PATH="${{ secrets.DEPLOY_PATH }}"
|
|
|
|
ssh -i ~/.ssh/deploy_key ${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} << EOF
|
|
cd ${DEPLOY_PATH}
|
|
docker compose pull lcc-app-${BRANCH}
|
|
docker compose --profile ${BRANCH} up -d lcc-app-${BRANCH}
|
|
EOF |