build docker service with jenkins

build docker service with jenkins

이전 포스트 에서 docker registry, service 그리고 stack 에 대해서 알아보았다.
docker private registry
docker swram service
docker stack
이제 jenkins를 사용하여 효과적으로 빌드하는지 알아보려한다. 물론 주관적인 필자의 생각이다.

Managed Scripts

docker swarm 의 service들을 효과적으로 배포하기위해서 shell script를 적극적으로 사용하여 로직구성을 해야되겠다는 판단이 들었다.
jenkins의 plugin 중 Managed Scripts 에 관한 정보는 이전포스트 jenkins로 배포하기 - nodejs-2 를 참고하자.
일단 전체적인 프로세스는 다음과 같다.

  1. 배포하고자하는 프로젝트에 Dockerfile 을 생성한다 ( dockerize )
  2. 형상관리( git ) 에 변경사항 반영한다.
  3. empty 프로젝트를 기반으로 service를 생성한다 ( service update를 위해 )
  4. jenkins에서 build 시 Dockerfile을 기반으로 image build를 시작한다.
  5. build 된 image를 docker private registry에 push 한다.
  6. docker private registry에 push된 image를 기반으로 service update한다.

empty image service 를 생성후 jenkins 에서 service 를 update 를 하는 이유는, service update시 stack에 구성된 환경설정은 그대로 유지되고 image만 교체되기때문에 stack에 정의된 같은 환경으로 구성된 service들과의 동일 설정정보를 항상 유지할수있는 이점이 있어서다.

build

docker stack은 다음과 같이 작성하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
version: "3.5"
networks:
net:
driver: overlay
attachable: true
services:
# ... other services here
backend:
image: setyourmindpark/debian-node:8
ports:
- 4000:4000
environment:
- TZ=Asia/Seoul
networks:
- net
tty: true
deploy:
replicas: 3
placement:
constraints:
- node.labels.type == backend
# ... other services here

1
$ docker stack deploy -c service-stack.yml setyourmindpark_service

위에서 언급한 프로세스의 shell script를 다음과 같이 작성하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# env ------------------------------------------------------------------------------------------------------------------------
DOCKER_REGISTRY_PROTOCOL=https
DOCKER_REGISTRY_DOMAIN=setyourmindpark
DOCKER_REGISTRY_PORT=5000
DOCKER_REGISTRY_USER=setyourmindpark
DOCKER_REGISTRY_PASSWD=0000
APP_NAME=setyourmindpark_backend
SERVICE_NAME=setyourmindpark_service_backend
APP_VERSION=`date +"%y%m%d%H%M%S"`
# build ------------------------------------------------------------------------------------------------------------------------
docker build --tag $APP_NAME:$APP_VERSION .
docker login -u $DOCKER_REGISTRY_USER -p $DOCKER_REGISTRY_PASSWD $DOCKER_REGISTRY_DOMAIN:$DOCKER_REGISTRY_PORT
docker tag $APP_NAME:$APP_VERSION $DOCKER_REGISTRY_DOMAIN:$DOCKER_REGISTRY_PORT/$APP_NAME:$APP_VERSION
docker push $DOCKER_REGISTRY_DOMAIN:$DOCKER_REGISTRY_PORT/$APP_NAME:$APP_VERSION
docker rmi -f $APP_NAME:$APP_VERSION
docker rmi -f $DOCKER_REGISTRY_DOMAIN:$DOCKER_REGISTRY_PORT/$APP_NAME:$APP_VERSION
docker service update \
--image $DOCKER_REGISTRY_DOMAIN:$DOCKER_REGISTRY_PORT/$APP_NAME:$APP_VERSION \
--with-registry-auth \
$SERVICE_NAME

최종 build 결과는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
overall progress: 0 out of 3 tasks
1/3:
2/3:
3/3:
overall progress: 0 out of 3 tasks
overall progress: 1 out of 3 tasks
overall progress: 2 out of 3 tasks
overall progress: 3 out of 3 tasks
verify: Waiting 5 seconds to verify that tasks are stable...
verify: Waiting 4 seconds to verify that tasks are stable...
verify: Waiting 3 seconds to verify that tasks are stable...
verify: Waiting 2 seconds to verify that tasks are stable...
verify: Waiting 1 seconds to verify that tasks are stable...
verify: Service converged
Finished: SUCCESS

정상적으로 service 배포가되었는지 확인해보자.

1
2
3
4
5
6
7
8
9
$ docker service ps setyourmindpark_service_backend
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
l27yump8rk60 setyourmindpark_service_backend.1 setyourmindpark:5000/setyourmindpark_backend:180213123413 backend1 Running Running less than a second ago
ksblqm51aqne \_ setyourmindpark_service_backend.1 setyourmindpark/debian-node:8 backend1 Shutdown Shutdown less than a second ago
p7a28d4rq4t3 setyourmindpark_service_backend.2 setyourmindpark:5000/setyourmindpark_backend:180213123413 backend1 Running Running less than a second ago
2qv9ll1qmz2q \_ setyourmindpark_service_backend.2 setyourmindpark/debian-node:8 backend1 Shutdown Shutdown less than a second ago
tlbf6gdgijvv setyourmindpark_service_backend.3 setyourmindpark:5000/setyourmindpark_backend:180213123413 backend1 Running Running less than a second ago
iy5l21fe264l \_ setyourmindpark_service_backend.3 setyourmindpark/debian-node:8 backend1 Shutdown Shutdown less than a second ago

정상적으로 update 되었다.

참고

dockerize란 배포하고자 하는 프로젝트를 image화 하는 작업이라 지칭한다.
필자는 dockerize 구성을위한 환경 nodejs 환경기반으로 배포진행하였으며 프로젝트 참고는 다음과 같다.
https://github.com/setyourmindpark/nodejs-skeletone-v3