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 }}"