Overview
오늘은 Pull Request에 대해서 알아본 후
Github Action Pull Request 자동화에 대해서 공부해보려고 한다.
2023.05.19 - [IaC/CI CD Tool] - 1. Github Action이란?
2023.05.23 - [IaC/CI CD Tool] - 2. Github Action 주요 문법(Syntax)
Pull Request란?
Pull Request는 협업 중인 개발 프로젝트에서 일반적으로 사용되는 Git 기능 중 하나이다.
Pull Request는 개발자가 코드의 변경사항을 다른 사람에게 알리고 그 변경사항을 메인 코드베이스에 병합(merge)하도록 요청하는 것을 의미한다.
Pull Request pipeline 자동화하기
아래의 요구 사항을 반영하기 위해 먼저, 개인 GitHub에서 테스트를 해보기로 하였다.
어느날 개발자에게 아래와 같은 요청이 왔다.
"github branch protection rules 설정을 사용해서 master branch로 push하는걸 막을꺼에요. 만약에 Trigger로 인해 master branch의 있는 workflow가 동작한다면 새로운 branch를 자동으로 만들고 해당 branch에서 master branch로 PR을 날리게 자동화 시켜주세요!"
개인 GitHub 테스트
Git Clone 후 브랜치 생성
# 디렉토리별로 Git ssh-key를 다른걸 쓰도록 구성해 놓았다.
$ git clone git@github.com-somaz94:somaz94/test.git
$ git checkout -b test2
Switched to a new branch 'test2'
$ git push --set-upstream origin test2
Personal access token 생성 (PAT)
PAT secret 설정
github workflow 설정
트리거 설정까지 하면 너무 복잡하기 때문에 test2 branch에 push가 일어나면 작동하도록 설계하였다.
name: Create Pull Request
on:
push:
branches:
- test2
jobs:
create_pull_request:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
with:
fetch-depth: 0
persist-credentials: false
token: ${{ secrets.CICD_PAT }}
- name: Create test.txt file
run: echo "This is a test file" > test.txt
- name: Commit and push test.txt file
run: |
git config --global user.email "somaz@gmail.com"
git config --global user.name "somaz"
git checkout test1
git add test.txt
git commit -m "Add test.txt file"
git push https://${{ secrets.CICD_PAT }}@github.com/${{ github.repository }} test1
- name: Create pull request
env:
GITHUB_TOKEN: ${{ secrets.CICD_PAT }}
run: |
PR_JSON=$(curl -s -X POST -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github+json" https://api.github.com/repos/${{ github.repository }}/pulls -d '{"title": "Add test.txt file", "head": "test1", "base": "main"}')
echo "$PR_JSON" | jq '.number'
$ git add .github/
$ git commit -m "ADD .github"
[test2 2b01eb5] ADD .github
1 file changed, 33 insertions(+)
create mode 100644 .github/workflows/pull-request.yml
github branch protection rules 설정
test2 branch push
$ git add test2
$ git commit -m "ADD test2"
[test2 daf1670] ADD test2
1 file changed, 1 insertion(+)
create mode 100644 test2
$ git push
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 16 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 278 bytes | 278.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com-somaz94:somaz94/test.git
2b01eb5..daf1670 test2 -> test2
실제 적용 GitHub 소스코드
- name: Add & Commit & Push files
if: ${{ steps.gen.outputs.isGenfileModified == 'true' && github.event.client_payload.ref_name != 'prod' }}
env:
TRIGGER_USER: ${{ github.event.sender.login }}
BRANCH: ${{ env.BRANCH }}
RUN_NUMBER: ${{ env.RUN_NUMBER }}
run: |
git config --global user.email "xxx@xxx"
git config --global user.name "xxx"
git add libs
git commit -m "Update generated files by $TRIGGER_USER. Run number: ${{ env.RUN_NUMBER }}"
git push -u origin ${{ github.event.client_payload.ref }}
- name: Add & Commit & Push files & Pull request
if: ${{ steps.gen.outputs.isGenfileModified == 'true' && github.event.client_payload.ref_name == 'prod' }}
env:
TRIGGER_USER: ${{ github.event.sender.login }}
BRANCH: ${{ env.BRANCH }}
RUN_NUMBER: ${{ env.RUN_NUMBER }}
CICD_PAT: ${{ secrets.CICD_PAT }} # Add CICD_PAT from organization secrets
run: |
git config --global user.email "xxx@xxx"
git config --global user.name "xxx"
# Create a new branch for the changes
git checkout -b "update-generated-files-$TRIGGER_USER-$RUN_NUMBER"
git add libs
git commit -m "Update generated files by $TRIGGER_USER. Run number: ${{ env.RUN_NUMBER }}"
git push -u origin "update-generated-files-$TRIGGER_USER-$RUN_NUMBER"
# Create a pull request using the GitHub API
PR_JSON=$(curl -s -X POST -H "Authorization: token $CICD_PAT" -H "Accept: application/vnd.github+json" https://api.github.com/repos/$GITHUB_REPOSITORY/pulls -d '{"title":"Update generated files by '"$TRIGGER_USER"'. Run number: '"${RUN_NUMBER}"'", "head":"update-generated-files-'"$TRIGGER_USER"'-'"$RUN_NUMBER"'", "base":"'"${{ github.event.client_payload.ref }}"'"}')
echo "$PR_JSON" | jq '.number'
- prod 환경으로 트리거 요청이 올때만, pull request 를 요청하게 설정하였다.
Reference
https://medium.com/@urna.hybesis/pull-request-workflow-with-git-6-steps-guide-3858e30b5fa4
'IaC > CI CD Tool' 카테고리의 다른 글
ArgoCD 설치 AWS & GCP (0) | 2023.08.09 |
---|---|
4. GitLab 버전 업그레이드 (0) | 2023.08.08 |
2. Github Action (With Syntax) (0) | 2023.05.22 |
1. Github Action이란? (0) | 2023.05.19 |
ArgoCD란? (0) | 2023.05.17 |