140 lines
4.7 KiB
YAML
140 lines
4.7 KiB
YAML
name: Build and Push Docker Image
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
tags:
|
|
- 'v*'
|
|
|
|
jobs:
|
|
build-and-push:
|
|
runs-on: ubuntu-latest
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
|
|
- name: Determine Image Tag
|
|
id: tag
|
|
run: |
|
|
# Prüfe ob es ein Git Tag ist
|
|
if [[ "${{ github.ref }}" == refs/tags/* ]]; then
|
|
# Verwende den Tag-Namen (z.B. v1.0.0)
|
|
TAG="${{ github.ref_name }}"
|
|
elif [[ "${{ github.ref_name }}" == "main" ]]; then
|
|
# Für main Branch: verwende 'latest'
|
|
TAG="latest"
|
|
else
|
|
# Für andere Branches: verwende Branch-Name + kurzen Commit-SHA
|
|
TAG="${{ github.ref_name }}-${{ github.sha }}"
|
|
TAG="${TAG:0:50}" # Limit auf 50 Zeichen
|
|
fi
|
|
echo "IMAGE_TAG=${TAG}" >> $GITHUB_OUTPUT
|
|
echo "📦 Image Tag: ${TAG}"
|
|
|
|
- name: Create .env file from secrets and variables
|
|
run: |
|
|
cd docker
|
|
cat > .env << EOF
|
|
REGISTRY_URL=${{ vars.REGISTRY_URL }}
|
|
NAMESPACE=${{ vars.NAMESPACE }}
|
|
REPO_NAME=${{ vars.REPO_NAME }}
|
|
IMAGE_TAG=${{ steps.tag.outputs.IMAGE_TAG }}
|
|
CI_GITEA_USER=${{ secrets.CI_GITEA_USER }}
|
|
CI_GITEA_TOKEN=${{ secrets.CI_GITEA_TOKEN }}
|
|
EOF
|
|
echo "✅ .env file created with IMAGE_TAG=${{ steps.tag.outputs.IMAGE_TAG }}"
|
|
|
|
- name: Build Docker Image
|
|
run: |
|
|
cd docker
|
|
chmod +x build.sh
|
|
./build.sh
|
|
|
|
- name: Push Docker Image to Registry
|
|
run: |
|
|
cd docker
|
|
chmod +x push.sh
|
|
./push.sh
|
|
|
|
- name: Summary
|
|
run: |
|
|
echo "🎉 Build and Push completed successfully!"
|
|
echo "📦 Image: ${{ vars.REGISTRY_URL }}/${{ vars.NAMESPACE }}/${{ vars.REPO_NAME }}:${{ steps.tag.outputs.IMAGE_TAG }}"
|
|
|
|
deploy:
|
|
runs-on: ubuntu-latest
|
|
needs: build-and-push
|
|
|
|
steps:
|
|
- name: Determine Image Tag
|
|
id: tag
|
|
run: |
|
|
# Prüfe ob es ein Git Tag ist
|
|
if [[ "${{ github.ref }}" == refs/tags/* ]]; then
|
|
TAG="${{ github.ref_name }}"
|
|
elif [[ "${{ github.ref_name }}" == "main" ]]; then
|
|
TAG="latest"
|
|
else
|
|
TAG="${{ github.ref_name }}-${{ github.sha }}"
|
|
TAG="${TAG:0:50}"
|
|
fi
|
|
echo "IMAGE_TAG=${TAG}" >> $GITHUB_OUTPUT
|
|
echo "📦 Deploying Image Tag: ${TAG}"
|
|
|
|
- name: Setup SSH
|
|
run: |
|
|
mkdir -p ~/.ssh
|
|
echo "${{ secrets.DEPLOY_SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key
|
|
chmod 600 ~/.ssh/deploy_key
|
|
ssh-keyscan -H ${{ secrets.DEPLOY_HOST }} >> ~/.ssh/known_hosts
|
|
|
|
- name: Deploy to Server
|
|
env:
|
|
IMAGE_NAME: ${{ vars.REGISTRY_URL }}/${{ vars.NAMESPACE }}/${{ vars.REPO_NAME }}:${{ steps.tag.outputs.IMAGE_TAG }}
|
|
CONTAINER_NAME: ${{ vars.REPO_NAME }}
|
|
CONTAINER_PORT: ${{ vars.CONTAINER_PORT }}
|
|
run: |
|
|
echo "🚀 Starting deployment to ${{ secrets.DEPLOY_HOST }}..."
|
|
|
|
ssh -i ~/.ssh/deploy_key ${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} << 'EOF'
|
|
set -e
|
|
|
|
echo "📦 Logging in to registry..."
|
|
echo "${{ secrets.CI_GITEA_TOKEN }}" | docker login ${{ vars.REGISTRY_URL }} -u "${{ secrets.CI_GITEA_USER }}" --password-stdin
|
|
|
|
echo "📥 Pulling new image: ${{ env.IMAGE_NAME }}"
|
|
docker pull ${{ env.IMAGE_NAME }}
|
|
|
|
echo "🛑 Stopping old container (if exists)..."
|
|
docker stop ${{ env.CONTAINER_NAME }} 2>/dev/null || true
|
|
docker rm ${{ env.CONTAINER_NAME }} 2>/dev/null || true
|
|
|
|
echo "🚀 Starting new container on port ${{ env.CONTAINER_PORT }}..."
|
|
docker run -d \
|
|
--name ${{ env.CONTAINER_NAME }} \
|
|
--restart unless-stopped \
|
|
-p ${{ env.CONTAINER_PORT }}:8080 \
|
|
${{ env.IMAGE_NAME }}
|
|
|
|
echo "✅ Deployment completed successfully!"
|
|
docker ps | grep ${{ env.CONTAINER_NAME }}
|
|
EOF
|
|
|
|
- name: Cleanup
|
|
if: always()
|
|
run: |
|
|
rm -f ~/.ssh/deploy_key
|
|
|
|
- name: Deployment Summary
|
|
run: |
|
|
echo "🎉 Deployment completed successfully!"
|
|
echo "🖥️ Server: ${{ secrets.DEPLOY_HOST }}"
|
|
echo "📦 Image: ${{ vars.REGISTRY_URL }}/${{ vars.NAMESPACE }}/${{ vars.REPO_NAME }}:${{ steps.tag.outputs.IMAGE_TAG }}"
|
|
echo "🐳 Container: ${{ vars.REPO_NAME }}"
|
|
echo "🌐 URL: http://${{ secrets.DEPLOY_HOST }}:${{ vars.CONTAINER_PORT }}"
|