name: Blog Deployment on: push: branches: - preview env: DOCKER_IMAGE: vezpi-blog jobs: Check-Rebuild: runs-on: docker defaults: run: shell: sh outputs: latest_hugo_version: ${{ steps.get_latest.outputs.version }} current_hugo_version: ${{ steps.get_current.outputs.version }} newer_version_available: ${{ steps.compare.outputs.version }} current_docker_image: ${{ steps.current_docker.outputs.image }} docker_folder_changed: ${{ steps.docker_folder.outputs.changed }} steps: - name: Checkout Repository run: git clone --branch preview https://${{ secrets.REPO_TOKEN }}@git.vezpi.me/Vezpi/blog.git . - name: Check Latest Hugo Version id: get_latest run: | apk add curl latest_version=$(curl -s https://api.github.com/repos/gohugoio/hugo/releases/latest | grep tag_name | sed -E 's/.*"v([^"]+)".*/\1/') echo "version=$latest_version" | tee -a $GITEA_OUTPUT - name: Check Current Hugo Version id: get_current run: | current_version=$(docker image ls ${DOCKER_IMAGE} --format '{{.Tag}}' | head -n1) echo "version=$current_version" | tee -a $GITEA_OUTPUT - name: Compare Current and Latest Hugo Versions id: compare run: | if [ "${{ steps.get_latest.outputs.version }}" != "${{ steps.get_current.outputs.version }}" ]; then new_version_available=true echo "New version available: ${{ steps.get_latest.outputs.version }}" else new_version_available=false echo "Current version is the latest: ${{ steps.get_latest.outputs.version }}" fi echo "version=$new_version_available" | tee -a $GITEA_OUTPUT - name: Get Current Docker Image ID id: current_docker run: | current_image=$(docker image ls ${DOCKER_IMAGE}:latest --format '{{.ID}}' | head -n1) echo "image=$current_image" | tee -a $GITEA_OUTPUT - name: Check Changes in the Docker Folder id: docker_folder run: | if git diff --name-only origin/main | grep -q '^docker/'; then docker_folder_changed=true echo "Change detected in the /docker folder" else docker_folder_changed=false echo "No change in the /docker folder" fi echo "changed=$docker_folder_changed" | tee -a $GITEA_OUTPUT Build: needs: Check-Rebuild if: needs.Check-Rebuild.outputs.newer_version_available == 'true' || needs.Check-Rebuild.outputs.docker_folder_changed == 'true' runs-on: docker defaults: run: shell: sh steps: - name: Checkout Repository run: git clone --branch preview https://${{ secrets.REPO_TOKEN }}@git.vezpi.me/Vezpi/blog.git . - name: Build Docker Image run: | cd docker docker build \ --build-arg HUGO_VERSION=${{ needs.Check-Rebuild.outputs.latest_hugo_version }} \ --tag ${DOCKER_IMAGE}:${{ needs.Check-Rebuild.outputs.latest_hugo_version }} \ . docker tag ${DOCKER_IMAGE}:${{ needs.Check-Rebuild.outputs.latest_hugo_version }} ${DOCKER_IMAGE}:latest Deploy-Staging: needs: - Check-Rebuild - Build if: always() && needs.Check-Rebuild.result == 'success' && (needs.Build.result == 'skipped' || needs.Build.result == 'success') runs-on: docker container: volumes: - /appli/docker/blog:/blog defaults: run: shell: sh env: CONTAINER_NAME: blog_staging steps: - name: Launch Blog Deployment run: | cd /blog docker compose down ${CONTAINER_NAME} docker compose up -d ${CONTAINER_NAME} sleep 5 echo "- Displaying container logs" docker compose logs ${CONTAINER_NAME} Test-Staging: needs: Deploy-Staging runs-on: ubuntu env: URL: "https://blog-dev.vezpi.com/en/" steps: - name: Check HTTP Response run: | code=$(curl -s -o /dev/null -w "%{http_code}" "$URL") echo "HTTP response code: $code" if [ "$code" -ne 200 ]; then echo "❌ Service is not healthy (HTTP $code)" exit 1 else echo "✅ Service is healthy" fi Merge: needs: Test-Staging runs-on: ubuntu steps: - name: Checkout Repository uses: actions/checkout@v4 with: fetch-depth: 0 ref: main - name: Merge preview Branch on main run: | git merge --ff-only origin/preview git push origin main Deploy-Production: needs: Merge runs-on: docker container: volumes: - /appli/docker/blog:/blog defaults: run: shell: sh env: CONTAINER_NAME: blog_production steps: - name: Launch Blog Deployment run: | cd /blog docker compose down ${CONTAINER_NAME} docker compose up -d ${CONTAINER_NAME} sleep 5 echo "- Displaying container logs" docker compose logs ${CONTAINER_NAME} Test-Production: needs: Deploy-Production runs-on: ubuntu env: URL: "https://blog.vezpi.com/en/" steps: - name: Check HTTP Response run: | code=$(curl -s -o /dev/null -w "%{http_code}" "$URL") echo "HTTP response code: $code" if [ "$code" -ne 200 ]; then echo "❌ Service is not healthy (HTTP $code)" exit 1 else echo "✅ Service is healthy" fi Clean: needs: - Check-Rebuild - Build - Test-Production runs-on: docker defaults: run: shell: sh steps: - name: Remove Old Docker Image run: | docker image rm ${{ needs.Check-Rebuild.outputs.current_docker_image }} --force docker image prune -f