name: Release & Deploy on: schedule: - cron: '0 * * * *' workflow_dispatch: env: GITEA_URL: https://git.example.com REGISTRY: git.example.com DEPLOY_SCRIPT: /home/user/deploy/deploy.sh IMAGE_NAME: newsarchiver jobs: release: runs-on: ubuntu-latest steps: - name: Clone repo run: | rm -rf $GITHUB_WORKSPACE/* git clone --depth 1 $GITEA_URL/$GITHUB_REPOSITORY $GITHUB_WORKSPACE git -C $GITHUB_WORKSPACE checkout main - name: Read version id: version run: | MAJOR=$(jq -r '.major' version.json) MINOR=$(jq -r '.minor' version.json) PATCH=$(jq -r '.patch' version.json) PATCH_PADDED=$(printf "%03d" "$PATCH") FULL_VERSION="${MAJOR}.${MINOR}.${PATCH_PADDED}" echo "version=$FULL_VERSION" >> $GITHUB_OUTPUT - name: Check if deploy needed id: check run: | VERSION_FILE="/home/user/deploy/deployed/newsarchiver.version" CURRENT_VERSION="${{ steps.version.outputs.version }}" if [ -f "$VERSION_FILE" ]; then DEPLOYED_VERSION=$(cat "$VERSION_FILE" | cut -d: -f2) if [ "$CURRENT_VERSION" = "$DEPLOYED_VERSION" ]; then echo "skip=true" >> $GITHUB_OUTPUT echo "No new version to deploy" exit 0 fi fi echo "skip=false" >> $GITHUB_OUTPUT - name: Bump patch version if: steps.check.outputs.skip != 'true' id: bump run: | MAJOR=$(jq -r '.major' version.json) MINOR=$(jq -r '.minor' version.json) PATCH=$(jq -r '.patch' version.json) NEW_PATCH=$((PATCH + 1)) PATCH_PADDED=$(printf "%03d" "$NEW_PATCH") RELEASE_VERSION="${MAJOR}.${MINOR}.${PATCH_PADDED}" jq --argjson p "$NEW_PATCH" '.patch = $p' version.json > version_new.json mv version_new.json version.json git config user.email "bot@example.com" git config user.name "CI Release Bot" git add version.json git commit -m "release: bump to $RELEASE_VERSION" git push origin main git tag -a "v${RELEASE_VERSION}" -m "release: $RELEASE_VERSION" git push origin "v${RELEASE_VERSION}" echo "release_version=$RELEASE_VERSION" >> $GITHUB_OUTPUT - name: Login to Gitea Registry if: steps.check.outputs.skip != 'true' run: | echo "${{ secrets.GITEA_REGISTRY_PASSWORD }}" | \ docker login --username jarianc --password-stdin ${{ env.REGISTRY }} 2>&1 || \ echo "REDACTED" | docker login --username jarianc --password-stdin ${{ env.REGISTRY }} - name: Build & Push to Registry if: steps.check.outputs.skip != 'true' id: build run: | TAG="${{ steps.bump.outputs.release_version }}" REGISTRY_IMAGE="${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:${TAG}" LATEST_IMAGE="${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:latest" docker build -t "$REGISTRY_IMAGE" . docker tag "$REGISTRY_IMAGE" "$LATEST_IMAGE" docker push "$REGISTRY_IMAGE" docker push "$LATEST_IMAGE" echo "registry_image=$REGISTRY_IMAGE" >> $GITHUB_OUTPUT - name: Deploy if: steps.check.outputs.skip != 'true' run: | REGISTRY_IMAGE="${{ steps.build.outputs.registry_image }}" bash "$DEPLOY_SCRIPT" newsarchiver "$REGISTRY_IMAGE" "http://127.0.0.1:5000/"