From b3105e6b8226a1313d7f99d25b465f7447e99465 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 15 Jul 2026 21:01:55 +0200 Subject: [PATCH] :rewind: Backport github workflows from develop --- .github/workflows/auto-label.yml | 76 ++++++++++++++++++++++++++++++ .github/workflows/build-bundle.yml | 4 ++ .github/workflows/build-docker.yml | 4 ++ .github/workflows/tests-mcp.yml | 2 +- 4 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/auto-label.yml diff --git a/.github/workflows/auto-label.yml b/.github/workflows/auto-label.yml new file mode 100644 index 0000000000..27ae0f37a4 --- /dev/null +++ b/.github/workflows/auto-label.yml @@ -0,0 +1,76 @@ +name: Auto Label and Add to Project + +on: + issues: + types: [opened] + pull_request: + types: [opened] + +jobs: + triage: + runs-on: ubuntu-latest + steps: + - name: Generate GitHub App token + id: triage-app-token + uses: actions/create-github-app-token@v1 + with: + app-id: ${{ secrets.TRIAGE_APP_ID }} + private-key: ${{ secrets.TRIAGE_APP_PRIVATE_KEY }} + owner: penpot + + - name: Process Issue or PR + uses: actions/github-script@v7 + with: + github-token: ${{ steps.triage-app-token.outputs.token }} + script: | + // === 1. CONFIGURATION === + const PROJECT_NUMBER = 8; // <--- Replace with your project board number + const IS_ORG = true; // <--- Set to false if this is a personal project, true if an organization + const OWNER = context.repo.owner; + const REPO = context.repo.repo; + + const issueNumber = context.issue.number; + const isPR = !!context.payload.pull_request; + const contentId = isPR ? context.payload.pull_request.node_id : context.payload.issue.node_id; + + // Define your labels here + const labelToApply = 'needs triage'; + + // === 2. APPLY THE LABEL === + console.log(`Applying label "${labelToApply}" to ${isPR ? 'PR' : 'Issue'} #${issueNumber}...`); + await github.rest.issues.addLabels({ + issue_number: issueNumber, + owner: OWNER, + repo: REPO, + labels: [labelToApply] + }); + + // === 3. ADD TO PROJECT BOARD === + console.log(`Fetching Project #${PROJECT_NUMBER} ID...`); + const projectQuery = ` + query($owner: String!, $number: Int!) { + ${IS_ORG ? 'organization' : 'user'}(login: $owner) { + projectV2(number: $number) { + id + } + } + } + `; + + const projectRes = await github.graphql(projectQuery, { owner: OWNER, number: PROJECT_NUMBER }); + const projectId = IS_ORG ? projectRes.organization.projectV2.id : projectRes.user.projectV2.id; + + console.log(`Adding item to project board...`); + const addToProjectMutation = ` + mutation($projectId: ID!, $contentId: ID!) { + addProjectV2ItemById(input: {projectId: $projectId, contentId: $contentId}) { + item { + id + } + } + } + `; + + await github.graphql(addToProjectMutation, { projectId, contentId }); + console.log("Automation successfully completed!"); + diff --git a/.github/workflows/build-bundle.yml b/.github/workflows/build-bundle.yml index 8f8b40007a..e31382ccd4 100644 --- a/.github/workflows/build-bundle.yml +++ b/.github/workflows/build-bundle.yml @@ -37,6 +37,10 @@ on: required: false default: 'yes' +concurrency: + group: ${{ github.workflow }}-${{ inputs.gh_ref }} + cancel-in-progress: true + jobs: build-bundle: name: Build and Upload Penpot Bundle diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 18ac6aec9f..0972f1e25d 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -16,6 +16,10 @@ on: required: true default: 'develop' +concurrency: + group: ${{ github.workflow }}-${{ inputs.gh_ref }} + cancel-in-progress: true + jobs: build-and-push: name: Build and Push Penpot Docker Images diff --git a/.github/workflows/tests-mcp.yml b/.github/workflows/tests-mcp.yml index 9e622ca83a..6f8eadcadd 100644 --- a/.github/workflows/tests-mcp.yml +++ b/.github/workflows/tests-mcp.yml @@ -49,4 +49,4 @@ jobs: - name: Tests working-directory: ./mcp run: | - pnpm -r run test; + pnpm run test;