Docker-Compose 설치 참고 {: .prompt-info }
GitLab Runner 설치 #
GitLab Runner 작업 Directory (Working directory)와 데이터를 영속적(Persistent)으로 저장하기 위한 바인드 마운트(Bind mount)용 Directory를 생성
1sudo mkdir -p /data/gitlab-runner/config && cd /data/gitlab-runnergitlab-runnerDirectory의 소유권을$USER로 변경하고 권한을 변경1sudo chown -R $USER:$USER /data/gitlab-runnerdocker-compose.yml 파일을 생성
1version: '3.9' 2services: 3gitlab-runner: 4 image: 'gitlab/gitlab-runner:v17.6.1' 5 container_name: gitlab-runner 6 restart: always 7 volumes: 8 - './config:/etc/gitlab-runner' 9 - '/var/run/docker.sock:/var/run/docker.sock'
GitLab Runner 시작 #
docker-compose up -d명령을 실행하여 Runner를 시작
GitLab Runner 등록 #
- GitLab UI에는 액세스 할 사용자에 따라 세 가지 유형의 Runner가 있다.
- 공유 러너는 GitLab 인스턴스의 모든 그룹 및 프로젝트에서 사용할 수 있다. (Admin Area의 CI/CD > Runners)
- 그룹 러너는 그룹의 모든 프로젝트와 하위 그룹에서 사용할 수 있다. (그룹의 Settings > CI/CD > Runners 섹션)
- 특정 러너는 특정 프로젝트와 연결됩니다. 일반적으로 특정 러너는 하나의 프로젝트에서만 사용된다. (프로젝트의 Settings > CI/CD > Runners 섹션)
- 여기에서는 공유 러너(Shared runner) 를 등록하는 방법을 설명 (Admin 권한 필요)
GitLab Admin Area 페이지로 이동한다. #

사이드 바에서 CI/CD > Runners를 클릭한다. 이후 New instance runner 를 클릭한다. #

태그 없이 Runner을 사용하기 위해 Run untaged jobs 를 체크한다. 이후 Create runner 를 클릭하여 러너를 생성한다. #

Step1 의 명령어를 복사한다. #

1gitlab-runner register --url http://192.168.0.54 --token glrt-t1__YKDoWm-di4smDhcNoCXgitlab-runner 컨네이너에 대화형(interactive) Bash Shell을 실행 #
1docker exec -it gitlab-runner bash- 프로젝트와 연동하는 방법은 두가지가 있다.
- 비대화식 모드(non-interactive mode)로 등록
- 대화식 모드(interactive mode)로 등록
비대화식 모드(non-interactive mode) #
1gitlab-runner register -n \
2--url http://$IP \
3--registration-token $TOKEN \
4--description gitlab-runner \
5--executor shell \
6--tag-list deploy-1
7
8...✂...
9
10Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!| Option | Description |
|---|---|
--url | GitLab 인스턴스 URL |
--registration-token | Project의 token |
--description | 설명 |
--executor | 빌드를 실행하는 데 사용할 수 있는 여러 실행 프로그램 |
--docker-image | Docker를 실행 프로그램으로 선택한 경우 사용할 이미지 |
--docker-volumes | Docker를 실행 프로그램으로 선택한 경우 사용할 볼륨 |
--tag-list | .gitlab-ci.yml 파일에서 작업할 runner를 지정할때 사용 |
대화식 모드(interactive mode) #
gitlab-runner register ~명령을 실행하고 지침에 따라 아래 항목을 입력- Enter the GitLab instance URL : 아무것도 입력하지 않고 Enter 키를 누른다.
--url값이 설정된다. - Enter the registration token : 아무것도 입력하지 않고 Enter 키를 누른다.
--token값이 설정된다. - Enter a description for the runner : 러너에 대한 설명을 입력하고 Enter 키를 누른다. (예:
docker runner) - Enter tags for the runner : 아무것도 입력하지 않고 Enter 키를 누른다.
- Enter an executor :
docker을 입력하고 Enter 키를 누른다. - Enter the default Docker image :
alpine:latest을 입력하고 Enter 키를 누른다.
- Enter the GitLab instance URL : 아무것도 입력하지 않고 Enter 키를 누른다.
1ubuntu@mp-repo:/data/gitlab-runner$ sudo docker exec -it gitlab-runner bash
2root@183e583bf883:/# gitlab-runner register --url http://192.168.0.54 --token glrt-t1_bkEhznhp1Qbdow6o44TK
3Runtime platform arch=amd64 os=linux pid=52 revision=6826a62f version=17.6.1
4Running in system-mode.
5
6Enter the GitLab instance URL (for example, https://gitlab.com/):
7[http://192.168.0.54]:
8Verifying runner... is valid runner=t1_bkEhzn
9Enter a name for the runner. This is stored only in the local config.toml file:
10[183e583bf883]: docker runner
11Enter an executor: shell, docker-windows, docker+machine, kubernetes, docker-autoscaler, instance, custom, ssh, parallels, virtualbox, docker:
12docker
13Enter the default Docker image (for example, ruby:2.7):
14alpine:latest
15Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
16
17Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"- 정상적으로 등록이 완료되면 You’ve created a new runner! 문구가 나타난다.

CI/CD > Runners 페이지에서 GitLab UI를 새로고침하면 등록된 러너가 목록에 나타난다. #

GitLab Runner 구성 #
- GitLab Runner 및 등록된 개별 Runner의 동작을 변경할 수 있다.
- GitLab Runner의 구성을 변경하려면
config.toml파일을 수정해야 한다. - 대부분의 옵션을 변경할 때 GitLab Runner를 다시 시작할 필요가 없다. 여기에는
listen_address를 제외한[[runners]]섹션의 파라미터와 글로벌 섹션의 대부분의 파라미터가 포함된다. - GitLab Runner는 3 초마다 구성 수정사항을 확인하고 필요한 경우 다시 로드한다.
Job 동시성(concurrency) 설정 #
- GitLab Runner가 동시에 여러 Job을 실행할 수 있도록 적절하게
concurrent을 수정한다. - 예를 들어, 4vCPU/16GiB인 경우
concurrent = 4로 설정한다. - GitLab.com의 자동 확장(Auto-scaling) Shared Runner는 단일 작업이 1 vCPU와 3.75GiB를 사용하여 단일 인스턴스에서 실행되도록 구성된다.
Docker 특권(privileged) 모드 설정 #
- 아래 CI 파이프라인(.gitlab-ci.yml)과 같이, Docker-in-Docker 컨테이너를 사용하여 docker build와 같은 스크립트를 실행하기 위해서는 특권 모드(privileged mode) 설정이 필요하다.
1image: docker:git
2services:
3- docker:dind
4
5build:
6 script:
7 - docker build -t my-image .
8 - docker push my-image위에서 언급한 Runner 옵션을 수정하려면 Runner 작업 Directory(예:
/data/gitlab-runner)에서 아래 명령을 실행하고 수정한다. 또는 gitlab-runner bash에 접속하여/etc/gitlab-runner에서config.toml를 수정하여도 된다.1sudo vi config/config.toml[runners.docker]에서privileged = true로 설정한다....✂... concurrent = 2 check_interval = 0 connection_max_age = "15m0s" shutdown_timeout = 0 [session_server] session_timeout = 1800 [[runners]] ...✂... [runners.docker] tls_verify = false image = "alpine:latest" privileged = true ...✂...gitlab-runner restart
1sudo docker restart [gitlab-runner 컨테이너 id]gitlab ci yml 구성
1variables: 2 AWS_ACCOUNT_ID: [AWS 계정 아이디] 3 DOCKER_REGISTRY: dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com 4 CPU: 1024 5 MEMORY: 2048 6 DOCKER_HOST: tcp://localhost:2375 7 DOCKER_DRIVER: overlay2 8 DOCKER_TLS_CERTDIR: '' 9 10build_prod: 11 stage: build 12 image: 13 name: docker:stable 14 services: 15 - name: docker:20-dind 16 alias: localhost 17 command: ['--tls=false'] 18 variables: 19 ECR_REPOSITORIES: [레포지토리명] 20 before_script: 21 - apk add --no-cache curl python3 py3-pip 22 - pip install awscli botocore==1.29.21 23 - aws s3 cp $AWS_S3_BUCKET_URI/$APP_NAME ./ --recursive --exclude="*.development" --exclude="prisma/*" 24 - aws s3 cp $AWS_S3_BUCKET_URI/$APP_NAME/prisma/production/.env ./prisma/.env 25 - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.$DOCKER_REGISTRY 26 - export DOCKER_HOST=tcp://localhost:2375 27 - aws --version 28 - docker info 29 - docker --version 30 script: 31 - echo "Building image..." 32 - docker build -f Dockerfile.prod -t $ECR_REPOSITORIES:$CI_COMMIT_SHORT_SHA . 33 - echo "Tagging image..." 34 - docker tag $ECR_REPOSITORIES:$CI_COMMIT_SHORT_SHA $AWS_ACCOUNT_ID.$DOCKER_REGISTRY/$ECR_REPOSITORIES:latest 35 - echo "Pushing image..." 36 - docker push $AWS_ACCOUNT_ID.$DOCKER_REGISTRY/$ECR_REPOSITORIES:latest 37 only: 38 - production 39 40deploy_prod: 41 stage: deploy 42 image: 43 name: docker:stable 44 services: 45 - name: docker:20-dind 46 alias: localhost 47 command: ['--tls=false'] 48 variables: 49 ECR_REPOSITORIES: [레포지토리명] 50 TASK_DEFINITION_NAME: [테스크명] 51 CLUSTER_NAME: [클러스터명] 52 SERVICE_NAME: [서비스명] 53 needs: [build_prod] 54 before_script: 55 - apk add --no-cache curl jq python3 py3-pip 56 - pip install awscli botocore==1.29.21 57 - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.$DOCKER_REGISTRY 58 script: 59 - echo $DOCKER_REGISTRY/$APP_NAME:latest 60 - echo "Updating the service..." 61 - aws ecs update-service --region "$AWS_DEFAULT_REGION" --cluster "$CLUSTER_NAME" --service "$SERVICE_NAME" --task-definition "$TASK_DEFINITION_NAME" --force-new-deployment 62 only: 63 - production
Advertisement