반응형

GitLab, Linux Crontab을 활용한 CI/CD 파이프라인 구축 개념

  1. GitLab에 프로젝트 업로드 (Github와 같다고 생각하면 됨)
  2. GitLab, AWS EC2, Docker을 활용해 서버 배포
  3. GitLab에 수정사항이나 추가사항 push
  4. GitLab에서 프로젝트 빌드까지 진행
  5. 빌드가 완료되면 AWS EC2에 접속하여 기존의 서버 중지
  6. 다시 GitLab 프로젝트를 pull 받고 다시 배포
  • 4번 과정은 세팅을 통해 GitLab에서 자동으로 진행시킴
  • 이제 5, 6번 과정까지 자동화 한다면?
    • 수정사항이나 추가사항을 GitLab Repository에 push만 해주면 빌드 후 재배포까지 자동으로 진행 됨
    • CI/CD Pipeline 구축에 성공한 것
    • 5, 6번 자동화는 Linux Crontab 활용

GitLab을 활용한 서버 배포

  1. GitLab에서 프로젝트 생성
  2. Local에서 생성한 프로젝트 연결 및 push (방법은 깃헙과 같으니 설명 생략)
  3. 우측 탭의 Settings -> CI/CD
  4. Variables -> Add variable 클릭
  5. 여기서 추가한 variables는 Project의 환경변수와 같이 사용 가능, 보안에 필요한 GITLAB_USER, GITLAB_PASSWORD나 PROJECT_NAME 등을 아래와 같이 등록 (Mask Variable 체크, variable 값은 모두 소문자로 작성)

  6. 프로젝트에 Dockerfile 추가 => https://chb2005.tistory.com/189 참고
  7. 우측 탭의 CI/CD -> Editor -> Configure pipeline에 아래의 코드 복붙 후 Commit changes
  • java 11 기준
  • Dockerfile을 통해 gradle build하기 때문에 Dockerfile을 반드시 push
  • 해당 내용은 gitlab-ci.yml에 저장됨
stages:
  - dockerbuild-push

package:
  image: docker:latest
  stage: dockerbuild-push
  services:
    - docker:dind
  before_script:
    - docker login registry.gitlab.com -u $GITLAB_USER -p $GITLAB_PASSWORD
  script:
    - docker build -t registry.gitlab.com/$GITLAB_USER/$PROJECT_NAME .
    - docker push registry.gitlab.com/$GITLAB_USER/$PROJECT_NAME
  after_script:
    - docker logout
  1. 우측 탭의 CI/CD -> Jobs에 가보면 어떤 작업이 실행되고 있거나 완료 되었을 것임 (약 3~4분 정도 소요)
  2. 이 작업이 pass 되면 문제없이 실행 된 것임, 작업이 끝나면 아래와 같이 출력됨

  3. 위 작업까지 끝났으면 이제 AWS EC2에 접속해 Docker을 통해 프로젝트를 서버에 배포해야 함
  4. GitLab 페이지의 우측 탭의 Packages and registires -> Container Registry 에서 아래의 주소를 기억해 둠
  5. EC2 접속 ( EC2 접속 방법은 https://chb2005.tistory.com/188 참고 )
  6. 아래의 명령어를 순서대로 실행, <> 부분은 자신의 환경에 맞게 수정
pullContents=$(docker pull registry.gitlab.com/<위에서 저장해놓은 주소>)

docker run -p 8080:8080 --name <프로젝트 명> -e SPRING_DATASOURCE_URL=jdbc:mysql://<DB 주소>:<PORT>/<DB 명> -e SPRING_DATASOURCE_USERNAME=<DB 유저명> -e SPRING_DATASOURCE_PASSWORD=<비밀번호> -d registry.gitlab.com/<위에서 저장해놓은 주소>
  1. 서버에 잘 올라갔는지 확인
  • 위 스크립트에서 포트번호를 8082로 따로 변경했기 때문에 8082 포트에서 실행되었음

변경사항이나 추가사항 적용 (서버 재배포, 배포 스크립트 활용)

  • 실행중인 Docker Container 삭제 후 프로젝트를 pull 받고 다시 배포해도 되지만, 이번에는 배포 스크립트를 활용해 실행중인 Docker Container 삭제, 프로젝트 pull, 재배포를 진행
  • 또한, 작성한 배포 스크립트는 CI/CD 파이프라인 구성에도 사용됨
  1. 변경사항이나 추가사항을 GitLab Repository에 push
  2. 위에서 정리한대로 파이프라인이 잘 구축되었다면 아래와 같이 GitLab에서 Build 까지 진행될 것임
  3. 다시 EC2 터미널로 돌아와 배포 스크립트 생성
vim [원하는 이름].sh

ex)
vim deploy-gitlab-ci-cd-practice.sh
  1. 아래의 코드에 <> 부분들을 자신에게 맞게 작성 후 붙여넣고 :wq 입력 (저장 후 닫기)
pullContents=$(docker pull registry.gitlab.com/<위에서 저장해놓은 주소>) 

if echo $pullContents | grep "Image is up to date" ; then 
    echo 'Image already up to date' 
    exit 0 
fi 

echo "배포를 시작 합니다." 

docker stop <프로젝트 명>
docker rm -f <프로젝트 명> 
docker run -p 8080:8080 --name <프로젝트 명> -e SPRING_DATASOURCE_URL=jdbc:mysql://<DB 주소>:<PORT>/<DB 명> -e SPRING_DATASOURCE_USERNAME=<DB 유저명> -e SPRING_DATASOURCE_PASSWORD=<비밀번호> -d registry.gitlab.com/<위에서 저장해놓은 주소>
  • 이 스크립트는 배포 뿐만 아니라 gitlab의 수정 내용을 pull 받고 기존의 실행중인 컨테이너를 종료하는 코드까지 포함되어 있음
  • 만약 gitlab에 올라간 이미지가 업데이트 되지 않았다면 "Image already up to date" 출력 후 종료
  • 만약 업데이트 되었다면 기존에 실행중인 컨테이너를 종료하고 다시 배포
  1. 방금 생성한 배포 스크립트 실행
sh [배포 스크립트 명].sh

ex)
sh deploy-gitlab-ci-cd-practice.sh
  • 이 때, GitLab에 변경된 것이 없으면 배포되지 않으니 주의
  1. 변경 사항 확인
    • 처음 배포된 것과 달리 위에 '변경1'이라는 문자가 출력됨으로써, 수정사항을 반영하여 재배포가 성공적으로 된것을 확인할 수 있음

Linux Crontab을 활용한 CI/CD Pipeline 구축 완료

  • GitLab을 활용한 배포와 수정사항을 반영한 재배포까지 완료됨
  • 이제 남은 문제는 수정사항을 반영하려면 EC2에 직접 접속해 배포 스크립트를 실행해야 한다는 것임
  • EC2 터미널에서 Crontab을 설정하여 1분에 한번씩 이 배포 스크립트를 실행시킨다면?
  • GitLab에 수정사항이 없다면 재배포하지 않을 것이고, 수정사항이 있다면 기존 서버를 종료하고 재배포까지 진행해 줄 것임
  • 이 작업까지 완료한다면 GitLab에 push만 해주면 GitLab Build(약 3~4분) + Crontab을 통한 배포(1분에 한 번씩) 과정이 자동화되기 때문에 약 5분 정도 내로 수정사항이 반영되어 자동으로 서버에 재배포됨
  • Crontab에 대해서는 추후에 다시 정리, 간단하게 설명하면 일정 주기나 특정 시간마다 입력해둔 명령어를 실행하는 것임
  1. EC2 터미널 접속
  2. 배포 스크립트와 로그 파일이 저장될 위치 확인 (pwd입력)
  3. export EDITOR=vi 입력 => Crontab을 vi 에디터로 실행
  4. crontab -e 입력
  5. i 입력을 통해 입력 모드로 변경
  6. 해당 파일의 맨 아래로 이동 후 아래 코드 추가
* * * * * sh /<배포 스크립트가 있는 경로>/<배포 스크립트 명>.sh > /<로그를 저장할 디렉토리>/<로그가 저장될 파일>.log

ex)
* * * * * sh /root/deploy-gitlab-ci-cd-practice.sh > /root/log/gitlab-ci-cd-practice.log

  • crontab 간단 설명
    • '* * * * *' 은 1분마다 실행됨을 뜻함
    • '0 * * * *' 은 1시간마다 실행됨을 뜻함
    • '0 */2 * * *' 은 2시간마다 실행됨을 뜻함
    • '0 3 * * *' 은 매일 오전 3시에 실행됨을 뜻함
    • '0 3 * * 0' 은 매주 일요일 오전 2시에 실행됨을 뜻함
    • 또한, 중간에 > 가 하나 있으면 로그 덮어쓰기, 두개 있으면 로그를 누적함
    • 만약 >>를 사용해 로그를 누적하려면 누적되는 로그를 주기적으로 삭제나 관리하는 로직도 필요함
  1. esc -> :wq 로 저장 후 나감
  2. 이제 1분 정도 기다린 후 로그 파일에 들어가 봤을때, 아래와 같이 로그가 찍혀있다면 crontab이 정상적으로 동작하는 것임
    • GitLab에 변경사항이 없기 때문에 "Image already up to date"가 정상적으로 출력됨
  3. 마지막으로 GitLab에 변경사항을 push 하고 약 5분정도 기다려보면 아래와 같이 변경사항이 서버에 잘 배포된 것을 확인할 수 있음
    • 텍스트가 변경1에서 변경2로 제대로 바뀜
  4. 로그도 제대로 찍히는 것을 확인할 수 있음
반응형

↓ 클릭시 이동

복사했습니다!