https://tape22.tistory.com/16?category=928488
위 포스팅을 많이 참고했다.
1. EC2에 Docker, docker-compose
지난 포스팅에서 VS Code로 linux EC2에 접근했다. Ctrl + `를 눌러서 docker를 EC2에 설치하자.
$ sudo yum install docker
$ sudo dockerd
이후에 docker ps를 치면 에러가 난다.
$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
권한을 준다.
$ sudo chmod 666 /var/run/docker.sock
그러고 docker ps를 눌러서 확인해 보자.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
잘 된다!
다음으로 docker-compose도 설치하자.
$ sudo curl -L https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.26.2, build eefe0d31
docker-compose도 설치되었다.
2. Docker 위에 Jenkins 설치
docker-compose.yml을 이용해서 Jenkins를 설치해 보자. compose 폴더 안에 docker-compose.yml 파일을 생성하자.
home/ec2-user/compose/docker-compose.yml
version: "3"
services:
jenkins:
container_name: jenkins-compose
image: jenkins/jenkins:lts
user: root
ports:
- "8081:8080"
volumes:
- /home/ec2-user/compose/jenkins:/var/jenkins_home
- /home/ec2-user/compose/.ssh:/root/.ssh
간단하게 설명하자면, image는 jenkins/jenkins의 lts 버전을 가져오고, port는 외부 접속 8081 포트를 내부 8080으로 바꾸어주겠다는 말이다. 그리고 volume같은 경우에는 container에서 작업한 것을 ec2의 local에 남길 수 있도록 bind mount를 해 주겠다는 말이다(volume을 사용할 수도 있긴 하지만 spring build 결과물인 .jar 파일을 직접 보기 위함이다. 단순 docker image 생성을 위해서는 docker volume을 사용하는 것이 더 좋을 것이다. 왜냐하면 bind mount의 경우에는 여러 container가 동시에 한 directory에서 read/write를 할 경우에는 오류가 생길 수도 있기 때문이다.)
다음으로 해당 docker-compose 파일을 실행하자.
$ cd compose
$ docker-compose up -d
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25fde056e42c jenkins/jenkins:lts "/sbin/tini -- /usr/…" 7 seconds ago Up 6 seconds 50000/tcp, 0.0.0.0:8081->8080/tcp jenkins-compose
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jenkins/jenkins lts 22bfa28ae34c 2 weeks ago 572MB
해당 container가 실행 중인 것을 볼 수 있다. 보면 외부 포트 8081번을 내부 8080/tcp로 바꾸어 준다는 port가 보인다. 그러면 jenkins로 들어가 보자.
EC2의 public IPv4 주소를 확인하자. 나의 경우에는 3.137.180.8이다. jenkins 포트는 8081로 지정했으니 3.137.180.8:8081을 주소창에 입력해 보자.
EC2 terminal에서 아래 명령어를 입력해서 비밀번호가 뭔지 보자.
$ docker ps
$ docker logs {CONTINER_ID}
...
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
a00899eec879436688661d36ebc74d23
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
*************************************************************
이렇게 나온다. 이 비밀번호를 바로 위의 사진 창에 입력하면 plugin 설치 창으로 간다.
install suggested plugins를 눌러서 추천하는 plugin을 일단 모조리 깔고 보자.
그러면 이런 창이 뜨는데, 대충 입력하자.
그러면 홈화면이 뜬다! Jenkins 관리 - 플러그인 관리 - 설치 가능으로 들어가서 추가로 3개의 plugin을 설치하자.
- GitLab Plugin : GItLab에 있는 정보를 받아오기 위함.
- GitLab hook Plugin : GitLab의 hook을 받아오기 위함.
- SSH : docker 위에 올린 jenkins에서 docker로 접근하기 위함.
install without restart를 눌러서 설치하자.
3. Jenkins와 GitLab 연동
gitlab과 jenkins를 연동하는 방식은 아래 두가지 방식이 있다.
- gitlab id/pw를 등록하는 방식
- ec2 ssh 공개키/비밀키로 접속
그러나 보안상의 문제로 아래의 방법을 택하려 한다.
1) EC2 SSH 키 생성
docker-compose 를 실행한 후에 compose 파일에는 .ssh 폴더가 생성되어 있다. 왜냐하면 docker-compose에서 binding mount를 compose/.ssh로 생성했기 때문이다. 이 .ssh 폴더에서 ssh keygen을 할 것이다.
/home/ec2-user/compose/.ssh
ssh-keygen
그러면 home/ec2-user/.ssh에 id_rsa, id_rsa.pub 2개의 파일이 생성된다.
2) GitLab에서 SSH 키, webhook 등록
앞에서 생성했던 2개 파일 중 id_rsa.pub를 열어서 복사하자. 이후 gitlab으로 들어가자.
project - settings - repository로 들어가자.
이름은 대충 아무렇게나 두고, 아까 복사했던 id_rsa.pub 파일을 복사해서 넣자.
3) Jenkins에 Credential SSH 키 등록
다음으로 id_rsa에 있는 내용을 복사해서 jenkins로 가보자.
jenkins 관리 - manage credentials - global - add credentials - ssh username with private key
add credential을 누르자.
이후에 입력은 다음을 따라간다.
id, username은 아무렇게나, private key는 아까 복사한 id_rsa 내부 값을 복사한다.
4) Gradle 버전 설정
springboot를 사용하기 때문에 gradle 버전을 설정해 주어야 한다. 내 로컬에서 gradle 버전은 6.9를 사용하기 때문에 6.9에 해당하는 gradle 버전을 저장하자.
5) gitlab webhook 등록
gitlab settings - webhook으로 들어가서 url을 작성하자.
url은 아래와 같은 양식을 따른다. 맨 마지막 /는 붙여 주어야 한다.
http://{jenkins 주소}/github-webhook/
http://3.137.180.8:8081/github-webhook/
add webhook하고, 하단으로 내려 test - push event를 눌러보면 잘 실행되었다는 결과가 나올 것이다. 만약 잘 되지 않는다면 다음 게시글을 참고하자. 나는 잘 되지 않아서 다른 방식을 사용했다.