Стратегия ветвления Git с помощью GitHub Actions

Я пытаюсь создать CI/CD для изучения потоков Devops CI и CD с помощью простой стратегии ветвления.

Стратегия филиала:

| branch name | environment |   
    main      --> prod 
    release/* --> uat 
    feature/* --> dev 

Сценарий, который я тестирую с помощью приведенного ниже рабочего процесса, выглядит следующим образом: всякий раз, когда разработчик отправляет код в ветку Feature/developer-1, задания сборки и развертывания должны выполняться и развертываться в среде разработки. После этого разработчик создаст запрос на включение для слияния с веткой выпуска/тестирования-релиза, и задания сборки и развертывания должны запуститься снова. Однако рабочий процесс пропускает задания при слиянии PR, и после слияния задания неправильно выполняются в ветке функций, а не в ветке выпуска/тестового выпуска.

Макет рабочего процесса:

name: mock CI/CD

on:
  push:
    branches:
      - 'feature/*'
  pull_request:
    branches:
      - 'release/*'

jobs:
  build:
    runs-on: ubuntu-latest
  if: |
    github.event_name == 'push' && startsWith(github.ref, 'refs/heads/feature/') || 
    (github.event_name == 'pull_request' && github.event.pull_request.merged == true && startsWith(github.event.pull_request.base.ref, 'release/'))
  steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Get commit message
      run: |
        echo "Commit message: $(git log -1 --pretty=%B)" > commit_message.txt

    - name: Display commit message
      run: cat commit_message.txt

    - name: Create build artifact
      run: |
        echo "Mock build complete."
        mv commit_message.txt file_build.txt

    - name: Upload build artifact
      uses: actions/upload-artifact@v3
      with:
        name: build
        path: file_build.txt

  deploy:
    runs-on: ubuntu-latest
    needs: build
    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Download build artifact
      uses: actions/download-artifact@v3
      with:
        name: build
        path: .

    - name: Rename build artifact
      run: mv file_build.txt file_deploy.txt

    - name: Upload deploy artifact
      uses: actions/upload-artifact@v3
      with:
        name: deploy
        path: file_deploy.txt

вот мой код репо — https://github.com/learndevops33/mock_ci_cd/tree/feature/developer-1

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Убедитесь, что ваше условие if правильно определяет момент объединения PR. Для PR-слияния github.event.action должно быть closed, а github.event.pull_request.merged должно быть true.

if: |
  github.event_name == 'push' && startsWith(github.ref, 'refs/heads/feature/') ||
  (github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == true && startsWith(github.event.pull_request.base.ref, 'release/'))

Обновлено:

У меня это работало с использованием этого синтаксиса с указанием условия закрытия на уровне событий.

  pull_request:
    branches:
      - 'release/*'
    types:
      - closed

Исходная документация: Запуск рабочего процесса pull_request при слиянии запроса на включение

он снова пропускается - github.com/learndevops33/mock_ci_cd/actions/runs/10432562068

Madhumitha 17.08.2024 15:15

Также он работает в ветке функций, а не в ветке выпуска.

Madhumitha 17.08.2024 15:22

Честно говоря, ваши коммиты не являются атомарными, это затрудняет отладку. Можете ли вы просто попробовать команду в моем редактировании, пожалуйста?

YassineLbk 17.08.2024 15:23

та же проблема - github.com/learndevops33/mock_ci_cd/pull/9

Madhumitha 17.08.2024 15:28

@Мадхумита, ты можешь проверить редактирование?

YassineLbk 17.08.2024 16:23

Обратите внимание, что это: BeginsWith(github.event.pull_request.base.ref, 'refs/heads/release/')) является ложным. В документе GH говорится, что pull_request.base.ref относится к базовой ветке (а не к полностью сформированной ссылке ветки).

YassineLbk 17.08.2024 16:36

Спасибо за ответ. Код слияния выполняется, но он снова работает в функциональной ветке, ожидается, что он будет запущен прямо в ветке выпуска.

Madhumitha 17.08.2024 17:20

он должен работать в ветке функций и как объединенный запрос на включение. Хотите ли вы, чтобы он работал в ветке выпуска? почему бы просто не настроить это в разделе push?

YassineLbk 17.08.2024 17:22

Да. Теоретически, когда я объединяю ветку функций с веткой выпуска, ветка выпуска должна запускать задания сборки и развертывания. Я попытался обновить условия отправки, но теперь рабочие процессы выполняются как для ветки функции, так и для ветки выпуска (выпуск снова пропускается). В идеале он должен работать только для ветки выпуска, поскольку ветка функций уже завершила сборку. github.com/learndevops33/mock_ci_cd/actions/runs/10433343167

Madhumitha 17.08.2024 17:31

Предложение @YassineLbk работает нормально, я думаю, вас смущает действие github, показывающее ветку функции в действиях github, потому что git Hub отслеживает и показывает ветку, в которой возникло событие.

nabin sademba 17.08.2024 17:38

@nabinsademba, вы правы, исходная ветка отображается во время выполнения рабочего процесса слияния.

Madhumitha 17.08.2024 18:36

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