지난 포스팅에서 gitlab에 push하면 hook을 따와서 jenkins에서 gitlab의 소스코드를 받아와서 build하는 것을 했다. 그러면 다음으로는 docker image를 만드는 것이다.
지금 EC2 위에는 docker가 있고, docker 내부에 jenkins를 올려두었고, jenkins에서 docker image를 작성하려면 1) jenkins 내에 docker를 깔던가, 2) jenkins에서 docker로 접속할 수 있는 방법을 만들던가 2가지 방법이 있다. 나는 2)를 택하고자 한다.(jenkins bash에서 docker로 접속할 수 있게)
https://skyblue300a.tistory.com/14
1. Jenkins에서 docker로 접속하기
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25fde056e42c jenkins/jenkins:lts "/sbin/tini -- /usr/…" 8 hours ago Up 17 minutes 50000/tcp, 0.0.0.0:8081->8080/tcp jenkins-compose
docker ps를 입력해서 jenkins container ID를 받아온다.
$ docker exec -it 25fde056e42c bash
root@25fde056e42c:/#
exec -it bash 명령어를 이용해 jenkins container bash로 들어간다.
root@25fde056e42c:/# ssh-keygen -t rsa
jenkins에서 keygen을 하고, ec2에서 이 key를 인증하게 할 것이다. 위처럼 jenkins container bash 내에서 ssh-keygen을 하면, /compose/.ssh 폴더 내에 id_rsa, id_rsa.pub가 생성된다. (지금은 jenkins container와 binding mount를 했기 때문)
root@25fde056e42c:/# cat /root/.ssh/id_rsa.pub
exit
이 값을 복사하고 exit를 이용해 ec2로 돌아가자.
$ vim ~/.ssh/authorized_keys
~/.ssh/authorized_keys에 방금 복사한 id_rsa.pub 값을 붙여넣는다. 의미하는 것은, jenkins container에서 ec2로의 접속을 허가한다는 이야기이다.
$ docker exec -it 25fde056e42c bash
root@25fde056e42c:/# ssh ec2@$(/sbin/ip route | awk '/default/ { print $3 }')
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
16 package(s) needed for security, out of 18 available
Run "sudo yum update" to apply a
$
ssh를 이용하면, jenkins bash에서 ec2로 접속할 수 있게 된다.
2. build 이후에 image 생성
jenkins - project - 구성 - build - execute shell
이 shell에 방금 입력한 명령어를 통해 jenkins에서 ec2로 접속하고, docker image를 build하고 docker hub에 push하게 할 것이다. shell은 아래와 같다.
ssh -t -t ec2-user@$(/sbin/ip route | awk '/default/ { print $3 }') <<EOF
cd /home/ec2-user/compose/jenkins/workspace/test1
docker build -t {내 docker id}/composetest .
docker login -u {내 docker id} -p {내 docker pw}
docker push hyelie/composetest
exit
EOF
jenkins와 ec2가 binding mount되어 있기 때문에 이러한 것이 가능하다.
와! docker hub에 내가 만든 image가 push되어 있는 것을 볼 수 있다.
그러면 아래의 flow가 완성된다.
(1) local에서 작업 - gitlab에 push
(2) gitlab에서 hook 발생 - jenkins에서 gitlab의 소스코드 clone 이후 build
(3) jenkins에서 image build, docker hub에 push
이후에는, main server에서는 docker hub의 image를 받아와서 container를 실행할 수 있을 것이다.