name: Pull Request on: pull_request: branches: - main env: REGISTRY: docker.notsosm.art IMAGE_NAME: euchre-camp jobs: unit-tests: runs-on: ubuntu-latest container: image: docker.notsosm.art/euchre-camp/ci-base:latest options: --user root env: DATABASE_URL: postgresql://user:pass@localhost:5432/dummy steps: - name: Checkout code uses: actions/checkout@v4 - name: Install dependencies run: npm ci --legacy-peer-deps - name: Generate Prisma client run: npx prisma generate - name: Run unit tests run: npm test build-and-deploy-ci: runs-on: ubuntu-latest needs: unit-tests container: image: docker.notsosm.art/euchre-camp/ci-base:latest options: --user root volumes: - /var/lib/casaos/apps:/apps steps: - name: Checkout code uses: actions/checkout@v4 - name: Extract PR number and commit info id: info run: | echo "pr_number=$(echo $GITHUB_REF | grep -oP 'refs/pull/\K[0-9]+')" >> $GITHUB_OUTPUT echo "short_sha=$(echo $GITHUB_SHA | cut -c1-7)" >> $GITHUB_OUTPUT - name: Build Docker image for PR run: | IMAGE_TAG="pr-${{ steps.info.outputs.pr_number }}-${{ steps.info.outputs.short_sha }}" docker build \ --target runner \ --build-arg GIT_COMMIT=$GITHUB_SHA \ -t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${IMAGE_TAG} \ . - name: Update CI site compose and restart run: | IMAGE_TAG="pr-${{ steps.info.outputs.pr_number }}-${{ steps.info.outputs.short_sha }}" COMPOSE_FILE="/apps/euchre_camp_ci/docker-compose.yml" # Update the image tag in the compose file sed -i "s|image: docker.notsosm.art/euchre-camp:[a-zA-Z0-9.-]*|image: docker.notsosm.art/euchre-camp:${IMAGE_TAG}|" ${COMPOSE_FILE} # Image was built locally in the previous step; compose uses it without pulling cd /apps/euchre_camp_ci docker compose up -d app - name: Wait for CI site to be ready run: | for i in {1..15}; do if docker ps --filter name=euchre-camp-ci --format '{{.Status}}' | grep -q Up; then echo "CI site container is running" exit 0 fi sleep 2 done echo "CI site container failed to start" docker compose -f /apps/euchre_camp_ci/docker-compose.yml logs app exit 1 - name: Run acceptance tests run: DATABASE_URL="${{ secrets.CI_DATABASE_URL }}" npx playwright test e2e/ env: CI: true - name: Cleanup PR images if: always() run: | docker rmi --force ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:pr-${{ steps.info.outputs.pr_number }}-${{ steps.info.outputs.short_sha }} || true analyze-bump-type: runs-on: ubuntu-latest needs: unit-tests steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 - name: Analyze commits for bump type id: bump_type run: | # Get the merge base and PR commits git fetch origin main:main 2>/dev/null || true MERGE_BASE=$(git merge-base HEAD main 2>/dev/null || echo "HEAD~1") # Analyze commits in this PR COMMITS=$(git log --oneline ${MERGE_BASE}..HEAD 2>/dev/null || git log --oneline -10) echo "Commits in this PR:" echo "$COMMITS" echo "" # Determine bump type if echo "$COMMITS" | grep -qE "(BREAKING CHANGE|!:)"; then BUMP="major" REASON="Breaking change detected in commit messages" elif echo "$COMMITS" | grep -qE "^feat"; then BUMP="minor" REASON="Feature commits detected" else BUMP="patch" REASON="Defaulting to patch (fixes or other changes)" fi echo "Suggested bump type: $BUMP" echo "Reason: $REASON" echo "bump=$BUMP" >> $GITHUB_OUTPUT echo "reason=$REASON" >> $GITHUB_OUTPUT - name: Comment bump type on PR if: github.event_name == 'pull_request' uses: actions/github-script@v7 with: script: | const bump = '${{ steps.bump_type.outputs.bump }}'; const reason = '${{ steps.bump_type.outputs.reason }}'; const comment = ` ## 🏷️ Version Bump Analysis **Suggested bump type:** \`${bump.toUpperCase()}\` **Reason:** ${reason} This PR will bump the version to the next ${bump} version when merged. `; github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: comment });