Предположим, в одном из шагов у нас уже загрузились файлы и создалась ветвь, теперь нужно открыть PR. Это можно легко сделать вот так:
- name: Create or Update Pull Request
uses: actions/github-script@v7
with:
github-token: ${{ github.token }}
script: |
const path = require('path');
const createOrUpdatePR = require(path.join(process.env.GITHUB_ACTION_PATH, 'js/create-update-pr.js'));
await createOrUpdatePR({ github, context });
В файле js код для создания pr:
module.exports = async ({ github, context }) => {
const { repo } = context;
const { data: newPr } = await github.rest.pulls.create({
owner: repo.owner,
repo: repo.repo,
title: "some title",
head: branchName,
base: baseRef,
body: "",
});
}baseRef - это переменная среды, которую можно в самом действии задать как ${{ github.ref_name }} (github - это встроенная штука)А теперь этому pr можно назначить тег, чтобы потом сделать automerge:
await github.rest.issues.addLabels({
owner: repo.owner,
repo: repo.repo,
issue_number: newPr.number,
labels: prLabels,
});А вот следующим шагом мы запускаем программным способом другой workflow, которые сделает merge:
- name: Trigger Automerge Workflow
uses: actions/github-script@v7
with:
github-token: ${{ secrets.PAT_TOKEN }}
script: |
await github.rest.actions.createWorkflowDispatch({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: "automerge.yml",
ref: source_branch,
});
В качестве source_branch задаётся ветвь, которая создалась для pr.
Здесь также потребуется токен с правами на управление workflow, но его можно легко создать в профиле.
И затем в automerge.yml:
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Automerge PRs
uses: pascalgn/automerge-action@v0.16.4
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
MERGE_LABELS: "automerge"
MERGE_METHOD: "squash"
MERGE_RETRIES: 6
MERGE_RETRY_SLEEP: 10000
MERGE_DELETE_BRANCH: "true"
Он просто найдёт pr с нужным тегом и сделает merge, если нет конфликтов и проверки прошли. Теперь для всего этого можно задать условие запуска (к примеру, по расписанию) и наблюдать за результатом 🤓