시나리오 : GitHub PR 등록 또는 commit 시 자동으로 Jenkins가 수행된다.
라는 간단한 시나리오를 GitHub와 Jenkins 연동으로, GitHub와 Tekton 연동으로 해볼 예정
시리즈 #1로 Jenkins로 해보는 이야기
사전 준비
Jenkins와 Kubernetes Cluster가 준비되어 있다 가정
진행
Jenkins에서는 어떤 플러그인을 활용할 것인가가 상당히 중요하다.
구글링해보면 https://github.com/jenkinsci/ghprb-plugin 플러그인을 사용하는 글이 많은데,
실제 해당 플러그인의 위키를 보면 https://github.com/jenkinsci/github-branch-source-plugin 로 마이그레이션하는 게 좋겠다는 말이 있어서 이 플러그인을 사용해서 해보자.
이 플러그인은 cloudbees사에서 관리하는 플러그인이라 문서도 있다.
https://docs.cloudbees.com/docs/cloudbees-ci/latest/cloud-admin-guide/github-branch-source-plugin
문서를 참고하며 해보자.
1. 사전에 Manage Jenkins » Configure Jenkins › GitHub Enterprise Servers 를 등록해야 한다.
API endpoint : https://<github.enterprise.net>/api/v3
Name : <github.enterprise>
2. GitHub Credential 생성
Username with Password 으로 생성하고 Username은 GitHub user ID이고 Password는 personal API Token을 생성하여 사용한다.
scope는 repo 모든 것, admin:repo_hook 모든 것이 필요하다.
3. Jenkins에서 Project를 생성하기 위해 New Item > GitHub Organization을 선택한다. (결국 여기서 다른 것을 선택하고 싶다면, 다른 플러그인을 활용해야 한다.)
Projects > GitHub Organization >
API endpoint : select box에서 사전에 생성해둔 것을 선택한다.
Credentials : 또한 사전에 생성해둔 것을 선택한다.
Owner : org를 입력한다. (개인의 경우 개인 ID를 입력)
프로젝트가 생성되면, 해당 org 하위 모든 repo를 scan하는데, 나는 하나 또는 특정 repo만 읽어 오면 된다고 하면, Behaviours 아래 Add 선택 후 --- Repositories --- 아래의 Filter by name (with wildcards) 를 선택하여 설정하면 된다.
PR 작성 유저 정보나 commit한 유저 정보를 committer에서 가져오면 Github Enterprise 라고 되어버려서 author 정보를 가져올 수 있게 Behaviours 에서 다음과 같이 설정해줬다.
Scan Organization Triggers 에서 Interval을 적절히 조절한다.
Orphaned Item Strategy 에서 Days to keep old items 에 적절한 값을 입력한다.
Child Scan Triggers 도 마찬가지로 Interval을 적절히 조절한다.
4. Project를 생성하면, 정해진 하위 repo, 정해진 branch에서 Jenkinsfile 파일을 찾아 child 프로젝트로 등록한다.
그 child project에 들어가면 branch와 PR에 대한 탭으로 나뉘어져 볼 수 있다.
5. 따라서 이제 원하는 repo, 원하는 branch에 Jenkinsfile만 생성하면 된다.
저는 간단히 Dockerfile을 관리하는 repo를 예시로 Jenkinsfile을 생성해본다.
GitHub에서의 설정
잘 동작하는 걸 봤다면, GitHub에서 pr을 commit 하기 전에 반드시 성공해야 하도록 설정해보자. 해당 repo의 Settings 탭에서 Branches 메뉴 선택하고 Branch protection rules을 다음과 같이 추가한다.
Branch name pattern은 master 라고 적었다 (저는 master만 사용할 예정이라)
거기에 Include administrators 를 체크하면 어드민(여기서 누구를 어드민으로 보는지는 별도 확인해보자)까지들도 이 규칙을 지켜야 하므로, 누구도 pr을 생성하지 않고는 push가 되지 않는다.
구글링을 좀 해보니 다수의 글들이 pre-push hook을 사용하는 것 같았다. 예전에는 그랬나봐.. 하지만 이제는 GitHub에서 해당 기능을 UI로 제공하는 듯!
VS Code에서 push 시 오류 메시지는 다음과 같다.
> git push origin master:master
> git show --textconv :trivy/Dockerfile
> git ls-files --stage -- C:\work\github-company\docker\trivy\Dockerfile
> git cat-file -s 2b1b3ce61a7674002c3e10d2d9bc502fe5d7d579
remote: error: GH006: Protected branch update failed for refs/heads/master.
remote: error: Required status check "continuous-integration/jenkins/pr-merge" is expected.
'Tech' 카테고리의 다른 글
Kubernetes 에서의 deployment 전략 (0) | 2021.05.05 |
---|