- docker, docker-compose 설치 필수
- Gitlab은 CI/CD를 사용하려면 위해 Gitlab-runner를 필수로 등록해줘야함
- 아래 Gitlab-runner 설정 방법은 공유 러너, 그룹 러너, 특정 러너 중 특정 러너 설정 방법 중심으로 작성됨
- Dockerfile이 배포할 프로젝트 하위에 작성되어있어야함(docker build시 필요)
- 필자의 개발 환경 Node.js + AWS ECS + Gitlab
CI/CD 조건 활성화
Settings > General > Visibility, project features, permissions 섹션으로 이동 > CI/CD 조건 활성화
공유러너 비활성화
Settings > CI/CD > Runners > Shared runners 비활성화
아래의 설정은 로컬PC or 서버에서 설정함 (필자는 AWS EC2 서버에서 진행)
and Gitlab-runner DinD(Docker in Docker) 방식 사용
sudo mkdir gitlab-runner
cd gitlab-runner
sudo mkdir config
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
docker-compose up -d
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
docker-compose exec gitlab-runner bash
gitlab-runner register
[프로젝트명]-runner
)docker
을 입력하고 Enter 키 입력alpine:latest
을 입력하고 Enter 키 입력Docker in Docker 방식 사용으로 docker build와 같은 스크립트를 실행하기 위해서 Docker 특권(privileged) 모드 설정 필요
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
로 설정sudo docker restart [gitlab-runner 컨테이너 id]
필자는 AWS ECS 를 이용한 서비스 배포가 필요하므로 해당 서비스 이용을 위해 필요한 필수 환경 변수 등록이 필요했음
Settings > CI/CD > Variables
- AWS_ACCESS_KEY_ID
- AWS_DEFAULT_REGION
- AWS_SECRET_ACCESS_KEY
- APP_NAME
- AWS_S3_BUCKET_URI
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
프로젝트에서 환경변수사용하는 경우 필요한 작업
- S3 버킷 해당 위치로 이동
- 해당 위치에서 프로젝트명 or 원하는 명으로 버킷 생성
- 생성된 버킷 하위로 환경변수 파일 업로드
선생님 덕분에 암이 나았습니다. 감사합니다😭😭.