Gitlab CI/CD 설정 방법 (with. AWS ECS)

wononly.dev·2023년 1월 24일
2

DEV

목록 보기
3/3
post-thumbnail
  • docker, docker-compose 설치 필수
  • Gitlab은 CI/CD를 사용하려면 위해 Gitlab-runner를 필수로 등록해줘야함
  • 아래 Gitlab-runner 설정 방법은 공유 러너, 그룹 러너, 특정 러너 중 특정 러너 설정 방법 중심으로 작성됨
  • Dockerfile이 배포할 프로젝트 하위에 작성되어있어야함(docker build시 필요)
  • 필자의 개발 환경 Node.js + AWS ECS + Gitlab

1. Gitlab 웹에서 프로젝트 CI/CD 설정

  • CI/CD 조건 활성화

    Settings > General > Visibility, project features, permissions 섹션으로 이동 > CI/CD 조건 활성화

  • 공유러너 비활성화

    Settings > CI/CD > Runners > Shared runners 비활성화

2. Gitlab-runner 설치 및 설정

아래의 설정은 로컬PC or 서버에서 설정함 (필자는 AWS EC2 서버에서 진행)
and Gitlab-runner DinD(Docker in Docker) 방식 사용

  • 원하는 디렉토리에서 아래와 같이 gitlab-runner 폴더 생성 후 하위에 config 폴더 생성
    sudo mkdir gitlab-runner
    cd gitlab-runner
    sudo mkdir config
  • gitlab-runner 폴더 하위에 docker-compose.yml 파일 생성
    • docker-compose.yml
      version: '3.9'
      services:
        gitlab-runner:
          container_name: gitlab-runner
          image: gitlab/gitlab-runner:latest
          restart: always
          volumes:
            - ./config:/etc/gitlab-runner
            - /var/run/docker.sock:/var/run/docker.sock
  • gitlab-runner 도커 컨테이너 실행
    docker-compose up -d
  • gitlab-runner 도커 컨테이너 실행 확인
    docker container ls or docker ps
    
    CONTAINER ID   IMAGE                         COMMAND                  CREATED        STATUS        PORTS     NAMES
    38ddddbaac11   gitlab/gitlab-runner:latest   "/usr/bin/dumb-init …"   45 hours ago   Up 30 hours             gitlab-runner
  • 컨테이너 접속 및 gitlab-runner 등록
    docker-compose exec gitlab-runner bash
    gitlab-runner register
    • Enter the GitLab instance URL : GitLab 웹에서 Copy URL 아이콘을 클릭하여 클립보드에 복사한 후 붙여넣고 Enter 키 입력
    • Enter the registration token : GitLab 웹에서 Copy token 아이콘을 클릭하여 클립보드에 복사한 후 붙여넣고 Enter 키 입력
    • Enter a description for the runner : 러너에 대한 설명을 입력하고 Enter 키 입력
      (예: [프로젝트명]-runner)
    • Enter tags for the runner : 아무것도 입력하지 않고 Enter 키 입력
    • Enter an executor : docker을 입력하고 Enter 키 입력
    • Enter the default Docker image : alpine:latest을 입력하고 Enter 키 입력
  • Gitlab 웹에서 runner 등록 확인

3. Gitlab-runner 구성 변경

Docker in Docker 방식 사용으로 docker build와 같은 스크립트를 실행하기 위해서 Docker 특권(privileged) 모드 설정 필요

  • config.toml 파일 수정
    sudo vi config/config.toml
    concurrent = 1
    check_interval = 0
    shutdown_timeout = 0
    
    [session_server]
      session_timeout = 1800
    
    [[runners]]
      name = "test-runner"
      url = "https://gitlab.none.co.kr/"
      id = 1
      token = "FweeegEg55312345"
      token_obtained_at = 2023-01-23T10:07:55Z
      token_expires_at = 0001-01-24T00:00:00Z
      executor = "docker"
      [runners.custom_build_dir]
      [runners.cache]
        MaxUploadedArchiveSize = 0
        [runners.cache.s3]
        [runners.cache.gcs]
        [runners.cache.azure]
      [runners.docker]
        tls_verify = false
        image = "alpine:latest"
        privileged = true
        disable_entrypoint_overwrite = false
        oom_kill_disable = false
        disable_cache = false
        volumes = ["/cache"]
        shm_size = 0
    • [runners.docker]섹션에서 privileged = true로 설정
  • gitlab-runner 컨테이너 restart
    sudo docker restart [gitlab-runner 컨테이너 id]

4. Gitlab 웹에서 CI/CD 환경 변수 등록

필자는 AWS ECS 를 이용한 서비스 배포가 필요하므로 해당 서비스 이용을 위해 필요한 필수 환경 변수 등록이 필요했음

  • Gitlab 웹에서 환경 변수 등록
    (S3 bucket에 등록한 env 파일을 가져와야하기 때문에 S3 버킷 URI 정보도 환경변수에 등록함)

    Settings > CI/CD > Variables

    • AWS_ACCESS_KEY_ID
    • AWS_DEFAULT_REGION
    • AWS_SECRET_ACCESS_KEY
    • APP_NAME
    • AWS_S3_BUCKET_URI

5. 프로젝트에 gitlab-ci.yml 파일 추가

  • gitlab-ci.yml
variables:
  AWS_ACCOUNT_ID: [AWS 계정 아이디]
  DOCKER_REGISTRY: dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
  CPU: 1024
  MEMORY: 2048
  DOCKER_HOST: tcp://localhost:2375
  DOCKER_DRIVER: overlay2
  DOCKER_TLS_CERTDIR: ''

build_prod:
  stage: build
  image:
    name: docker:stable
  services:
    - name: docker:20-dind
      alias: localhost
      command: ['--tls=false']
  variables:
    ECR_REPOSITORIES: [레포지토리명]
  before_script:
    - apk add --no-cache curl python3 py3-pip
    - pip install awscli botocore==1.29.21
    - aws s3 cp $AWS_S3_BUCKET_URI/$APP_NAME ./ --recursive --exclude="*.development" --exclude="prisma/*"
    - aws s3 cp $AWS_S3_BUCKET_URI/$APP_NAME/prisma/production/.env ./prisma/.env
    - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.$DOCKER_REGISTRY
    - export DOCKER_HOST=tcp://localhost:2375
    - aws --version
    - docker info
    - docker --version
  script:
    - echo "Building image..."
    - docker build -f Dockerfile.prod -t $ECR_REPOSITORIES:$CI_COMMIT_SHORT_SHA .
    - echo "Tagging image..."
    - docker tag $ECR_REPOSITORIES:$CI_COMMIT_SHORT_SHA $AWS_ACCOUNT_ID.$DOCKER_REGISTRY/$ECR_REPOSITORIES:latest
    - echo "Pushing image..."
    - docker push $AWS_ACCOUNT_ID.$DOCKER_REGISTRY/$ECR_REPOSITORIES:latest
  only:
    - production

deploy_prod:
  stage: deploy
  image:
    name: docker:stable
  services:
    - name: docker:20-dind
      alias: localhost
      command: ['--tls=false']
  variables:
    ECR_REPOSITORIES: [레포지토리명]
    TASK_DEFINITION_NAME: [테스크명]
    CLUSTER_NAME: [클러스터명]
    SERVICE_NAME: [서비스명]
  needs: [build_prod]
  before_script:
    - apk add --no-cache curl jq python3 py3-pip
    - pip install awscli botocore==1.29.21
    - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.$DOCKER_REGISTRY
  script:
    - echo $DOCKER_REGISTRY/$APP_NAME:latest
    - echo "Updating the service..."
    - aws ecs update-service --region "$AWS_DEFAULT_REGION" --cluster "$CLUSTER_NAME" --service "$SERVICE_NAME" --task-definition "$TASK_DEFINITION_NAME" --force-new-deployment
  only:
    - production

6. AWS S3 bucket에 환경 변수 파일 업로드

프로젝트에서 환경변수사용하는 경우 필요한 작업

  • S3 버킷 해당 위치로 이동
  • 해당 위치에서 프로젝트명 or 원하는 명으로 버킷 생성
  • 생성된 버킷 하위로 환경변수 파일 업로드

참고

profile
항상 이유와 과정을 궁금해하는🤔 백엔드 개발자의 기술 블로그 입니다!

2개의 댓글

comment-user-thumbnail
2024년 3월 11일

선생님 덕분에 암이 나았습니다. 감사합니다😭😭.

1개의 답글