Configuring GitLab CI-CD with AWS EC2

๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ํ†ตํ•ด ๋น„ํšจ์œจ ๋ํŒ์™• ๊ฐœ์„ ํ•˜๊ธฐ!!

์ง€๋‚œ๋ฒˆ์— ๋ฐฐํฌํ•œ SSAFY์—์„œ ์ค€ EC2 ํ•˜๋‚˜์— backend์™€ frontend server ๋‘ ๊ฐœ๋ฅผ ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ์‹์—์„œ, ์žฌ๋ฐฐํฌ ์‹œ git repo pull ๋ฐ›๊ณ  ์ผ๋ จ์˜ ๋ฐฐํฌ ๋ช…๋ น์–ด๋ฅผ ์ฃผ๋ฅด๋ฅต ์‹คํ–‰ํ•ด์•ผ ํ–ˆ๊ณ , ๋„ˆ๋ฌด ๋น„ํšจ์œจ์ ์ด๋ผ ๋นจ๋ฆฌ ๊ณ ์น˜๊ณ  ์‹ถ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ CI/CD ๋ฅผ ์•Œ์•„๋ณด๋˜ ์ค‘, SSAFY์—์„œ Github์ด ์•„๋‹Œ GitLab์„ ํ™œ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋งŒํผ GitLab์ด ๋งŒ๋“  Gitlab CI/CD๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค!

References: namioto.ip.or.kr

0. Getting started with GitLab CI/CD

GitLab CI/CD ํ๋ฆ„~

GitLab CI/CD ๋ž€?

  • GitLab CI/CD๋Š” Docker container์œ„์—์„œ ์ž‘๋™๋˜๊ณ , ์—ฐ๊ฒฐ๋œ Kubernetes ์— ๋ฐฐํฌ๋œ๋‹ค

  • Project root์— gitlab-ci.yml ํŒŒ์ผ์ด ์žˆ๋Š” ์ƒํƒœ์—์„œ push๊ฐ€ ๋“ค์–ด์˜ค๋ฉด, ํ•ด๋‹น ํŒŒ์ผ์— ๋ช…์‹œ๋œ Pipeline (task ๋ฌถ์Œ)์ด ์‹คํ–‰๋œ๋‹ค

Pipeline์˜ ๊ตฌ์„ฑ

  • Test

    • Unit Test

    • ํ†ตํ•ฉ Test

    • E2E Test

    • Test Coverage ์ธก์ •

  • Lint

    • Code quality ์ธก์ •

    • Code convention ์ ๊ฒ€

  • Build

    • Build

    • Bundling

    • Dockerfile build

    • Container registry push

  • Deploy

    • Helm Chart

      • Helm Chart๋ž€?

        • helm์€ Kubernetes package manager

        • helm chart๋Š” pacakage format์œผ๋กœ application์„ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ์ผ๋“ค๋กœ ๊ตฌ์„ฑ๋จ!

    • KNative Functions

      • KNative๋ž€?

        • Serverless cloud native application์„ ๋ฐฐํฌ, ์‹คํ–‰, ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Kubernetes์— ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” Open source community project

    • KNative App(์ปจํ…Œ์ด๋„ˆ) ๋ฐฐํฌ

1. GitLab Runner

  • Gitlab Runner๋Š” remote branch์— push๊ฐ€ ๋˜๋ฉด ์„ค์ •๋œ Stage์œ„์˜ ์ž‘์—…๋“ค์„ ์‹คํ–‰ํ•ด์ค€๋‹ค!

  • ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์›๊ฒฉ ์ €์žฅ์†Œ์— GitLab Runner๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค

1-1. GitLab ๊ณต์‹ repository ์ถ”๊ฐ€

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash

1-2. GitLab Runner ์ตœ์‹  ๋ฒ„์ „ ์„ค์น˜

sudo apt-get install gitlab-runner

1-3. Registering Runners

root ๊ณ„์ •์—์„œ ๋ฐ”๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด 1 ~ 2 ๋ฒˆ ๊ฑด๋„ˆ๋›ฐ๊ธฐ!

1. ๊ณ„์ • ์ƒ์„ฑ

sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
  • gitlab-runner ๋ผ๋Š” ์ด๋ฆ„์˜ ๊ณ„์ •์„ ์ƒ์„ฑํ•œ๋‹ค

2. ์„ค์น˜

sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner

3. ์‹คํ–‰

sudo gitlab-runner start

4. Gitlab Runner ๋“ฑ๋ก

sudo gitlab-runner register
  • ์œ„์˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ณ , 5๊ฐ€์ง€ ์‚ฌํ•ญ์„ interactiveํ•˜๊ฒŒ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค

    # 1. Gitlab ์„œ๋ฒ„ ์ฃผ์†Œ ์ž…๋ ฅ
    Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
    
    # 2. Gitlab CI Token ์ž…๋ ฅ 
    #   -> Settings > CI/CD > Runners settings > Specific Runners ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ!
    Please enter the gitlab-ci token for this runner:
    
    # 3. Runner ์„ค๋ช… ์ž…๋ ฅ
    Please enter the gitlab-ci description for this runner:
    
    # 4. Runner Tag ์„ค์ •
    #   -> gitlab-ci.yml ํŒŒ์ผ์— ์ ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๊ธฐ์–ตํ•˜์ž!!!!!! ์ค‘์š”!!!!
    Please enter the gitlab-ci tags for this runner (comma separated):
    
    # 5. Runner๊ฐ€ ์–ด๋–ค ์ž‘์—…์œผ๋กœ ๋™์ž‘ํ•  ์ง€ ์„ค์ • 
    #   -> ๋‚˜๋Š” Shell Script ์“ฐ๋Ÿฌ๊ฐˆ์„œ Shell ์„ ์„ ํƒํ–ˆ๋‹ค
    Please enter the executor: docker-ssh, ssh, virtualbox, docker, parallels, shell, docker+machine, docker-ssh+machine, kubernetes:

1-4. ๋“ฑ๋ก๋œ Runner ํ™•์ธํ•˜๊ธฐ

  • Settings > CI/CD > Runners settings > Specific Runners ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋“ฑ๋ก๋œ Runner๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

image-20200801231330664

2. .gitlab-ci.yml ํŒŒ์ผ ์ž‘์„ฑํ•˜๊ธฐ

Project root ์— .gitlab-ci.yml ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ๋‹ค

์ฃผ์˜

  • ์ด๊ฒƒ์€ SpringBoot - React ํ”„๋กœ์ ํŠธ์˜ ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ์œ„ํ•ด ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ script ์ด๋‹ค!!

  • ์ด yml ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฒช์–ด์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ์ด์ง€๋งŒ, ์ฒ˜์Œ ์ž‘์„ฑํ•ด๋ณด๋Š” Gitlab CI/CD ํŒŒ์ผ์ด๊ณ , ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฐธ๊ณ ๋งŒ ํ•˜์ž! (์•„๋งˆ ์žˆ์„ ๊ฒƒ์ด๋‹ค! ๊ณ„์† ์•Œ์•„๋ณด๊ณ  ์žˆ๋‹ค!)

    • ๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ๋ฉด update ํ•˜๊ฒ ๋‹ค!!

ex)

deploy-to-server:
  stage: deploy
  only:
    - master
  before_script:
    - echo 'start deployment'
    - whoami
  script:
    - cd /home/ubuntu/s03p12a112/
    - git pull origin master
    - cd backend
    - kill $(lsof -t -i:8000)
    - sudo mvn package
    - cd /home/ubuntu/s03p12a112/backend/target/
    - setsid nohup java -jar backend-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 &
    - cd /home/ubuntu/s03p12a112/frontend/
    - sudo npm install
    - sudo npm run build
    - sudo service nginx restart
  after_script:
    - echo 'deployment is done'
  tags:
    - deploy

yaml ํŒŒ์ผ ์„ค๋ช…

  • deploy-to-server

    • Gitlab Runner๋ฅผ ๋“ฑ๋ก ํ•  ๋•Œ ์ง€์–ด์ค€ JOB ์ด๋ฆ„

  • stage

    • ์ด ๊ธ€์˜ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฐ”์™€ ๊ฐ™์ด Gitlab์€ Stage ๋ณ„๋กœ ํŠน์ • ์ž‘์—…๋“ค์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋ฃน์ด ์žˆ๋Š”๋ฐ, ๊ทธ ์ค‘ deploy stage ๋ผ๋Š” ๊ฒƒ

  • only

    • master branch์— event๊ฐ€ ๋ฐœ์ƒ ํ–ˆ์„ ๋•Œ์—๋งŒ pipeline ์ด ํ™œ์„ฑํ™” ๋˜๊ฒŒ ์„ค์ •

  • before_script

    • ๋ง๊ทธ๋Œ€๋กœ runner์— ์˜ํ•ด ์‹คํ–‰๋  shell script ์‹คํ–‰ ์ด์ „์— ์ˆ˜ํ–‰ ๋  script

      • whoami ๋ช…๋ น์–ด

        • Gitlab Runner๋ฅผ ๋“ฑ๋ก ํ•  ๋•Œ Root ๊ณ„์ •์ด ์•„๋‹Œ ๋”ฐ๋กœ ๋งŒ๋“  ๊ณ„์ • (gitlab-runner) ์œผ๋กœ ๋“ฑ๋กํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ์„ค์ •๋˜์–ด์žˆ๋‚˜ ๋ณด๋ ค๊ณ  ์ถ”๊ฐ€ํ•จ!

  • script

    • Gitlab Runner์— ์˜ํ•ด ์‹คํ–‰๋  Shell script

    • backend build ํ›„ ์žฌ๋ฐฐํฌ, front build ํ›„ ์žฌ๋ฐฐํฌ ํ•˜๋Š” ์ˆœ์„œ๋กœ ์‹คํ–‰๋œ๋‹ค!

      • kill $(lsof -t -i:8000)

        • backend server๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํฌํŠธ๋ฒˆํ˜ธ์ธ 8000๋ฒˆ ํฌํŠธ๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค

      • setsid nohup java -jar backend-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 &

      • ๊ฐ€์žฅ ๋งŽ์ด ์‹œํ–‰ ์ฐฉ์˜ค ๊ฒช์€ ๋ถ€๋ถ„์ด๋‹ค

        • ์ฒ˜์Œ์— ๊ธฐ์กด jar ํŒŒ์ผ์„ background์—์„œ ์‹คํ–‰ ์‹œํ‚ค๋„๋ก nohup -jar backend-0.0.1-SNAPSHOT.jar & ๋กœ pipeline์„ ํ™œ์„ฑํ™” ์‹œ์ผฐ๋”๋‹ˆ Job์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ์‹คํ–‰๋˜์—ˆ๋‹ค

        • nohup -jar backend-0.0.1-SNAPSHOT.jar > nohup.out & ๋กœ ๋ณ€๊ฒฝํ–ˆ๋”๋‹ˆ permission denied error ๊ฐ€ ๋‚ฌ๋‹ค

        • ๊ทธ ํ›„๋กœ๋„ ์ˆ˜์ •์— ์ˆ˜์ •์„ ๊ฑฐ์ณ ๊ฒฐ๊ตญ linux directory structure์—์„œ ์žฅ์น˜ ํŒŒ์ผ๋“ค์ด ์ €์žฅ๋˜๋Š” ๊ฐ€์ƒ์˜ ํŒŒ์ผ์‹œ์Šคํ…œ์ธ /dev ๋กœ .out ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค (์‹ค์ œ๋กœ ์ž‘์„ฑ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค! ๋ฌผ๋ฆฌ์  ์šฉ๋Ÿ‰์„ ์ฐจ์ง€ํ•˜์ง€ ์•Š๋Š” directory ์ž„!)

        • ๊ทธ ๊ฒฐ๊ณผ, Runner์˜ Job์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๊ณ , background์—์„œ Jar ํŒŒ์ผ์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค!

  • after_script

    • ๋ง ๊ทธ๋Œ€๋กœ script ์ˆ˜ํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด ์ˆ˜ํ–‰ ๋  script

  • tags

    • ํŠน์ • Tag๊ฐ€ ๋‹ฌ๋ฆฐ Runner์— ๋ช…๋ น์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค

      • Gitlab Runner ๋“ฑ๋ก ์‹œ ์„ค์ •ํ•œ Tag๋ฅผ ์ž˜ ๊ธฐ์–ตํ•ด ๋‘์—ˆ๋‹ค๊ฐ€ ์—ฌ๊ธฐ์— ์ ์œผ๋ฉด ๋œ๋‹ค!

3. Pipeline ์‹คํ–‰์‹œํ‚ค๊ธฐ

.gitlab-ci.yml ํŒŒ์ผ์— ๊ธฐ์žฌํ–ˆ๋“ฏ์ด, master branch์— event๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด pipeline์ด ์‹คํ–‰๋œ๋‹ค

Job ์‹คํ–‰ ๊ฒฐ๊ณผ ํ™•์ธ

  • CI/CD > Pipelines ์—์„œ ์‹คํ–‰๋œ pipeline๋“ค์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค

๋ฐฑ๋งŒ ์Šค๋ฌผ ํ•œ ๋ฒˆ์งธ ์‹œ๋„

  • Pipeline ์„ ํด๋ฆญํ•ด์„œ ๋“ค์–ด๊ฐ€๋ฉด ์‹คํ–‰๋œ Job ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค

  • Job์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

image-20200802155345341

Job succeeded!

+

gitlab-runner ๊ณ„์ •์— Sudo ๊ถŒํ•œ ๋ถ€์—ฌํ•˜๊ธฐ

์ฒ˜์Œ์— Job ์‹คํ–‰ ์‹œ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ gitlab-runner ๊ณ„์ •์— ๋Œ€ํ•œ sudo ๊ถŒํ•œ์ด ์—†์–ด์„œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ–ˆ๋‹ค

sudo visudo
  • ์œ„์˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•œ ๋’ค ์•„๋ž˜์˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค

    gitlab-runner ALL=(ALL) NOPASSWD: ALL

+

Todos

  • ์ด ๋ฐฉ์‹ ๋ง๊ณ  Dockerfile ์„ ์ž‘์„ฑํ•˜๊ณ  docker image๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” Job์„ Gitlab CI/CD๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ณด๊ณ  ์žˆ๋‹ค!

  • Kubernetes๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์•Œ์•„๋ณด๋Š” ์ค‘! ์žฌ๋ฐŒ๋‹น!

Last updated

Was this helpful?