Рабочий процесс GitHub: одно задание для каждого git действий (pu sh на мастере, pu sh теги ...) - PullRequest
1 голос
/ 02 августа 2020

Я хотел бы настроить свой рабочий процесс так, чтобы он делал следующее:

  • При любом событии (запрос на вытягивание, pu sh в любых ветвях)
    • Код проверки
    • Сборка проекта
    • Запуск тестов
    • Загрузка артефактов для других заданий
  • Только при отправке мастера
    • Загрузка артефактов из предыдущего задания
    • Pu sh GH-страницы
  • Только при добавлении тега
    • Загрузить артефакты из предыдущего задания
    • Создать выпуск
    • Загрузить артефакты в выпуск

В моем .github/workflows директивы on применяются ко всем заданиям, поэтому он не будет работать в моем случае. С другой стороны, action/upload-artifact работает только в рамках того же рабочего процесса.

Каков правильный способ достижения описанного рабочего процесса?

on: push
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v1
        with:
          submodules: true
      - name: Build
        run: make all
      - uses: actions/upload-artifact@v2
        with:
          name: build
          path: dist/
      - name: Deploy to GitHub Pages
        filters: # <-----<<<< What I would like to do
          branch: master                
        uses: JamesIves/github-pages-deploy-action@3.5.9
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN  }}
          BRANCH: gh-pages
          FOLDER: dist/html

1 Ответ

1 голос
/ 02 августа 2020

Вы можете добавлять условия к своим шагам и просто пропускать ненужные части, см. jobs.<id>.steps.if. Что касается что проверять, то контекст github - это кладезь различных данных, связанных с текущим рабочим процессом. Например,

github.event_name  string  The name of the event that triggered the workflow run.
github.ref         string  The branch or tag ref that triggered the workflow run.
github.head_ref    string  The head_ref or source branch of the pull request in a workflow run.

и т. Д.

Обратите внимание, что части , упомянутые в документации , являются лишь верхушкой айсберга; github.event содержит стену полезного. Лучше всего взглянуть в какой-нибудь рабочий процесс тестирования и посмотреть, что дает каждое событие.

Примерно так должно работать:

- name: On any event (pull-request, push on any branches) 
  uses: some/action
- name: Only when master is pushed
  if:   github.event_name == 'push' && github.ref == 'refs/heads/master'
  uses: some/action
- name: Only when a tag is pushed 
  if:   github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
  uses: some/action
...