반응형
GitLab, Linux Crontab을 활용한 CI/CD 파이프라인 구축 개념
- GitLab에 프로젝트 업로드 (Github와 같다고 생각하면 됨)
- GitLab, AWS EC2, Docker을 활용해 서버 배포
- GitLab에 수정사항이나 추가사항 push
- GitLab에서 프로젝트 빌드까지 진행
- 빌드가 완료되면 AWS EC2에 접속하여 기존의 서버 중지
- 다시 GitLab 프로젝트를 pull 받고 다시 배포
- 4번 과정은 세팅을 통해 GitLab에서 자동으로 진행시킴
- 이제 5, 6번 과정까지 자동화 한다면?
- 수정사항이나 추가사항을 GitLab Repository에 push만 해주면 빌드 후 재배포까지 자동으로 진행 됨
- CI/CD Pipeline 구축에 성공한 것
- 5, 6번 자동화는 Linux Crontab 활용
GitLab을 활용한 서버 배포
- GitLab에서 프로젝트 생성
- Local에서 생성한 프로젝트 연결 및 push (방법은 깃헙과 같으니 설명 생략)
- 우측 탭의 Settings -> CI/CD
- Variables -> Add variable 클릭
- 여기서 추가한 variables는 Project의 환경변수와 같이 사용 가능, 보안에 필요한 GITLAB_USER, GITLAB_PASSWORD나 PROJECT_NAME 등을 아래와 같이 등록 (Mask Variable 체크, variable 값은 모두 소문자로 작성)
- 프로젝트에 Dockerfile 추가 => https://chb2005.tistory.com/189 참고
- 우측 탭의 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
- 우측 탭의 CI/CD -> Jobs에 가보면 어떤 작업이 실행되고 있거나 완료 되었을 것임 (약 3~4분 정도 소요)
- 이 작업이 pass 되면 문제없이 실행 된 것임, 작업이 끝나면 아래와 같이 출력됨
- 위 작업까지 끝났으면 이제 AWS EC2에 접속해 Docker을 통해 프로젝트를 서버에 배포해야 함
- GitLab 페이지의 우측 탭의 Packages and registires -> Container Registry 에서 아래의 주소를 기억해 둠
- EC2 접속 ( EC2 접속 방법은 https://chb2005.tistory.com/188 참고 )
- 아래의 명령어를 순서대로 실행, <> 부분은 자신의 환경에 맞게 수정
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/<위에서 저장해놓은 주소>
- 서버에 잘 올라갔는지 확인
- 위 스크립트에서 포트번호를 8082로 따로 변경했기 때문에 8082 포트에서 실행되었음
변경사항이나 추가사항 적용 (서버 재배포, 배포 스크립트 활용)
- 실행중인 Docker Container 삭제 후 프로젝트를 pull 받고 다시 배포해도 되지만, 이번에는 배포 스크립트를 활용해 실행중인 Docker Container 삭제, 프로젝트 pull, 재배포를 진행
- 또한, 작성한 배포 스크립트는 CI/CD 파이프라인 구성에도 사용됨
- 변경사항이나 추가사항을 GitLab Repository에 push
- 위에서 정리한대로 파이프라인이 잘 구축되었다면 아래와 같이 GitLab에서 Build 까지 진행될 것임
- 다시 EC2 터미널로 돌아와 배포 스크립트 생성
vim [원하는 이름].sh
ex)
vim deploy-gitlab-ci-cd-practice.sh
- 아래의 코드에 <> 부분들을 자신에게 맞게 작성 후 붙여넣고 :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" 출력 후 종료
- 만약 업데이트 되었다면 기존에 실행중인 컨테이너를 종료하고 다시 배포
- 방금 생성한 배포 스크립트 실행
sh [배포 스크립트 명].sh
ex)
sh deploy-gitlab-ci-cd-practice.sh
- 이 때, GitLab에 변경된 것이 없으면 배포되지 않으니 주의
- 변경 사항 확인
- 처음 배포된 것과 달리 위에 '변경1'이라는 문자가 출력됨으로써, 수정사항을 반영하여 재배포가 성공적으로 된것을 확인할 수 있음
Linux Crontab을 활용한 CI/CD Pipeline 구축 완료
- GitLab을 활용한 배포와 수정사항을 반영한 재배포까지 완료됨
- 이제 남은 문제는 수정사항을 반영하려면 EC2에 직접 접속해 배포 스크립트를 실행해야 한다는 것임
- EC2 터미널에서 Crontab을 설정하여 1분에 한번씩 이 배포 스크립트를 실행시킨다면?
- GitLab에 수정사항이 없다면 재배포하지 않을 것이고, 수정사항이 있다면 기존 서버를 종료하고 재배포까지 진행해 줄 것임
- 이 작업까지 완료한다면 GitLab에 push만 해주면 GitLab Build(약 3~4분) + Crontab을 통한 배포(1분에 한 번씩) 과정이 자동화되기 때문에 약 5분 정도 내로 수정사항이 반영되어 자동으로 서버에 재배포됨
- Crontab에 대해서는 추후에 다시 정리, 간단하게 설명하면 일정 주기나 특정 시간마다 입력해둔 명령어를 실행하는 것임
- EC2 터미널 접속
- 배포 스크립트와 로그 파일이 저장될 위치 확인 (pwd입력)
- export EDITOR=vi 입력 => Crontab을 vi 에디터로 실행
- crontab -e 입력
- i 입력을 통해 입력 모드로 변경
- 해당 파일의 맨 아래로 이동 후 아래 코드 추가
* * * * * 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시에 실행됨을 뜻함
- 또한, 중간에 > 가 하나 있으면 로그 덮어쓰기, 두개 있으면 로그를 누적함
- 만약 >>를 사용해 로그를 누적하려면 누적되는 로그를 주기적으로 삭제나 관리하는 로직도 필요함
- esc -> :wq 로 저장 후 나감
- 이제 1분 정도 기다린 후 로그 파일에 들어가 봤을때, 아래와 같이 로그가 찍혀있다면 crontab이 정상적으로 동작하는 것임
- GitLab에 변경사항이 없기 때문에 "Image already up to date"가 정상적으로 출력됨
- 마지막으로 GitLab에 변경사항을 push 하고 약 5분정도 기다려보면 아래와 같이 변경사항이 서버에 잘 배포된 것을 확인할 수 있음
- 텍스트가 변경1에서 변경2로 제대로 바뀜
- 로그도 제대로 찍히는 것을 확인할 수 있음
반응형
'CI,CD' 카테고리의 다른 글
[CI/CD] Github Actions를 활용한 CI/CD 파이프라인 구축 (+ Docker hub) (0) | 2023.03.20 |
---|---|
[AWS] EC2 인스턴스에 Docker 설치 및 프로젝트 배포 + 배포 중지 (0) | 2023.03.02 |
[AWS] EC2 인스턴스 생성 ( + SSH 접속, MAC ) (0) | 2023.03.02 |
[AWS] RDS 생성 (+ MySQL Workbench와 연결) (0) | 2023.02.28 |
[AWS] 보안그룹 생성 (0) | 2023.02.28 |