๐Ÿ“ฆ ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์ž๋™์œผ๋กœ ๋นŒ๋“œ๋œ๋‹ค: Docker + GitLab CI/CD ํ™˜๊ฒฝ ๊ตฌ์ถ•๊ธฐ

“์ฝ”๋“œ๋ฅผ pushํ•˜๋ฉด ์•Œ์•„์„œ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋ฐฐํฌ๊นŒ์ง€ ํ•ด์คฌ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.”

์ด ๋ฐ”๋žŒ์„ ํ˜„์‹ค๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ณผ์ œ์—์„œ๋Š” Docker๋กœ GitLab ์„œ๋ฒ„๋ฅผ ์ง์ ‘ ๋„์šฐ๊ณ , GitLab Runner๋ฅผ ์—ฐ๊ฒฐํ•ด ์ฝ”๋“œ๋ฅผ pushํ•˜๋Š” ์ˆœ๊ฐ„ ์ž๋™์œผ๋กœ ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ตฌ์ถ•ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.


๐Ÿ“‹ ์ „์ฒด ๊ตฌ์„ฑ ๊ฐœ์š”

๊ตฌ์„ฑ ์š”์†Œ์—ญํ• 
Docker + Docker Compose์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ์‹คํ–‰ ํ™˜๊ฒฝ
GitLab์ฝ”๋“œ ์ €์žฅ์†Œ + CI/CD ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ
GitLab Runner์‹ค์ œ ํŒŒ์ดํ”„๋ผ์ธ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ์—์ด์ „ํŠธ
.gitlab-ci.ymlํŒŒ์ดํ”„๋ผ์ธ ์ •์˜ ํŒŒ์ผ

์ „์ฒด ํ๋ฆ„์„ ํ•œ ์ค„๋กœ ์š”์•ฝํ•˜๋ฉด:

์ฝ”๋“œ Push โ†’ GitLab ๊ฐ์ง€ โ†’ Runner์—๊ฒŒ ์ž‘์—… ํ• ๋‹น โ†’ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ๋นŒ๋“œ/ํ…Œ์ŠคํŠธ ์‹คํ–‰ โ†’ ๊ฒฐ๊ณผ ๋ณด๊ณ 


1. Docker & Docker Compose ์„ค์น˜ ๐Ÿณ

GPG ํ‚ค ๋“ฑ๋ก ๋ฐ ๊ณต์‹ ์ €์žฅ์†Œ ์ถ”๊ฐ€

Docker๋ฅผ apt๋กœ ์„ค์น˜ํ•˜๋ ค๋ฉด ๋จผ์ € ๊ณต์‹ ์ €์žฅ์†Œ๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. GPG ํ‚ค๋Š” ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ํŒจํ‚ค์ง€๊ฐ€ Docker์—์„œ ๊ณต์‹ ๋ฐฐํฌํ•œ ๊ฒƒ์ธ์ง€ ๊ฒ€์ฆํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์กฐ๋œ ํŒจํ‚ค์ง€๋ฅผ ๋ง‰๋Š” ์ผ์ข…์˜ ๋””์ง€ํ„ธ ์„œ๋ช… ํ™•์ธ์ž…๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜(dpkg --print-architecture)์™€ OS ๋ฒ„์ „(/etc/os-release)์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•ด ํ™˜๊ฒฝ์— ๋งž๋Š” ์ €์žฅ์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

GPG ํ‚ค ๋“ฑ๋ก ํ™”๋ฉด

์ €์žฅ์†Œ ์ถ”๊ฐ€ ํ™”๋ฉด

Docker ์—”์ง„ + Compose ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

๊ฐ ํŒจํ‚ค์ง€์˜ ์—ญํ• :

  • docker-ce: Docker ์—”์ง„ ๋ณธ์ฒด
  • docker-ce-cli: ํ„ฐ๋ฏธ๋„์—์„œ docker ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ CLI ๋„๊ตฌ
  • containerd.io: ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰์„ ๋‹ด๋‹นํ•˜๋Š” ๋Ÿฐํƒ€์ž„
  • docker-compose-plugin: docker compose ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ

WSL ํ™˜๊ฒฝ์—์„œ Docker ๋ฐ๋ชฌ์„ ์‹œ์ž‘ํ•˜๊ณ , ํ˜„์žฌ ์‚ฌ์šฉ์ž๋ฅผ docker ๊ทธ๋ฃน์— ์ถ”๊ฐ€ํ•ด sudo ์—†์ด Docker ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ถŒํ•œ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Docker ๋ฐ๋ชฌ ์‹œ์ž‘ ๋ฐ ๊ทธ๋ฃน ์ถ”๊ฐ€

์„ค์น˜ ๋ฒ„์ „ ํ™•์ธ

docker version ๋ฐ docker compose version ์ถœ๋ ฅ

Docker Engine:  28.1.1
Docker Compose: v2.35.1

2. GitLab ์„œ๋ฒ„ ๊ตฌ์„ฑ ๐ŸฆŠ

๋ฐ์ดํ„ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ค€๋น„

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜์–ด๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ๋„๋ก ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๋ฅผ ์œ„ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘ก๋‹ˆ๋‹ค.

sudo mkdir -p /data/gitlab/{data,logs,config}

๋””๋ ‰ํ„ฐ๋ฆฌ ์ƒ์„ฑ ๋ฐ ๊ถŒํ•œ ์„ค์ •

docker-compose.yaml ์ž‘์„ฑ

GitLab Enterprise Edition 16.1.0 ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

services:
  gitlab:
    image: gitlab/gitlab-ee:16.1.0-ee.0
    container_name: gitlab
    restart: always
    ports:
      - "80:80"      # HTTP
      - "443:443"    # HTTPS
      - "8022:22"    # SSH (ํ˜ธ์ŠคํŠธ 8022 โ†’ ์ปจํ…Œ์ด๋„ˆ 22)
    volumes:
      - /data/gitlab/config:/etc/gitlab
      - /data/gitlab/logs:/var/log/gitlab
      - /data/gitlab/data:/var/opt/gitlab

docker-compose.yaml ์ž‘์„ฑ ํ™”๋ฉด

ํฌํŠธ๋ฅผ 3๊ฐœ๋กœ ๋ถ„๋ฆฌํ•œ ์ด์œ :

  • 80/443: ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ GitLab UI ์ ‘์†
  • 8022: SSH๋กœ git clone/push ์‹œ ์‚ฌ์šฉ (ํ˜ธ์ŠคํŠธ์˜ 22๋ฒˆ์€ ์ด๋ฏธ ์‹œ์Šคํ…œ SSH๊ฐ€ ์‚ฌ์šฉ ์ค‘)

GitLab ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ๋ฐ ์ดˆ๊ธฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ

docker compose up -d

์ปจํ…Œ์ด๋„ˆ๊ฐ€ healthy ์ƒํƒœ๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์ดˆ๊ธฐ root ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. GitLab์€ ์ฒ˜์Œ ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ์ž„์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ƒ์„ฑํ•ด ํŒŒ์ผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

docker exec gitlab cat /etc/gitlab/initial_root_password

์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ๋ฐ healthy ์ƒํƒœ ํ™•์ธ


3. GitLab Runner ์„ค์น˜ ๋ฐ ๋“ฑ๋ก ๐Ÿƒ

Runner๋ž€?

GitLab ์„œ๋ฒ„๋Š” “์ด๋Ÿฐ ์ž‘์—…์„ ํ•ด์•ผ ํ•ด”๋ผ๊ณ  ์ง€์‹œ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„์„œ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ์‹คํ–‰์ž๊ฐ€ ๋ฐ”๋กœ GitLab Runner์ž…๋‹ˆ๋‹ค. Runner๋ฅผ ๋ณ„๋„ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋„์›Œ GitLab ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

Runner ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ฐ docker-compose.yml ์ž‘์„ฑ

sudo mkdir -p /data/gitlab-runner/config

Runner ์ปจํ…Œ์ด๋„ˆ๋Š” Docker-in-Docker(DinD) ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ์˜ Docker ์†Œ์ผ“(/var/run/docker.sock)์„ ๊ณต์œ ํ•ด Runner๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ๋„ Docker๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

services:
  gitlab-runner:
    image: gitlab/gitlab-runner:v16.0.2
    container_name: gitlab-runner
    restart: always
    volumes:
      - /data/gitlab-runner/config:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock  # DinD ํ•ต์‹ฌ

Runner ๋“ฑ๋ก

GitLab ์›น UI์—์„œ Admin Area โ†’ CI/CD โ†’ Runners ๋ฉ”๋‰ด๋กœ ์ด๋™ํ•ด ์ƒˆ๋กœ์šด Instance Runner๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • Tags: docker-test
  • “Run untagged jobs” ์ฒดํฌ โ†’ ํƒœ๊ทธ ์—†๋Š” ์ž‘์—…๋„ ์‹คํ–‰ ํ—ˆ์šฉ

์ƒ์„ฑ๋œ Registration Token์„ ๋ณต์‚ฌํ•ด Runner ๋“ฑ๋ก ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

docker exec -it gitlab-runner gitlab-runner register \
  --url http://localhost \
  --executor docker \
  --docker-image alpine:latest
  • --executor docker: ๊ฐ ํŒŒ์ดํ”„๋ผ์ธ ์ž‘์—…์„ ๋ณ„๋„ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰
  • --docker-image alpine:latest: ๊ธฐ๋ณธ ๋นŒ๋“œ ์ด๋ฏธ์ง€๋กœ ๊ฒฝ๋Ÿ‰ Alpine Linux ์‚ฌ์šฉ

4. CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์„ค์ • ๐Ÿ”

ํ”„๋กœ์ ํŠธ Clone

VS Code๋ฅผ WSL ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•˜๊ณ , GitLab์—์„œ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ๋ฅผ ๋กœ์ปฌ๋กœ Cloneํ•ฉ๋‹ˆ๋‹ค.

.gitlab-ci.yml ์ž‘์„ฑ

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— .gitlab-ci.yml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์˜ ์„ค๊ณ„๋„์ž…๋‹ˆ๋‹ค. pushํ•  ๋•Œ๋งˆ๋‹ค GitLab์ด ์ด ํŒŒ์ผ์„ ์ฝ์–ด Runner์—๊ฒŒ ์ž‘์—…์„ ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.

stages:
  - test

run-test:
  stage: test
  image: alpine:latest
  script:
    - echo "Hello from CI/CD Pipeline!"
    - echo "Build started at $(date)"
    - echo "All tests passed!"

Commit & Push

git add .gitlab-ci.yml
git commit -m "Add CI/CD pipeline"
git push origin main

5. ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ฐ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๐Ÿ”ง

YAML ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ์ˆ˜์ •

์ดˆ๊ธฐ ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. script ํ•ญ๋ชฉ์„ ๋‹จ์ผ ๋ฌธ์ž์—ด๋กœ ์ž‘์„ฑํ–ˆ๋”๋‹ˆ YAML ํŒŒ์„œ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ๋ฐฐ์—ด ํ˜•์‹์œผ๋กœ ์ˆ˜์ •ํ•ด ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

# โŒ ์˜ค๋ฅ˜: ๋‹จ์ผ ๋ฌธ์ž์—ด
script: echo "Hello"

# โœ… ์ˆ˜์ •: ๋ฐฐ์—ด ํ˜•์‹
script:
  - echo "Hello"

๐Ÿ ๊ฒฐ๋ก  ๋ฐ ๋ฐฐ์šด ์ 

์ด๋ฒˆ ๊ณผ์ œ๋ฅผ ํ†ตํ•ด DevOps ํ™˜๊ฒฝ์˜ ์ „์ฒด ๊ทธ๋ฆผ์„ ์ง์ ‘ ๊ตฌ์ถ•ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

๋‹จ๊ณ„๊ฒฐ๊ณผ
Docker + Compose ์„ค์น˜โœ… ์™„๋ฃŒ
GitLab ์„œ๋ฒ„ ๊ตฌ๋™โœ… ์™„๋ฃŒ
GitLab Runner ๋“ฑ๋กโœ… Online ์ƒํƒœ ํ™•์ธ
.gitlab-ci.yml ์ž‘์„ฑ ๋ฐ Pushโœ… ์™„๋ฃŒ
ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰ ์„ฑ๊ณตโœ… ์™„๋ฃŒ

YAML ๋ฌธ๋ฒ•์˜ ์ค‘์š”์„ฑ: ๋“ค์—ฌ์“ฐ๊ธฐ ํ•˜๋‚˜, ๋”ฐ์˜ดํ‘œ ํ•˜๋‚˜๊ฐ€ ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์„ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ์„ ์–ธํ˜• ์„ค์ • ํŒŒ์ผ์—์„œ ๋ฌธ๋ฒ•์˜ ์ •ํ™•์„ฑ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ์ง์ ‘ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ์ธํ”„๋ผ์˜ ์žฅ์ : GitLab ์„œ๋ฒ„, Runner, ๋นŒ๋“œ ํ™˜๊ฒฝ ๋ชจ๋‘๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ด€๋ฆฌํ•˜๋‹ˆ ์„ค์น˜/์‚ญ์ œ/๋ฒ„์ „ ๋ณ€๊ฒฝ์ด ๋งค์šฐ ๊ฐ„ํŽธํ–ˆ์Šต๋‹ˆ๋‹ค. docker compose up -d ํ•œ ์ค„๋กœ ๋ณต์žกํ•œ ์„œ๋ฒ„๊ฐ€ ๋œจ๋Š” ๊ฒฝํ—˜์€ ๊ฝค ์ธ์ƒ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

DinD(Docker-in-Docker)์˜ ๊ฐœ๋…: Runner๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ๋˜ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•ด ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ Docker ์†Œ์ผ“์„ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ์‹์ด ๋ณด์•ˆ๊ณผ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ์–ด๋–ค ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๊ฐ–๋Š”์ง€๋„ ์ถ”๊ฐ€๋กœ ๊ณต๋ถ€ํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.