GITLAB - CI/CD 과정에서 아래와 같은 과정을 자동화하기 위한 과정을 진행했다.

sudo su -
cd 배포하고 싶은 프로젝트 들어가기
git pull
docker build -t 이름 . 
docker images
docker stop 기존 container_id
docker run <project 이름> <new version>


순서대로 설명해보면 다음과 같다.

1. 프로젝트 생성 
2. Dockerfile을 해당 프로젝트에 포함시켜서 GitLab에 push
3. GitLab에 환경변수 추가
4. gitlab-ci.yml 파일 작성
5. yml 파일을 바탕으로 GitLab runner가 파일 빌드
6. 빌드 결과물로 image가 container registry에 생성
7. 해당 이미지를 docker pull을 통해 내려받기
8. docker run으로 띄우기


문제는 프로젝트가 수정될 때마다 GitLab에 push후, 위의 5~8과정을 매번 진행해야 한다.

이 과정을 자동화하기 위해 crontabdeploy.sh 스크립트를 이용하여 한 번에 처리할 수 있도록 해보겠다.


crontab

  • 리눅스 운영체제에서 배치 작업을 스케줄링 하기 위한 프로그램

  • 특정 시각에 작업이 실행되게끔 할 수 있으며, 정기적인 작업 스케줄링 진행도 가능

deploy.sh

  • 프로젝트 변경 후 push할 때마다 Gitlab runner가 빌드한 해당 프로젝트 image의 상태를 확인

  • 프로젝트가 수정되었다면, 기존 docker container를 내리고, 새로운 docker container를 띄우는 과정을 포함한 스크립트


crontabdeploy.sh 를 활용하면, deploy.sh스크립트에 기록한 과정을 특정 시각마다 진행하게끔 할 수 있다.


crontab


crontab -e를 통해 crontab이 실행할 작업을 수정한다.

*/20 * * * * sh /home/ubuntu/deploy.sh >> /home/ubuntu/deploy.log
  • 20분마다 /home/ubuntu/ 경로에 있는 deploy.sh파일을 실행하고, 해당 로그를 /home/ubuntu경로에 있는 deploy.log파일에 저장한다.


deploy.sh


sudo su -
cd /home/ubuntu/
vim deploy.sh

과정이 간단해 보이지만 매우 중요하다!!!

권한과 저장해야 하는 경로를 제대로 설정하지 않으면, 자동 배포가 진행되지 않는다.

반드시 관리자 권한인 상태에서, /home/ubuntu/ 경로에서 스크립트 파일을 만들어야 한다.

그 이유는, docker 설치를 관리자 권한인 상태에서 진행했다.

그리고, deploy.sh 파일 내용엔 docker container 를 내리고, 다시 띄우는 과정이 포함되어 있다.

그렇기 때문에, deploy.sh 파일에 저장되어 있는 내용을 실행하려면 docker가 인식할 수 있는 권한과 경로에서 진행되어야 한다.

나의 경우, 프로젝트 수정 후, GitLab runner가 빌드한 docker image가 변경되어 새롭게 container를 띄우고자 할 때, 기존 container가 내려가는 과정부터 진행되지 않는 일이 벌어졌으니 반드시 주의하기 바란다.


다음으로, deploy.sh 파일에 아래와 같은 스크립트를 입력한다.

#project name
PROJECT_NAME=likelion_hospital_visit_project


#!/bin/bash    
set -ex

docker pull registry.gitlab.com/percyfrank/$PROJECT_NAME:latest | grep "Image is up to date" && pull_status="already_pulled" || pull_status="newly_pulled"

echo $pull_status

if [ "$pull_status" = "newly_pulled" ]; then
        docker stop <컨테이너 이름>
        docker rm -f <컨테이너 이름>
        docker run -p 8080:8080 --name <컨테이너 이름> \
        -e SPRING_DATASOURCE_URL=jdbc:mysql://<ec2 주소>:3306/<DB 스키마명> \
                -e SPRING_DATASOURCE_PASSWORD=<password> \
                -e JWT_TOKEN_SECRET=<token> \
                -d registry.gitlab.com/percyfrank/$PROJECT_NAME \
                docker image prune -f
fi


이제 프로젝트를 변경 한 뒤, GitLab에 push하면,

1


새로운 image 빌드가 Pipeline을 통해 진행되고, 해당 과정이 성공적으로 끝나면, docker images를 통해, 새로운 이미지가 생성된다.

2


이후에, deploy.sh 파일 내용이 실행되면서 스크립트 마지막 내용의 새로운 container가 띄워졌는지 확인한다. docker ps -a를 확인하면 새로운 컨테이너가 생성되었다.

3


cat deploy.log를 통해 우리가 crontab에 작성한 과정이 로그에 기록되는지 확인한다.

5


그리고, crontab에 의해 새 프로젝트가 띄워져 있는지 확인한다. 아래 그림에서 빨간 밑줄이 프로젝트에서 변경한 코드이다. 해당 로그가 찍히는지 확인한다.

4


Talend API를 통해 호출하고, docker logs hospital-review 명령어를 통해 해당 로그가 찍히는지 확인한다.

image

Leave a comment