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๋ 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 managerhelm 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๋ฅผ ํ์ธํ ์ ์๋ค

2. .gitlab-ci.yml
ํ์ผ ์์ฑํ๊ธฐ
.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์ด ์ฑ๊ณต์ ์ผ๋ก ์คํ๋๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ ๋ณผ ์ ์๋ค

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?