본문 바로가기
Web/CICD

[CI/CD] Jenkins + Docker + Gitlab 연동

by 정고정 2021. 12. 22.
반응형

Docker 설치

https://docs.docker.com/get-docker/

 

Get Docker

 

docs.docker.com

OS에 맞는 도커를 설치한다. 설치 후  Docker Desktop 바로 실행이 안 되면 재부팅 한 번 해야 한다.

도커 버전 확인해서 잘 설치되었는지 체크하기

docker --version

Docker 설치 확인

 

Docker hub

회원가입도 하고 젠킨스 이미지도 다운받을 거다. 

 

https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

We and third parties use cookies or similar technologies ("Cookies") as described below to collect and process personal data, such as your IP address or browser information. You can learn more about how this site uses Cookies by reading our privacy policy

hub.docker.com

Docker Desktop을 실행하고, Docker hub 계정으로 미리 로그인해 준다. 

Docker hub에 jenkins를 검색하면 젠킨스 컨테이너가 주루룩 뜬다.  

젠킨스 이미지를 다운 받아야 하는데, official image 딱지가 붙은 건 더 이상 사용하지 않는 DEPRECATED가 붙어 있다. 

현재는 jenkins/jenkins로 받아야 한다. 

 

cmd에 다음 두 명령어 중 하나를 골라서 입력해 준다.

첫번째는 21.12.12 현재 기준 jdk11로 설치되고, 두 번째는 jdk8로 설치된다. 

추후 jenkins에서 gitlab용 ruby-runtime 플러그인을 설치해야 한다면 jdk8로 설치해야 한다. 

docker pull jenkins/jenkins:lts
docker pull jenkins/jenkins:lts-jdk8

 

두번째 걸로 이미지를 받고, 도커 컨테이너를 생성해서 실행해 준다.

docker run -d -u root -p 9090:8080 --name=jenkins jenkins/jenkins:lts-jdk8

name은 jenkins, port는 9090으로 잡았다. 

 

Docker Desktop

Docker Desktop으로 가보면 다음과 같이 jenkins container가 실행되는 걸 볼 수 있다. 

여기서 해당 컨테이너의 cli를 띄우거나 log를 확인할 수 있다. 브라우저로 직통연결되는 버튼도 여기 있음. 

 

해당 포트의 localhost로 접속하면 admin비밀번호를 입력하라고 뜬다.

비밀번호는 Docker Desktop에서 컨테이너를 클릭하면 뜨는 로그 창에서 확인할 수 있다. 

cmd 창에서도 로그를 확인할 수 있다. 

docker logs jenkins

파란색 부분에 있는 비밀번호를 복사해다가 넣어 준다. 

recommend plugin을 설치할 거냐 직접 고를 거냐 물어보는데 일단은 추천하는 플러그인만 설치해 준다. 

그러면 컨테이너를 열어 준 9090포트로 접속했을 때 젠킨스 페이지가 잘 열린다.

pipeline_test는 좀 이따 추가할 거임 첨엔 암것도 안 뜬다

 

나중에 로그인할 때는 사용자 이름에 admin치고 방금 친 그 비밀번호 쳐 주면 로그인할 수 있다. 

그게 싫다면 처음 로그인할 때 따로 계정을 만들어 놓거나 http://localhost:9090/securityRealm/에서 사용자 생성으로 새 계정을 만들어 주면 됨.

 

Jenkins Plugin

젠킨스에서 gitlab과 blueocean, nodejs 관련 플러그인을 추가로 설치해 준다.

http://localhost:9090/pluginManager/available

그냥 gitlab이랑 blueocean, nodejs를 각각 검색해서 전부 설치해 준다. 

 

 

Jenkins와 gitlab 연동

연동을 위해서는 gitlab에서 personal access token을 발급받을 필요가 있다.

사용하는 gitlab의 profile > access token으로 들어가서 새 토큰을 발급받는다.

scope는 api만 해도 충분히 돌아간다. 난 더 해줌.

token을 복사해서 잘 간직해 둔다.

http://localhost:9090/configure

다시 젠킨스로 돌아와서 gitlab을 세팅해준다.

 

!(21.12.28-)Gitlab Personal Access Token말고 GitLabAPIToken으로 발급받는 법 찾는 중

 

설정창에는 gitlab이 두 군데 있다. 

원래는 위에 있는 gitlab에서 Gitlab API Token을 발급해서 쓰는 게 맞는 것 같은데 거기다 썼더니 testConnection이 ERROR밖에 안 떠서 server단에 세팅함.

server url은 gitlab주소를 적어주면 되고, credential의 경우 add 버튼을 누르면 인증을 등록할 수 있는 창이 뜬다. 

Credential Provider

 Kind는 Gitlab Personal Access Token으로 잡아 주고, Token에는 아까 gitlab에서 발급받은 access token을 복붙한다.

ID에는 gitlab 계정을 적어주면 된다.

만일 Kind에 Gitlab Personal Access Token이 없다면 플러그인 설치창으로 가서 gitlab을 다시 검색해 보자... 아마 아직 설치 안 된 플러그인이 있을 것... 

Add를 눌러 등록하면 드롭다운에서 해당 credential을 선택할 수 있다.

TestConnection을 눌러서 제대로 연결되는 걸 확인한 다음 저장 버튼을 눌러 준다. 

Test connection: Credentials verified

 

그리고 깃랩 토큰발급 화면으로 가 보면 해당 토큰이 방금 사용되었다는 표시가 떠 있다.

 

 

Nginx 설치, Docker 연동

Docker로 Nginx 정적 웹서버를 설치해 줘야 함. 

먼저 편한 곳에 배포파일이 들어갈 폴더인 dist를 적당히 생성해 준다. vue 빌드하면 생기는 dist폴더를 그냥 써도 된다. 

docker run --name nginx -d -p 80:80 -v ${dist폴더 절대경로}:/usr/share/nginx/html nginx

무조건 절대경로로 적어줘야 한다. 상대경로로 적으면 dist폴더를 제대로 인식하지 못한다. 

이미지 없으면 알아서 pull해 온다. 

설치가 끝나면 Docker Desktop에서 nginx 컨테이너를 확인할 수 있다.

9090포트에서는 jenkins가, 80포트에서는 nginx가 돈다.

dist 폴더에 index.html파일이 존재하지 않았다면 nginx 기본 페이지가 뜬다.

http://localhost:80

docker cli로 docker 안에 들어가서 usr/share/nginx/html 경로로 타고 가면 있는 html파일 내용이 뜬다.

근데 만약 dist 폴더 안에 우리가 만든 index.html이 존재했다면, 다음과 같이 우리가 만든 index.html이 뜬다. 

http://localhost:80

 

여기까지하면 연동은 다 됐다...

근데 깃랩이랑 젠킨스로 삽질하면서 의문 좀 생김

 


 

의문1 - 해결...

젠킨스는 jdk11을 권장하고 있고, jenkins/jenkins:lts로 컨테이너를 돌리면 jdk 11로 돌아간다. 

깃랩은 ruby on rails 기반이고, 얘를 젠킨스랑 연동하려면 jenkins-gitlab-hook 플러그인이 필요함

근데 이 깃랩 훅이 ruby-runtime에 의존하고 있다. 

https://github.com/elvanja/jenkins-gitlab-hook-plugin

 

GitHub - elvanja/jenkins-gitlab-hook-plugin: Enables Gitlab web hooks to be used to trigger SMC polling on Gitlab projects

Enables Gitlab web hooks to be used to trigger SMC polling on Gitlab projects - GitHub - elvanja/jenkins-gitlab-hook-plugin: Enables Gitlab web hooks to be used to trigger SMC polling on Gitlab pro...

github.com

 

그러면 상식적으로 ruby-runtime 플러그인도 jdk11을 지원해야 하지 않나 싶어서 찾아보니까

 

https://plugins.jenkins.io/ruby-runtime/

 

ruby-runtime

Hosts runtime for enabling pure-Ruby plugins

plugins.jenkins.io

16년도가 마지막 릴리즈라 jdk11 지원 안 하나 봄... 8이라도 지원해주는 게 어디임

 

의문2

왜 젠킨스에서 credential 발급할 때 gitlab에서 API token으로 받는 게 아니라 gitlab server에 personal access token으로 받아야 test connections 돌아감..?

다른 레퍼런스나 블로그에서는 gitlab에서 API token으로 설정하던데 계속 도커에 이런 오류가 떴다.

그래서 정말 별 조합 다 시도해보다가 다른 분께서 gitlab server 쪽에서 personal access token으로 credential 발급받으면 connection 정상적으로 연결된다고 하심... 근데 왜 이건 안 되고 쟤는 되는지 잘 모르겠다.  

의문1이랑 비슷하게 깃랩이랑 관련된 건 확실한데 깃랩 진짜 알 수 없음... 

반응형

댓글