Отправить в источник из действия 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


Другие вопросы по тегам