[git] gitlab에 CI/CD 구축

최승언·2023년 5월 9일
0

git

목록 보기
24/27
post-thumbnail

CI/CD란?

CI는 개발자를 위한 자동화 프로세스인 지속적인 통합(Continuous Integration)을 의미합니다. CI를 성공적으로 구현할경우 애플리케이션에 대한 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트되어 공유 리포지토리에 통합되므로 여러 명의 개발자가 동시에 애플리케이션 개발과 관련된 코드 작업을 할 경우 서로 충돌할 수 있는 문제를 해결할 수 있습니다.

CD는 지속적인 서비스 제공(Continuous Delivery) 또는 지속적인 배포(Continuous Deployment)를 의미하며 이 두 용어는 상호 교환적으로 사용됩니다. 두 가지 의미 모두 애플리케이션 배포를 뜻하지만 수동(버튼)으로 배포되느냐 자동으로배포되느냐의 차이가 있습니다.



CI/CD 단계

1) Test: 코드를 테스트합니다.(유닛 테스트, 통합 테스트)
2) Build: 코드를 빌드하여 결과물을 추출합니다.
3) Package: 빌드 결과물을 도커라이징 하여 저장소에 업로드 합니다.
4) Deploy: 각 환경의 서버에 원하는 이미지를 배포 합니다.



CI/CD 시나리오





준비물

전 포스팅에서 구축한 gitlab 서버 사용

git-gitlab-runner-설치




1. gitlab 레포지토리 생성 및 코드 push

gitlab에 접속하여 레포지토리를 만들고 해당 코드를 push 한다.

CI/CD 예제코드



2. ECS 환경구축

이제 서비스를 띄울 ecs 환경을 구축해야 하는데 terraform을 이용해서 빠르게 환경을 구축할 수 있다.

terraform으로-ecs-구축



3. ECR 생성

aws 리포지토리에 들어가서 서비스를 넣을 리포지토리를 생성한다.

AWS-ECR에-docker-image-업로드#1-리포지토리-생성



4. .gitlab-ci.yml 수정

.gitlab-ci.yml에 본인의 설정에 맞게 수정을 해야하는데 여기서 배포할 때는 아래의 포스팅을 참고한 deploy-helper 이미지를 활용할 것이다.

AWS-ECS-이미지-배포하기

# docker-in-docker 실행에 필요한 변수
variables:
  DOCKER_HOST: tcp://docker:2375
  DOCKER_DRIVER: overlay2
  DOCKER_TLS_CERTDIR: ""

# 각 job을 구분하는 카테고리
stages:
  - test
  - build
  - package
  - deploy development
  - deploy staging
  - deploy production

# 테스트
test:
  image: amazoncorretto:17
  stage: test
  script: 
    - chmod +x ./gradlew # gradlew 권한문제 발생으로 추가함
    - ./gradlew check
  only:
    refs:
      - develop
      - release
# 빌드
build:
  image: amazoncorretto:17
  stage: build
  script: 
    - chmod +x ./gradlew # gradlew 권한문제 발생으로 추가함
    - ./gradlew build
  artifacts: # build 결과물 전달
    paths: 
      - build/libs/*.jar
  only:
    refs:
      - develop # develop 브랜치에서 실행
      - release # release 브랜치에서 실행

# dev용 이미지 도커라이징 및 push
package:develop:
  image: docker:latest # docker 설치된 이미지에서 작업
  services: 
    - docker:dind # docker-in-docker
  stage: package
  before_script:
    - apk add --no-cache curl jq python3 py3-pip
    - pip install awscli # aws cli 설치
    - aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 118709199903.dkr.ecr.ap-northeast-2.amazonaws.com
#    - aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 711790228718.dkr.ecr.ap-northeast-2.amazonaws.com # ECR 로그인

  script:
    - docker build -t $IMAGE_REPOSITORY:$CI_PIPELINE_IID-dev -f ./docker/Dockerfile . # 도커 이미지 빌드
    - docker push $IMAGE_REPOSITORY:$CI_PIPELINE_IID-dev # 빌드된 이미지 ECR에 push
  only:
    refs:
      - develop # develop 브랜치에서 실행

# prod용 이미지 도커라이징 및 push
package:release:
  image: docker:latest # docker 설치된 이미지에서 작업
  services: 
    - docker:dind # docker-in-docker
  stage: package
  before_script:
    - apk add --no-cache curl jq python3 py3-pip
    - pip install awscli # aws cli 설치
    - aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 118709199903.dkr.ecr.ap-northeast-2.amazonaws.com
#    - aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 711790228718.dkr.ecr.ap-northeast-2.amazonaws.com # ECR 로그인

  script:
    - docker build -t $IMAGE_REPOSITORY:$CI_PIPELINE_IID -f ./docker/Dockerfile . # 도커 이미지 빌드
    - docker push $IMAGE_REPOSITORY:$CI_PIPELINE_IID # 빌드된 이미지 ECR에 push
  only:
    refs:
      - release # release 브랜치에서 실행

# 개발 서버에 배포
deploy:deployment:
#  image: 711790228718.dkr.ecr.ap-northeast-2.amazonaws.com/deploy-helper:0.1.1 # deploy-helper.py 설치된 이미지에서 작업
  image: 118709199903.dkr.ecr.ap-northeast-2.amazonaws.com/test-velog-deploy-helper # deploy-helper.py 설치된 이미지에서 작업
  stage: deploy development
  script:
    - python3 /deploy-helper.py $IMAGE_REPOSITORY:$CI_PIPELINE_IID-dev test-velog-dev-cluster backend test-velog-ecs-tf 1 # deploy-helper.py 설치된 이미지에서 작업
  only:
    refs:
      - develop # develop 브랜치에서 실행

# QA 테스트 서버에 배포
deploy:staging:
#  image: 711790228718.dkr.ecr.ap-northeast-2.amazonaws.com/deploy-helper:0.1.1
  image: 118709199903.dkr.ecr.ap-northeast-2.amazonaws.com/test-velog-deploy-helper # deploy-helper.py 설치된 이미지에서 작업

  stage: deploy staging
  script:
     - python3 /deploy-helper.py $IMAGE_REPOSITORY:$CI_PIPELINE_IID-dev test-velog-dev-cluster backend test-velog-ecs-tf 2 # staging 클러스터, 작업정의로 변경 필요
  only:
    refs:
      - release # release 브랜치에서 실행
  when:
    manual # 수동으로 배포

# Production 서버에 배포
deploy:production:
#  image: 711790228718.dkr.ecr.ap-northeast-2.amazonaws.com/deploy-helper:0.1.1
  image: 118709199903.dkr.ecr.ap-northeast-2.amazonaws.com/test-velog-deploy-helper # deploy-helper.py 설치된 이미지에서 작업

  stage: deploy production
  script:
     - python3 /deploy-helper.py $IMAGE_REPOSITORY:$CI_PIPELINE_IID-dev test-velog-dev-cluster backend test-velog-ecs-tf 2 # production 클러스터, 작업정의로 변경 필요
  only:
    refs:
      - release # release 브랜치에서 실행
  when:
    manual # 수동으로 배포

위의 코드에서 집중해야할 부분은 package 단계의 before_script 마지막에는 본인의 ECR Docker 클라이언트 인증명령어로 변경해주고 deploy 단계에서 script의 인자를 본인의 ECS, 서비스, 작업정의로 수정해야 한다. 수정이 완료되면 commit, push를 한다.



5. develop, release 브랜치 생성

이제 개발용과 배포용 브랜치를 생성한다.



develop 브랜치를 만들때 release 브랜치가 안보일 때가 있는데 새로고침 하거나 나갔다 들어오면 정상적으로 표시될 것이다.


6. 브랜치 보호 설정




7. CI/CD 파이프라인 확인


이제 파이프라인이 도는 것을 확인할 수 있다. release 브랜치의 마지막 2개 job은 수동으로 Run 해주면 정상적으로 돌아갈 것이다.


8. 코드 수정

이제 코드를 수정하고 배포하기 위해 feature 브랜치를 만들고 배포해보자.

$ git branch feature-1 # feature-1 브랜치 생성
$ git checkout feature-1 # feature-1 브랜치로 이동

브랜치를 생성하고 수정된 코드를 확인하기 위해 다음과 같이 코드를 수정해보자.

코드 수정 후 feature-1으로 commit, push를 한다.

$ git add .
$ git commit -m "코드 수정"
$ git pull origin feature-1
$ git push origin feature-1



9. Merge Request(Pull Request) 생성






이제 수정된 코드가 적용된 것을 확인할 수 있을것이다.

profile
작업하다가 막힌부분을 기록하는 곳.

0개의 댓글