Я пытаюсь создать 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
Убедитесь, что ваше условие 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/pull/9
@Мадхумита, ты можешь проверить редактирование?
Обратите внимание, что это: BeginsWith(github.event.pull_request.base.ref, 'refs/heads/release/')) является ложным. В документе GH говорится, что pull_request.base.ref относится к базовой ветке (а не к полностью сформированной ссылке ветки).
Спасибо за ответ. Код слияния выполняется, но он снова работает в функциональной ветке, ожидается, что он будет запущен прямо в ветке выпуска.
он должен работать в ветке функций и как объединенный запрос на включение. Хотите ли вы, чтобы он работал в ветке выпуска? почему бы просто не настроить это в разделе push?
Да. Теоретически, когда я объединяю ветку функций с веткой выпуска, ветка выпуска должна запускать задания сборки и развертывания. Я попытался обновить условия отправки, но теперь рабочие процессы выполняются как для ветки функции, так и для ветки выпуска (выпуск снова пропускается). В идеале он должен работать только для ветки выпуска, поскольку ветка функций уже завершила сборку. github.com/learndevops33/mock_ci_cd/actions/runs/10433343167
Предложение @YassineLbk работает нормально, я думаю, вас смущает действие github, показывающее ветку функции в действиях github, потому что git Hub отслеживает и показывает ветку, в которой возникло событие.
@nabinsademba, вы правы, исходная ветка отображается во время выполнения рабочего процесса слияния.
он снова пропускается - github.com/learndevops33/mock_ci_cd/actions/runs/10432562068