[CI/CD] Jenkins + Git 으로 CI/CD 환경 구축하기 [2/2]

minujana
6 min readJun 24, 2021

지난 포스팅에서 인스톨을 마쳤으니 이번엔 본격적으로 CICD환경 구축을 위해서 연동을 해보도록 하겠다. 먼저 Gitlab을 연동하기 위해서 Jenkins에 관련 plugin을 설치해주자

1. Gitlab Plug-in Install

Jenkins 메뉴중 Jenkins 관리 → Plugin Manager → Available 탭으로 가보면 Gitlab을 검색하고 해당 플러그인을 다운받아주자

다운받아주면 아래와 같이 Jenkins 관리 → 시스템 설정 페이지의 중간쯔음 아래와 같이 Gitlab 관련 설정을 기입할 수 있는 항목이 추가되어진걸 볼 수 있다.

각 항목을 본인 환경(?)에 알맞게 채워 주도록하자.

Connection name: 각자 원하는 이름으로 설정
Gitlab host URL: 깃랩 서버의 url을 기입
Credentials: 깃랩 서버로 부터 받은 API token 정보를 기입

Credentials 부분을 채워 넣기 위해 깃랩에서 토큰을 발급받아와야한다.

Gitlab에서 위와 같이 Settings → Access Tokens에서 토큰을 발급받자. 토큰을 생성하면 위에 New access token이라고 하면서 값이 뜨는데 복사해주자

다시 Jenkins로 넘어와서

Credentials 를 add 해주자. Kind 항목 중에 Gitlab API token으로 설정하면, Scope, API token, ID, Description 등이 있는데 API Token에 좀 전에 복사한 토큰값을 넣어주고, ID는 gitlab이나 jenkins의 계정이아니고 해당 Credential의 이름이라고 생각하면 된다. 적당히 입력해주자

추가한 후, 해당 토큰으로 선택하고 Test Connection 해보면, Success 메세지를 확인할 수 있다.

2. Gitlab-Jenkins Webhook 연동

이전 과정을 통해서 Gitlab과 연동을 성공적으로 시켜 놓은 후, 이제 Jenkins에 Pipeline을 하나 만들어본다. Pipeline이 아니라 Project로 만들어도 괜찮다. 어떤 아이템이든 일단, 생성하자 webhook을 연동하는 방법을 설명하기 위해서이다. (webhook 연동을 위해… 포스팅이 많이 늦어졌다.)

생성을 진행하고, webhook 연동을 본격적으로 하기전에 몇가지 옵션을 확인해보자.

우선, Kubernetes 상에서 Gitlab 파드와 Jenkins 파드가 같은 노드에 떠있는 상황이 생길수있다. 지금의 나도 처음에 그랬다….

Gitlab은 기본적으로 로컬네트워크로의 트래픽을 막아놓는다고 한다. 따라서 파드가 같은 노드에 뜨는 상황을 가정하여 이 부분을 허용해주도록 하자.

Gitlab의 메뉴의 admin area → Settings → Network → Outbound requests

요로케 허용하도록 설정해주자

다시 Jenkins에서 아까 만든 item에서 구성(Settings) 부분을 들어가서 중간부분에 Build Triggers에서 Webhook을 통해서 Build 유발을 하는 옵션을 체크하자. 그리고 그 옵션에 적혀있는 URL을 복사해두자

그리고 고급(Advance)을 눌러보면Secret Token이 있는데 생성해주고 해당 값도 복사해주자.

거의 다 왔다….

이 복사한 값을 가지고 다시 Gitlab으로 가보자.
Gitlab에 우리가 코드를 빌드할 Project하나 생성하고, 해당 ProJect의 Settings 로 가보면 Webhooks 이란 탭이있다. (admin area의 settings와는 다르다 Project별로 있는 settings로 가야한다)

앞서 Jenkins에서 복사해온 URL과 Secret token을 기입해준 후, 아래에 Add webhook을 해주면 연동자체는 끝난다.

추가해준 후, Test를 해보면 나의 경우 정말 무지막지한 에러가 계속 발생했다. 이런 저런 커뮤니티에 보고된 이슈와 솔루션을 다 참고해봤지만, 나에게 적합한 거는 없었다…. 500 떴다가 404 떴다가 403 떴다가 하면서 에러 코드만 바뀌고 해결이 되지는 않았다.

결론적으로 이게 왜 해결책인지는 모르지만, 만약 나와 같은 경우라면 Tets에서 실패하는건 무시하고 ProJect에 뭔가 file을 하나 commit 해보길바란다.

Jenkins에 생성한 Job에 남은 Build History

#2가 그냥 한번 생성했을 때 저절로 Webhook이 동작하여 Jenkins가 작동한 히스토리이다. 한번 저렇게 작동을 하고나니 거짓말 처럼 계속 실패했었던 Test가 성공하더라..

실패할 때에는 저기 파란박스에 빨간 박스로 HTTP 500, 404, 403 과 엄청난 로그들이 남았다.

내 개인적인 생각으로는 Project 자체가 비어있기 때문에 Test에 실패한 거 같다고 생각한다. (이 GitLab Project를 다른 Item에 연동 시켰을 때는 바로 Test에 성공한 것으로 보아…)

pipe-2 라는 이름으로 새로 아이템을 만들고, 위 Gitlab Project에 연동하니 Test할 때 바로 성공이 됬다. #1이 Test로 인하여 유발된 빌드 히스토리이다.

3. Jenkins — Kubernetes Plug-in

Jenkins가 Container가 아니라 Local Server에 데몬 서비스로 구축이 되어있다고 한다면, 서버에서 사용하는 명령어로 바로 pipeline을 작성하면 되지만, Pod로 떠있기 때문에 온갖 명령어가 사용이 안된다. 게다가 Kubernetes에 접근을 바로 할수도 없다. 그러니 플러그인들을 다운받자.

뭐가 필요할지 몰라 이용가능한 플러그인 중에서 Kubernetes로 시작하는 플러그인을 전부 받았다.

Kubernetes와 연동하여 파이프라인 수행을 k8s cluster 상에 하는 방법은 따로 포스팅에서 다뤄야할 분량으로 보여 우선 Jenkins + Gitlab을 이용한 CI/CD 환경 구축은 여기까지 마무리짓겠다.

--

--