Отправить в источник из действия GitHub
Я пытаюсь подтолкнуть origin
удаленный от действия GitHub. Логика моих действий такова:
- ручка
pull_request_review
события и фильтр по сообщению комментария - оформить заказ в мастер, объединить ветку PR, запустить несколько проверок и отправить ее в
origin
Сценарий такой:
if [[ "${GITHUB_EVENT_NAME}" != "pull_request_review" ]]; then
echo "unsupported event: ${GITHUB_EVENT_NAME}"
exit 1
fi
user=$(jq -r .review.user.login ${GITHUB_EVENT_PATH})
cmd=$(jq -r .review.body ${GITHUB_EVENT_PATH})
echo "reviewer is ${user}, command is ${cmd}"
if [[ "${cmd}" == "merge" ]]; then
head=$(jq -r .pull_request.head.ref ${GITHUB_EVENT_PATH})
git config user.email test@test.com
git config user.name test
git checkout -B _tmp origin/${head}
git checkout -B master origin/master
git merge --no-ff _tmp
git push origin master
fi
Я запускаю этот сценарий из alpine:3.10
Контейнер Docker:
FROM alpine:3.10
LABEL "com.github.actions.name"="Hello world action"
LABEL "com.github.actions.icon"="shield"
LABEL "com.github.actions.color"="green"
WORKDIR /app
COPY action.sh action.sh
RUN apk --update add bash git jq
CMD ["bash", "/app/action.sh"]
Первые шаги работают нормально (оформление заказа и слияние), но действие не смогло подтолкнуть слияние к origin
из-за ошибки:
+ git push origin master
fatal: не удалось прочитать имя пользователя для https://github.com/: нет такого устройства или адреса
Похоже, контейнер Docker с действием GitHub не настроен для отправки на GitHub. Как мне его настроить? Можно ли использовать некоторые переменные env, предоставленные GitHub, или, возможно, некоторые смонтированные файлы (например, в/github/*
дорожка)?
6 ответов
действия / оформление @v2
Версия 2 проверки решает проблему с отсоединенным состоянием HEAD и упрощает отправку в источник.
name: Push commit
on: push
jobs:
report:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Create report file
run: date +%s > report.txt
- name: Commit report
run: |
git config --global user.name 'Your Name'
git config --global user.email 'your-username@users.noreply.github.com'
git commit -am "Automated report"
git push
Если вам нужно событие push для запуска других рабочих процессов, используйте repo
ограниченный токен личного доступа.
- uses: actions/checkout@v2
with:
token: ${{ secrets.PAT }}
actions / checkout @ v1 (исходный ответ)
Чтобы добавить дополнительные детали к отличному ответу @rmunn. Проблема в том, чтоactions/checkout@v1
действие оставляет репозиторий git в отключенном состоянии HEAD. См. Эту проблему для получения более подробной информации: https://github.com/actions/checkout/issues/6
Вот полный пример, демонстрирующий, как привести извлеченный репозиторий в рабочее состояние и отправить его на удаленный компьютер.
name: Push commit
on: push
jobs:
report:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Create report file
run: date +%s > report.txt
- name: Commit report
run: |
git config --global user.name 'Your Name'
git config --global user.email 'your-username@users.noreply.github.com'
git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY
git checkout "${GITHUB_REF:11}"
git commit -am "Automated report"
git push
Чтобы включить неотслеживаемые (новые) файлы, измените рабочий процесс, чтобы использовать следующее.
git add -A
git commit -m "Automated report"
Приведенный выше рабочий процесс должен работать для большинства событий. Заon: pull_request
рабочие процессы ветвь слияния (GITHUB_HEAD_REF
) следует извлечь, чтобы заменить фиксацию слияния по умолчанию.
Важно: если у вас есть другие проверки запросов на вытягивание, помимо следующего рабочего процесса, вы должны использовать токен личного доступа вместо маркера по умолчанию.GITHUB_TOKEN
. Это связано с преднамеренным ограничением, наложенным GitHub Actions на то, что события, вызываемые рабочим процессом (например,push
) не может запускать дальнейшие запуски рабочего процесса. Это сделано для предотвращения случайных ситуаций "бесконечного цикла" и в качестве меры противодействия злоупотреблениям. Используяrepo
Маркер персонального доступа с ограниченным доступом является утвержденным обходным путем. См. Эту проблему GitHub для получения дополнительных сведений об обходном пути.
name: Push commit on pull request
on: pull_request
jobs:
report:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
with:
ref: ${{ github.head_ref }}
- name: Create report file
run: date +%s > report.txt
- name: Commit report
run: |
git config --global user.name 'Your Name'
git config --global user.email 'your-username@users.noreply.github.com'
git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
git commit -am "Automated report"
git push
Дополнительные примеры push to origin во время on: pull_request
См. это сообщение в блоге, Действия GitHub: Как автоматизировать форматирование кода в запросах на извлечение.
Вы можете использовать secrets.GITHUB_TOKEN
в качестве пароля на URL вашего репозитория. Так что вы можете добавить это перед своимgit push
линия:
git remote set-url --push origin https://your_username:$GITHUB_TOKEN@github.com/your/repo
Это предполагает, что вы уже передаете секрет GITHUB_TOKEN в качестве переменной среды в свой скрипт. Если нет, добавьте:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
к шагу рабочего процесса.
Вот пример того, как использовать официальные действия github action/ [email protected] :
name: Example Push Action
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: |
date > generated.txt
git config user.name github-actions
git config user.email github-actions@github.com
git add .
git commit -m "generated"
git push
Все отличные ответы, однако я должен отметить, что есть GitHub Action Add & Commit , который существенно упрощает процесс.
name: Commit Date
on: push
jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Create report file
run: date +%s > report.txt
- name: Commit changes
uses: EndBug/add-and-commit@v8
with:
author_name: Your Name
author_email: mail@example.com
message: 'Your commit message'
add: 'report.txt'
Все предоставленные ответы верны. Но я хотел бы добавить к этим ответам еще немного. Возможны ситуации, когда в файлах нет изменений. Итак, в этой ситуации при попытке выполнить
git commit
, он возвращает ошибку, которая приводит к сбою рабочего процесса GitHub (неудачные рабочие процессы блокируют слияние PR). Поэтому мы должны проверить, есть ли какие-либо изменения в файлах перед фиксацией.
name: Config Generator
on:
pull_request:
branches: [ main ]
jobs:
config-generator:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.head_ref }}
- name: Install jsonnet
run: sudo apt install -y jsonnet
- name: Generate probe configs
run: python3 generate-configs.py
- name: Check for modified files
id: git-check
run: echo ::set-output name=modified::$(if [ -n "$(git status --porcelain)" ]; then echo "true"; else echo "false"; fi)
- name: Update changes in GitHub repository
if: steps.git-check.outputs.modified == 'true'
run: |
git config --global user.name 'Your Name'
git config --global user.email 'Your Email for GitHub'
git add -A
git commit -m '[automated commit] add configs generated using jsonnet & GitHub workflow'
git push
Вышеупомянутый рабочий процесс является примером создания файлов конфигурации с использованием рабочего процесса jsonnet и GitHub. Сначала он устанавливает jsonnet и запускает скрипт python, который создает файлы конфигурации с использованием шаблонов jsonnet. Как упоминалось выше, может возникнуть ситуация, когда нет изменений в файлах. Таким образом, он использует команду, чтобы проверить, есть ли какие-либо изменения в файле. (Вместо того
git status
,
git diff
также можно использовать. Но он не будет показывать неотслеживаемые файлы). Остальные команды git запускаются, только если есть изменения в файлах.
Также обратите внимание, что мне пришлось использовать
ref: ${{ github.head_ref }}
для оформления заказа в исходную ветку, хотя я использовал
checkout@v2
(в моем случае все еще существует проблема с отделенной головой)
Для автоматической фиксации без определения пользователя или чего-либо использовать
EndBug/add-and-commit@v7
. Вот мой файл рабочего процесса для автоматического форматирования и фиксации js и python
name: auto-format
on: push
jobs:
format-python:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: black
uses: lgeiger/black-action@v1.0.1
with:
args: .
- uses: EndBug/add-and-commit@v7
with:
default_author: github_actions
format-js:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: prettier
run: npx prettier --write "./**/*.{js,html}"
- uses: EndBug/add-and-commit@v7
with:
default_author: github_actions