From 7d3aa1c96a8bdb96dcc0a4db9e116d01a16278a5 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 29 May 2026 19:19:55 +0000 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=D0=BF=D1=80=D0=BE=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D0=BA=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20=D0=B8=20?= =?UTF-8?q?=D1=81=D0=BE=D0=BD=D0=B0=D1=80=D0=B0=20=D0=BF=D1=80=D0=B8=20pus?= =?UTF-8?q?h,=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=B2?= =?UTF-8?q?=D0=B5=D1=82=D0=BA=D0=B8=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B=D1=82?= =?UTF-8?q?=20PR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Перенесена логика из 1c-syntax/bsl-language-server: при событии push в ветку, для которой уже открыт pull request, тестирование и контроль качества пропускаются, чтобы избежать дублирующего прогона (он будет выполнен в рамках события pull_request). Логика реализована встроенным job check-pr-exists в reusable-workflow'ах test.yml и sonar.yml. В отличие от исходного репозитория используется динамическое определение ветки по умолчанию (github.event.repository.default_branch), а не внешний скрипт, недоступный в контексте вызывающего репозитория. https://claude.ai/code/session_01BWWiueTXPbduaFtruKmkAv --- .github/workflows/sonar.yml | 45 +++++++++++++++++++++++++++++++++---- .github/workflows/test.yml | 36 +++++++++++++++++++++++++++++ README.md | 6 +++++ 3 files changed, 83 insertions(+), 4 deletions(-) diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 4eebe63..e306e86 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -108,7 +108,44 @@ on: jobs: + check-pr-exists: + runs-on: ubuntu-latest + permissions: + pull-requests: read + outputs: + has_pr: ${{ steps.check.outputs.has_pr }} + steps: + - name: Проверка наличия pull request для ветки + id: check + env: + GH_TOKEN: ${{ github.token }} + EVENT_NAME: ${{ github.event_name }} + REF_NAME: ${{ github.ref_name }} + REPOSITORY: ${{ github.repository }} + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + run: | + set -e + # При push в ветку, для которой уже открыт pull request, контроль + # качества будет выполнен в рамках события pull_request, поэтому + # повторный запуск для события push пропускается во избежание + # дублирования прогонов. + if [ "$EVENT_NAME" == "push" ] \ + && [ "$REF_NAME" != "$DEFAULT_BRANCH" ] \ + && [ "$REF_NAME" != "master" ] \ + && [ "$REF_NAME" != "develop" ]; then + prs=$(gh pr list --repo "$REPOSITORY" --head "$REF_NAME" --state open --json number --jq 'length') + if [ "$prs" -gt 0 ]; then + echo "has_pr=true" >> "$GITHUB_OUTPUT" + else + echo "has_pr=false" >> "$GITHUB_OUTPUT" + fi + else + echo "has_pr=false" >> "$GITHUB_OUTPUT" + fi + test: + needs: [check-pr-exists] + if: needs.check-pr-exists.outputs.has_pr != 'true' runs-on: ${{ inputs.os_version }} env: LANG: ${{ inputs.locale }}.UTF-8 @@ -217,8 +254,8 @@ jobs: sonar: runs-on: ${{ inputs.os_version }} - needs: [test] - if: ${{ (inputs.sonarqube == true) && (github.repository == inputs.github_repository) && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.event.repository.full_name) }} + needs: [check-pr-exists, test] + if: ${{ (needs.check-pr-exists.outputs.has_pr != 'true') && (inputs.sonarqube == true) && (github.repository == inputs.github_repository) && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.event.repository.full_name) }} steps: - name: Актуализация uses: actions/checkout@v6.0.2 @@ -267,8 +304,8 @@ jobs: coveralls: runs-on: ${{ inputs.os_version }} - if: inputs.coveralls == true - needs: [test] + if: ${{ (needs.check-pr-exists.outputs.has_pr != 'true') && (inputs.coveralls == true) }} + needs: [check-pr-exists, test] steps: - name: Актуализация uses: actions/checkout@v6.0.2 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 11d8d4d..73470cf 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -89,7 +89,43 @@ on: default: false jobs: + check-pr-exists: + runs-on: ubuntu-latest + permissions: + pull-requests: read + outputs: + has_pr: ${{ steps.check.outputs.has_pr }} + steps: + - name: Проверка наличия pull request для ветки + id: check + env: + GH_TOKEN: ${{ github.token }} + EVENT_NAME: ${{ github.event_name }} + REF_NAME: ${{ github.ref_name }} + REPOSITORY: ${{ github.repository }} + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + run: | + set -e + # При push в ветку, для которой уже открыт pull request, тесты будут + # запущены в рамках события pull_request, поэтому повторный запуск + # для события push пропускается во избежание дублирования прогонов. + if [ "$EVENT_NAME" == "push" ] \ + && [ "$REF_NAME" != "$DEFAULT_BRANCH" ] \ + && [ "$REF_NAME" != "master" ] \ + && [ "$REF_NAME" != "develop" ]; then + prs=$(gh pr list --repo "$REPOSITORY" --head "$REF_NAME" --state open --json number --jq 'length') + if [ "$prs" -gt 0 ]; then + echo "has_pr=true" >> "$GITHUB_OUTPUT" + else + echo "has_pr=false" >> "$GITHUB_OUTPUT" + fi + else + echo "has_pr=false" >> "$GITHUB_OUTPUT" + fi + build: + needs: [check-pr-exists] + if: needs.check-pr-exists.outputs.has_pr != 'true' runs-on: ${{ matrix.os }} env: LANG: ${{ inputs.locale }}.UTF-8 diff --git a/README.md b/README.md index 0c0a2f4..2a40630 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,9 @@ lib.system=../oscript_modules Сборочная линия для выполнения тестирования библиотеки. Позволяет запустить матричную сборку на настраиваемом списке операционных систем (по умолчанию Windows, Ubuntu и macOS) на нескольких версиях движка OneScript. Поддерживается запуск из ветки, из pull request и ручной запуск из информации о конкретном workflow. +> [!NOTE] +> Чтобы избежать двойного прогона, при событии `push` в ветку, для которой уже открыт pull request, тестирование пропускается — оно будет выполнено в рамках события `pull_request`. Для ветки по умолчанию (а также `master` и `develop`) тестирование выполняется всегда. + Файл workflow: [https://github.com/autumn-library/workflows/blob/main/.github/workflows/test.yml](https://github.com/autumn-library/workflows/blob/main/.github/workflows/test.yml) Общие параметры: @@ -208,6 +211,9 @@ jobs: Поддерживается запуск из ветки, из pull request и ручной запуск из информации о конкретном workflow. > Анализ pull request из форков для задачи SonarQube пока не поддерживается. +> [!NOTE] +> Чтобы избежать двойного прогона, при событии `push` в ветку, для которой уже открыт pull request, контроль качества пропускается — он будет выполнен в рамках события `pull_request`. Для ветки по умолчанию (а также `master` и `develop`) контроль качества выполняется всегда. + Файл workflow: [https://github.com/autumn-library/workflows/blob/main/.github/workflows/sonar.yml](https://github.com/autumn-library/workflows/blob/main/.github/workflows/sonar.yml) Параметры: From aac7d125dd9204d0b33994cbfba159e8524a7412 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 29 May 2026 19:23:02 +0000 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20main=20=D0=B2=20=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BE=D0=BA=20=D0=B7=D0=B0=D1=89=D0=B8=D1=89=D1=91=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=BE=D1=82=20=D0=BF=D1=80=D0=BE=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D0=BA=D0=B0=20=D0=B2=D0=B5=D1=82=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://claude.ai/code/session_01BWWiueTXPbduaFtruKmkAv --- .github/workflows/sonar.yml | 1 + .github/workflows/test.yml | 1 + README.md | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index e306e86..2711344 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -131,6 +131,7 @@ jobs: # дублирования прогонов. if [ "$EVENT_NAME" == "push" ] \ && [ "$REF_NAME" != "$DEFAULT_BRANCH" ] \ + && [ "$REF_NAME" != "main" ] \ && [ "$REF_NAME" != "master" ] \ && [ "$REF_NAME" != "develop" ]; then prs=$(gh pr list --repo "$REPOSITORY" --head "$REF_NAME" --state open --json number --jq 'length') diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 73470cf..2c3e2aa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -111,6 +111,7 @@ jobs: # для события push пропускается во избежание дублирования прогонов. if [ "$EVENT_NAME" == "push" ] \ && [ "$REF_NAME" != "$DEFAULT_BRANCH" ] \ + && [ "$REF_NAME" != "main" ] \ && [ "$REF_NAME" != "master" ] \ && [ "$REF_NAME" != "develop" ]; then prs=$(gh pr list --repo "$REPOSITORY" --head "$REF_NAME" --state open --json number --jq 'length') diff --git a/README.md b/README.md index 2a40630..f31eb56 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ lib.system=../oscript_modules Сборочная линия для выполнения тестирования библиотеки. Позволяет запустить матричную сборку на настраиваемом списке операционных систем (по умолчанию Windows, Ubuntu и macOS) на нескольких версиях движка OneScript. Поддерживается запуск из ветки, из pull request и ручной запуск из информации о конкретном workflow. > [!NOTE] -> Чтобы избежать двойного прогона, при событии `push` в ветку, для которой уже открыт pull request, тестирование пропускается — оно будет выполнено в рамках события `pull_request`. Для ветки по умолчанию (а также `master` и `develop`) тестирование выполняется всегда. +> Чтобы избежать двойного прогона, при событии `push` в ветку, для которой уже открыт pull request, тестирование пропускается — оно будет выполнено в рамках события `pull_request`. Для ветки по умолчанию (а также `main`, `master` и `develop`) тестирование выполняется всегда. Файл workflow: [https://github.com/autumn-library/workflows/blob/main/.github/workflows/test.yml](https://github.com/autumn-library/workflows/blob/main/.github/workflows/test.yml) @@ -212,7 +212,7 @@ jobs: > Анализ pull request из форков для задачи SonarQube пока не поддерживается. > [!NOTE] -> Чтобы избежать двойного прогона, при событии `push` в ветку, для которой уже открыт pull request, контроль качества пропускается — он будет выполнен в рамках события `pull_request`. Для ветки по умолчанию (а также `master` и `develop`) контроль качества выполняется всегда. +> Чтобы избежать двойного прогона, при событии `push` в ветку, для которой уже открыт pull request, контроль качества пропускается — он будет выполнен в рамках события `pull_request`. Для ветки по умолчанию (а также `main`, `master` и `develop`) контроль качества выполняется всегда. Файл workflow: [https://github.com/autumn-library/workflows/blob/main/.github/workflows/sonar.yml](https://github.com/autumn-library/workflows/blob/main/.github/workflows/sonar.yml) From cf14ecc5f31177d5c5f5693a2414ce3212410b17 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 29 May 2026 19:35:21 +0000 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=D1=83=D0=B1=D1=80=D0=B0=D1=82=D1=8C?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=20=D0=B2=20reusable=20workflow,=20=D0=BB=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=B2=D1=88=D0=B8=D0=B9=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Job check-pr-exists запрашивал 'pull-requests: read' через блок permissions. Reusable workflow не может запросить прав больше, чем выдал вызывающий репозиторий, поэтому при токене с 'pull-requests: none' это приводило к startup failure ещё до запуска job (Invalid workflow file). Блок permissions удалён, вызов gh сделан устойчивым к отказу (|| echo 0): при отсутствии прав проверка возвращает has_pr=false и тесты/сонар запускаются как обычно. Для активации пропуска повторного прогона на push вызывающий workflow должен сам выдать токену pull-requests: read (добавлено в примеры README). https://claude.ai/code/session_01BWWiueTXPbduaFtruKmkAv --- .github/workflows/sonar.yml | 7 ++++--- .github/workflows/test.yml | 7 ++++--- README.md | 10 ++++++++++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 2711344..ac3481b 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -110,8 +110,6 @@ jobs: check-pr-exists: runs-on: ubuntu-latest - permissions: - pull-requests: read outputs: has_pr: ${{ steps.check.outputs.has_pr }} steps: @@ -129,12 +127,15 @@ jobs: # качества будет выполнен в рамках события pull_request, поэтому # повторный запуск для события push пропускается во избежание # дублирования прогонов. + # Проверка работает только если вызывающий workflow выдал токену + # право pull-requests: read; иначе gh завершится с ошибкой и контроль + # качества будет запущен (безопасное поведение по умолчанию). if [ "$EVENT_NAME" == "push" ] \ && [ "$REF_NAME" != "$DEFAULT_BRANCH" ] \ && [ "$REF_NAME" != "main" ] \ && [ "$REF_NAME" != "master" ] \ && [ "$REF_NAME" != "develop" ]; then - prs=$(gh pr list --repo "$REPOSITORY" --head "$REF_NAME" --state open --json number --jq 'length') + prs=$(gh pr list --repo "$REPOSITORY" --head "$REF_NAME" --state open --json number --jq 'length' 2>/dev/null || echo "0") if [ "$prs" -gt 0 ]; then echo "has_pr=true" >> "$GITHUB_OUTPUT" else diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2c3e2aa..3a7fce4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -91,8 +91,6 @@ on: jobs: check-pr-exists: runs-on: ubuntu-latest - permissions: - pull-requests: read outputs: has_pr: ${{ steps.check.outputs.has_pr }} steps: @@ -109,12 +107,15 @@ jobs: # При push в ветку, для которой уже открыт pull request, тесты будут # запущены в рамках события pull_request, поэтому повторный запуск # для события push пропускается во избежание дублирования прогонов. + # Проверка работает только если вызывающий workflow выдал токену + # право pull-requests: read; иначе gh завершится с ошибкой и тесты + # будут запущены (безопасное поведение по умолчанию). if [ "$EVENT_NAME" == "push" ] \ && [ "$REF_NAME" != "$DEFAULT_BRANCH" ] \ && [ "$REF_NAME" != "main" ] \ && [ "$REF_NAME" != "master" ] \ && [ "$REF_NAME" != "develop" ]; then - prs=$(gh pr list --repo "$REPOSITORY" --head "$REF_NAME" --state open --json number --jq 'length') + prs=$(gh pr list --repo "$REPOSITORY" --head "$REF_NAME" --state open --json number --jq 'length' 2>/dev/null || echo "0") if [ "$prs" -gt 0 ]; then echo "has_pr=true" >> "$GITHUB_OUTPUT" else diff --git a/README.md b/README.md index f31eb56..2e88a33 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ lib.system=../oscript_modules > [!NOTE] > Чтобы избежать двойного прогона, при событии `push` в ветку, для которой уже открыт pull request, тестирование пропускается — оно будет выполнено в рамках события `pull_request`. Для ветки по умолчанию (а также `main`, `master` и `develop`) тестирование выполняется всегда. +> Для работы этой проверки вызывающему workflow необходимо выдать токену право `pull-requests: read` (см. блок `permissions` в примерах ниже). Если право не выдано, тестирование запускается как обычно — и на `push`, и на `pull_request`. Файл workflow: [https://github.com/autumn-library/workflows/blob/main/.github/workflows/test.yml](https://github.com/autumn-library/workflows/blob/main/.github/workflows/test.yml) @@ -77,6 +78,10 @@ on: pull_request: workflow_dispatch: +permissions: + contents: read + pull-requests: read # для пропуска повторного прогона на push при открытом PR + jobs: test: uses: autumn-library/workflows/.github/workflows/test.yml@v1 @@ -213,6 +218,7 @@ jobs: > [!NOTE] > Чтобы избежать двойного прогона, при событии `push` в ветку, для которой уже открыт pull request, контроль качества пропускается — он будет выполнен в рамках события `pull_request`. Для ветки по умолчанию (а также `main`, `master` и `develop`) контроль качества выполняется всегда. +> Для работы этой проверки вызывающему workflow необходимо выдать токену право `pull-requests: read` (см. блок `permissions` в примерах ниже). Если право не выдано, контроль качества запускается как обычно — и на `push`, и на `pull_request`. Файл workflow: [https://github.com/autumn-library/workflows/blob/main/.github/workflows/sonar.yml](https://github.com/autumn-library/workflows/blob/main/.github/workflows/sonar.yml) @@ -273,6 +279,10 @@ on: pull_request: workflow_dispatch: +permissions: + contents: read + pull-requests: read # для пропуска повторного прогона на push при открытом PR + jobs: sonar: uses: autumn-library/workflows/.github/workflows/sonar.yml@v1