[Gitlab] 도커 컴포즈로 깃랩 구축 + 백업 + 복원 + 사용 사례
깃랩을 구축 및 사용법을 공유하려고 한다.
먼저 docker-compose 코드이다.
version: '3.6'
services:
console:
container_name: gitlab-console
image: 'gitlab/gitlab-ce:14.7.3-ce.0'
restart: always
hostname: 'domain'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://domain'
gitlab_rails['backup_keep_time'] = 604800
gitlab_rails['gitlab_email_from'] = 'abcd@mail.com'
gitlab_rails['gitlab_shell_ssh_port'] = 9022
gitlab_rails['time_zone'] = 'Asia/Seoul'
nginx['ssl_certificate'] = '/path/to/ssl.crt'
nginx['ssl_certificate_key'] = '/path/to/ssl.key'
ports:
- '9000:9000'
- '9022:22'
volumes:
- '/path/to/console/config:/etc/gitlab'
- '/path/to/console/logs:/var/log/gitlab'
- '/path/to/console/data:/var/opt/gitlab'
- '/path/to/console/backups:/data/backups'
shm_size: '256m'
runner:
container_name: gitlab-runner
image: 'gitlab/gitlab-runner:version'
restart: always
volumes:
- '/path/to/runner/config:/etc/gitlab-runner'
- '/path/to/certs:/etc/gitlab-runner/certs'
- '/path/to/runner/cache:/cache'
- '/var/run/docker.sock:/var/run/docker.sock'
설명하자면
먼저 이 콘솔에 등록할 러너는 배포 시에 사용할 러너라서
'/var/run/docker.sock:/var/run/docker.sock' 이 코드는 docker.sock 을 마운트 시킨다.
저 docker.sock 은 도커 데몬에게 명령을 내리기 위한 Unix 도메인 소켓 파일이다.
도커 데몬과 소통하기 위한 인터페이스인 것.
ssl 인증서와 러너 캐시를 마운트해주고
도메인 정보를 입력한다.
이제 이 docker-compose.yml이 작성된 위치에서
docker-compose up 을 하면 해당 컨테이너들이 동작한다.
이렇게 하면 초기 시작은 완료된 것이다.
백업
이렇게 운영하다 백업하는 방법은 다음과 같다.
docker exec -t gitlab-console gitlab-backup create
이 때도 다양한 옵션이 있다.
아티팩트라는 것을 포함할 수도 있고
포함하지 않을 수 있다.
docker exec -t gitlab-console SKIP=artifacts gitlab-backup create
이제 이렇게 생성하면 내가 마운트한 백업 디렉토리에 생성될텐데
이것을 옮겨주면 된다.
아티팩트는 빌드 결과물 및 빌드 시 사용되었던 파일들이다.
이것을 활용하면 간단하게 빌드한 이미지를
도커 허브같은 것을 쓰지 않고 전달도 가능하다.
위의 명령어를 cron job 으로 등록해서 백업을 해두면 좋다!
crontab -e
# m h dom mon dow command
0 1 * * * docker exec -t gitlab-console gitlab-backup create
도커 허브를 쓰지 않고 빌드된 이미지를
다른 tag를 가지고 있는 러너에게 전달하는
예시 gitlab-ci.yml
docker image:
stage: package
dependencies:
- gradle build
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
variables:
AWS_PROFILE: profile
script:
- echo $AWS_DEPLOY_TARGET
- mkdir -p /kaniko/.docker
- echo "{ \"credsStore\"":" \"ecr-login\" }" > /kaniko/.docker/config.json
- /kaniko/executor --cache=true --context $CI_PROJECT_DIR/back --dockerfile "Dockerfile" --destination $AWS_DEPLOY_TARGET
deploy_to_gitlab:
stage: deploy
dependencies:
- docker image
tags:
- mytag
variables:
AWS_PROFILE: profile
script:
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_DEPLOY_TARGET
- bash /pato/to/deploy_cmd.sh $BACKEND_APP_NAME $IMAGE_TAG $APP_PORT
이제 콘솔에 들어가 설정하고 복원시키면 된다.
복원
docker exec -it gitlab-console bash
이렇게 직접 들어가서 해도 되고
docker exec -t gitlab-console gitlab-backup restore BACKUP=/var/opt/gitlab/backups/백업대상지정
이처럼 명령어만 전달해도 된다.
근데 이 때 시크릿도 같이 전달해야 한다.
근데 이 때
깃랩 콘솔에 /etc/gitlab 디렉토리에 있는 gitlab.rb 와 gitlab-secrets.json 를 가지고
gitlab-ce/console/config/gitlab.rb
gitlab-ce/console/config/gitlab-secrets.json
이 위치로 넣어주면 된다.
gitlab.rb는
깃랩 설정들이 들어있는데
여기에 아까 말했던 아티팩트를 포함시키거나 빼는 환경변수를 넣을 수 있다.
gitlab_rails['env'] = {
'SKIP' => 'artifacts'
}
이렇게 하면 백업은 완료된다.
기존에 사용하던 계정으로 로그인된다면 성공이다.
사용 사례
깃랩 러너를 여러 머신에 설치하여 원하는 작업을
gitlab 의 파이프라인을 통해 할 수 있다.
그 중에 배포 시에 필요한 sh 파일을
레포를 통해 관리하여
깃을 통한 버전관리도 되고 여러 머신에 복사할 수 있는 기능의 레포의 ci 코드를 적으며 마무리하겠다.
stages:
- spring_copy
- front_copy
- aws_key_update
- aws_key_update_local
- aws_key_update_db
spring_copy:
stage: spring_copy
parallel:
matrix:
- TAG: qa
- TAG: dev
- TAG: prod
variables:
AWS_PROFILE: profile
tags:
- $TAG
rules:
- if: $CI_COMMIT_BRANCH =~ /^spring-copy/
when: always
- when: never
script:
- sudo cp -r ./spring_server/dep/* /dep/
- sudo find /dep/ -type f -exec chmod +x {} +
- echo "Files copied to /dep"
front_copy:
stage: front_copy
parallel:
matrix:
- TAG: qa-front
- TAG: dev-front
- TAG: prod-front
variables:
AWS_PROFILE: profile
tags:
- $TAG
rules:
- if: $CI_COMMIT_BRANCH =~ /^front-copy/
when: always
- when: never
script:
- sudo cp -r ./front_server/dep/* /home/ubuntu/dep/
- sudo find /home/ubuntu/dep/ -type f -exec chmod +x {} +
- echo "Files copied to /home/ubuntu/dep"
spring_aws_key_update:
stage: aws_key_update
parallel:
matrix:
- TAG: qa
- TAG: dev
- TAG: prod
variables:
AWS_PROFILE: profile
tags:
- $TAG
rules:
- if: $CI_COMMIT_BRANCH =~ /^aws-key-update/
when: always
- when: never
script:
- sudo -u ubuntu aws configure set aws_access_key_id $(aws configure get aws_access_key_id --profile ${AWS_PROFILE})
- sudo -u ubuntu aws configure set aws_secret_access_key $(aws configure get aws_secret_access_key --profile ${AWS_PROFILE})
- sudo aws configure set aws_access_key_id $(aws configure get aws_access_key_id --profile ${AWS_PROFILE})
- sudo aws configure set aws_secret_access_key $(aws configure get aws_secret_access_key --profile ${AWS_PROFILE})
# aws env 전달 (ein 프로젝트)
- |
cat > spring_server/aws.env << EOF
AWS_S3_KEY=$AWS_S3_KEY
AWS_S3_SECRET=$AWS_S3_SECRET
AWS_SES_KEY=$AWS_SES_KEY
AWS_SES_SECRET=$AWS_SES_SECRET
EOF
- sudo cp spring_server/aws.env /dep/
- sudo chmod +x /dep/aws.env
front_aws_key_update:
stage: aws_key_update
parallel:
matrix:
- TAG: qa-front
- TAG: prod-front
- TAG: prod2-front
variables:
AWS_PROFILE: profile
tags:
- $TAG
rules:
- if: $CI_COMMIT_BRANCH =~ /^aws-key-update/
when: always
- when: never
script:
- sudo -u ubuntu aws configure set aws_access_key_id $AWS_S3_KEY
- sudo -u ubuntu aws configure set aws_secret_access_key $AWS_S3_SECRET
- sudo aws configure set aws_access_key_id $AWS_S3_KEY
- sudo aws configure set aws_secret_access_key $AWS_S3_SECRET
local_dev_aws_key_update:
stage: aws_key_update_local
variables:
AWS_PROFILE: profile
tags:
- mytag1
rules:
- if: $CI_COMMIT_BRANCH =~ /^aws-key-update/
when: always
- when: never
script:
- sudo -u local-dev aws configure set aws_access_key_id $AWS_S3_KEY
- sudo -u local-dev aws configure set aws_secret_access_key $AWS_S3_SECRET
- sudo aws configure set aws_access_key_id $AWS_S3_KEY
- sudo aws configure set aws_secret_access_key $AWS_S3_SECRET
local_dev2_aws_key_update:
stage: aws_key_update_local
variables:
AWS_PROFILE: profile
tags:
- mytag2
rules:
- if: $CI_COMMIT_BRANCH =~ /^aws-key-update/
when: always
- when: never
script:
- sudo -u local-dev-2 aws configure set aws_access_key_id $AWS_S3_KEY
- sudo -u local-dev-2 aws configure set aws_secret_access_key $AWS_S3_SECRET
- sudo aws configure set aws_access_key_id $AWS_S3_KEY
- sudo aws configure set aws_secret_access_key $AWS_S3_SECRET
db_aws_key_update:
stage: aws_key_update_db
parallel:
matrix:
- TAG: db-prod
- TAG: db-qa
- TAG: db-dev
variables:
AWS_PROFILE: m42-prod
tags:
- $TAG
rules:
- if: $CI_COMMIT_BRANCH =~ /^aws-key-update/
when: always
- when: never
script:
- sudo -u ubuntu aws configure set aws_access_key_id $AWS_S3_KEY
- sudo -u ubuntu aws configure set aws_secret_access_key $AWS_S3_SECRET
- sudo aws configure set aws_access_key_id $AWS_S3_KEY
- sudo aws configure set aws_secret_access_key $AWS_S3_SECRET