From 564effd7dceeca97ffdb26e8e935520bcae9fade Mon Sep 17 00:00:00 2001 From: Samuel El-Borai Date: Wed, 19 Nov 2025 20:27:46 +0100 Subject: [PATCH] chore(ci): make stainless workflow more DRY --- .github/workflows/stainless-builds.yml | 88 +++++++++++--------------- 1 file changed, 38 insertions(+), 50 deletions(-) diff --git a/.github/workflows/stainless-builds.yml b/.github/workflows/stainless-builds.yml index a18c70887..28869fdd8 100644 --- a/.github/workflows/stainless-builds.yml +++ b/.github/workflows/stainless-builds.yml @@ -43,7 +43,41 @@ env: # Stainless organization dashboard jobs: + compute-branch: + runs-on: ubuntu-latest + outputs: + preview_branch: ${{ steps.compute.outputs.preview_branch }} + base_branch: ${{ steps.compute.outputs.base_branch }} + merge_branch: ${{ steps.compute.outputs.merge_branch }} + steps: + - name: Compute branch names + id: compute + run: | + HEAD_REPO="${{ github.event.pull_request.head.repo.full_name }}" + BASE_REPO="${{ github.repository }}" + BRANCH_NAME="${{ github.event.pull_request.head.ref }}" + FORK_OWNER="${{ github.event.pull_request.head.repo.owner.login }}" + + if [ "$HEAD_REPO" != "$BASE_REPO" ]; then + # Fork PR: prefix with fork owner for isolation + if [ -z "$FORK_OWNER" ]; then + echo "Error: Fork PR detected but fork owner is empty" >&2 + exit 1 + fi + PREVIEW_BRANCH="preview/${FORK_OWNER}/${BRANCH_NAME}" + BASE_BRANCH="preview/base/${FORK_OWNER}/${BRANCH_NAME}" + else + # Same-repo PR + PREVIEW_BRANCH="preview/${BRANCH_NAME}" + BASE_BRANCH="preview/base/${BRANCH_NAME}" + fi + + echo "preview_branch=${PREVIEW_BRANCH}" >> $GITHUB_OUTPUT + echo "base_branch=${BASE_BRANCH}" >> $GITHUB_OUTPUT + echo "merge_branch=${PREVIEW_BRANCH}" >> $GITHUB_OUTPUT + preview: + needs: compute-branch if: github.event.action != 'closed' runs-on: ubuntu-latest permissions: @@ -59,32 +93,6 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 2 - # Compute the Stainless branch name, prefixing with fork owner if PR is from a fork. - # For fork PRs like "contributor:fix/issue-123", this creates "preview/contributor/fix/issue-123" - # For same-repo PRs, this creates "preview/fix/issue-123" - - name: Compute branch names - id: branch-names - run: | - HEAD_REPO="${{ github.event.pull_request.head.repo.full_name }}" - BASE_REPO="${{ github.repository }}" - BRANCH_NAME="${{ github.event.pull_request.head.ref }}" - - if [ "$HEAD_REPO" != "$BASE_REPO" ]; then - # Fork PR: prefix with fork owner for isolation - FORK_OWNER="${{ github.event.pull_request.head.repo.owner.login }}" - PREVIEW_BRANCH="preview/${FORK_OWNER}/${BRANCH_NAME}" - BASE_BRANCH="preview/base/${FORK_OWNER}/${BRANCH_NAME}" - else - # Same-repo PR - PREVIEW_BRANCH="preview/${BRANCH_NAME}" - BASE_BRANCH="preview/base/${BRANCH_NAME}" - fi - - echo "preview_branch=${PREVIEW_BRANCH}" >> $GITHUB_OUTPUT - echo "base_branch=${BASE_BRANCH}" >> $GITHUB_OUTPUT - - # This action builds preview SDKs from the OpenAPI spec changes and - # posts/updates a comment on the PR with build results and links to the preview. - name: Run preview builds uses: stainless-api/upload-openapi-spec-action/preview@32823b096b4319c53ee948d702d9052873af485f # 1.6.0 with: @@ -97,10 +105,11 @@ jobs: base_sha: ${{ github.event.pull_request.base.sha }} base_ref: ${{ github.event.pull_request.base.ref }} head_sha: ${{ github.event.pull_request.head.sha }} - branch: ${{ steps.branch-names.outputs.preview_branch }} - base_branch: ${{ steps.branch-names.outputs.base_branch }} + branch: ${{ needs.compute-branch.outputs.preview_branch }} + base_branch: ${{ needs.compute-branch.outputs.base_branch }} merge: + needs: compute-branch if: github.event.action == 'closed' && github.event.pull_request.merged == true runs-on: ubuntu-latest permissions: @@ -116,27 +125,6 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 2 - # Compute the Stainless branch name, prefixing with fork owner if PR is from a fork. - # For fork PRs like "contributor:fix/issue-123", this creates "preview/contributor/fix/issue-123" - # For same-repo PRs, this creates "preview/fix/issue-123" - - name: Compute branch names - id: branch-names - run: | - HEAD_REPO="${{ github.event.pull_request.head.repo.full_name }}" - BASE_REPO="${{ github.repository }}" - BRANCH_NAME="${{ github.event.pull_request.head.ref }}" - - if [ "$HEAD_REPO" != "$BASE_REPO" ]; then - # Fork PR: prefix with fork owner for isolation - FORK_OWNER="${{ github.event.pull_request.head.repo.owner.login }}" - MERGE_BRANCH="preview/${FORK_OWNER}/${BRANCH_NAME}" - else - # Same-repo PR - MERGE_BRANCH="preview/${BRANCH_NAME}" - fi - - echo "merge_branch=${MERGE_BRANCH}" >> $GITHUB_OUTPUT - # Note that this only merges in changes that happened on the last build on # the computed preview branch. It's possible that there are OAS/config # changes that haven't been built, if the preview job didn't finish @@ -155,4 +143,4 @@ jobs: base_sha: ${{ github.event.pull_request.base.sha }} base_ref: ${{ github.event.pull_request.base.ref }} head_sha: ${{ github.event.pull_request.head.sha }} - merge_branch: ${{ steps.branch-names.outputs.merge_branch }} + merge_branch: ${{ needs.compute-branch.outputs.merge_branch }}