๐ค ์์งlog ๐ค
[Front-end] CI/CD ๋ณธ๋ฌธ
โฌ๏ธ ๐< ์ง์ง์ง์ง_์ต์ข _ํตํฉ๋ณธ >๐ โฌ๏ธ
CI/CD ๋?
CI ๋? ๊ฐ๋ฐ์๋ฅผ ์ํ ์๋ํ ํ๋ก์ธ์ค์ธ ์ง์์ ์ธ ํตํฉ ( Continuous Integration )
์ดํ๋ฆฌ์ผ์ด์ ์ ์๋ก์ด ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ๊ธฐ์ ์ผ๋ก ๋น๋/ ํ ์คํธ ๋์ด ๊ณต์ Repository์ (ex. git,github) ํตํฉํ๋๊ฒ์ ์๋ฏธํ๋ค.
๋ค์์ ๊ฐ๋ฐ์๊ฐ ์์ ํ ๊ฒฝ์ฐ ๋ ํฌ์งํ ๋ฆฌ์ ์์ด๋ commit๋ค์ด ์ถฉ๋ํ๋ ๊ฒ์ ์๋ํ๋ ๋น๋์ ํ ์คํธ๋ก ๋ฐฉ์งํ ์ ์๋ค.
CD ๋? ์ง์์ ์ธ ๋ฐฐํฌ ( Continuous Deployment )
“์๋์ " ์ผ๋ก ๋ฐฐํฌํ๋๊ฒ์ ์ง์์ ์ธ ์ ๊ณต์ด๋ผ ํ๋๋ฐ, ์ด๊ฒ์ “์๋ํ”ํ๋๊ฒ์ด ์ง์์ ์ธ ๋ฐฐํฌ ( Continuous Deployment ) ์ด๋ค.
๐ ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๋จ๊ณ ๋ถํฐ ๋ฐฐํฌ ๋ ๊น์ง ๋ชจ๋ ๋จ๊ณ๋ค์ ์๋ํ๋ฅผ ํตํด์ ์ฌ์ฉ์์๊ฒ ๋ฐฐํฌ ํ ์์๋๋ก ๋ง๋๋๊ฒ
โ ๊ฐ๋ฐํ์์ ์ฒดํฌํด์ผ๋ ์ฌํญ
- ๋ณ๊ฒฝ์ด ์๋ก์ด ๊ฒฐํจ์ ์ ๋ฐํ์ง ์๋์ง ํ์ธํ๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ก ์ง์์ ํ ์คํธ
- ๋ณด์, ์ฑ๋ฅ ๋ฐ ๊ธฐํ ์ฝ๋ ํ์ง ๋ฌธ์ ๋ฅผ ํ ์คํธํ๋ ์ ์ /๋์ ์ฝ๋ ๋ถ์ ํด
- API ๋ณด์์ ์ํด ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํฌํจํ ์ํํธ-๋ ํํธ(shift-left) ๋ณด์ ์ค์ฒ (์กฐ๊ธฐ๊ฒฐํจ ๊ฐ์ง)
- ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ง์ดํฌ๋ก์๋น์ค์ ๋ํ ๊ด์ฐฐ ๊ฐ๋ฅ์ฑ ํ์ค
- ์ฌ์ฉ์ ์ผ๋ถ์ ๋ํด ์๋ก์ด ๊ธฐ๋ฅ์ ์ผ๊ณ ๋๊ฑฐ๋ ์ ์ดํ๊ธฐ ์ํ ๊ธฐ๋ฅ ํ๋๊น โ
ํ๋ก๋์ ์ ๋ฐฐํฌ ์๋ํ๋ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ๋น์ง๋์ค, ์ต์ข ์ฌ์ฉ์์๊ฒ ์ํฅ์ ๋ฏธ์น๋ ๋งํผ ์ํ์ด ํฌ๊ธฐ ๋๋ฌธ์
๋ฐฐํฌ ํ๋ก์ธ์ค์๋ ์ง์์ ํ ์คํธ์ ์ฒ ์ ํ ์ค๋ฅ์ฒ๋ฆฌ๊ฐ ํฌํจ๋์ด์ผํ๋ค.
โ
โ
AWS ๊ฐ์
- ๊ฒฐ์ ๊ด๋ จ E-mail ๋ก ๋ฐ๊ธฐ ํ์
- MFA ์ฝ๋๋ก ์ด์ค ๋ณด์ ํด์ฃผ๊ธฐ
๐ AWS EC2 ์ธ์คํด์ค ์์ฑ
์ ์ผ๋จผ์ AWS ์ ์ ์ํ EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํด ์ค๋๋ค.
* ์์ฑ์ Resion ์ ํ ํํ ํด์ฃผ์ธ์.
๋ค๋ฅธ Resion์ ๋ด์ฉ์ ์๋ก ๊ณต์ ๋์ง ์์ต๋๋ค.
์ด๋ฆ ์นธ์ EC2์ ์ฉ๋ ํน์ ์ด๋ฆ์ ๊ธฐ.
* ์ถํ ๋ณ๊ฒฝ ๊ฐ๋ฅ
Server OS ์ ํ ํ๊ธฐ
* ๋ณธ๊ธ์์๋ Amazon Linux๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๐ก AWS ์ต์ด ๊ฐ์ ์ ํ๋ฆฌํฐ์ด ์๋น์ค 80~90๊ฐ ์ด์ฉ ๊ฐ๋ฅ. EC2๋ ํ๋ฌ ๊ธฐ์ค 750์๊ฐ์ฉ ๋ฌด๋ฃ๋ก ๊ฐ๋ฅ.
๋จ, EC2๋ ์ธ์คํด์ค ๊ฐ ๋น์ด ์๋ ๋ง๋ค์ด๋์ ์ธ์คํด์ค ์ด ์๊ฐ์ผ๋ก ์ ์ฉ. ex) 10๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ ์ ๊ฐ 75์๊ฐ์ฉ ์ด์ฉ ๊ฐ๋ฅ ๐ก
์ธ์คํด์ค ์ ํ ์ ํ - ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์๋ ์ธ์คํด์ค ์ ํ ์ ํ
* ๋ด๊ฐ ๊ฐ๊ณ ์ ํ๋ ์ปดํจํฐ์ CPU, Memory ๋ฅผ ์ ํํ๋๊ฒ
ํคํ์ด
* ์ธ์คํด์ค์ ์ ์ํ๊ธฐ ์ํ ์ํธํ๋ ํ ํฐ ํน์ ์ํธํ๋ Key-file
๐ ํคํ์ด ์์ฑํ๊ธฐ
์ ํคํ์ด ์์ฑ โก <๋ณธ์ธ์ด ์๋ณํ ์ ์๋ ์ด๋ฆ ์์ฑ> โก ์ ํ, ํ์ผ ํ์ ์ ํ โก ํค ํ์ด ์์ฑ
* Mac OS ์ฌ์ฉ์๋ค์ Putty๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ .pem
Window ์ฌ์ฉ์์ค Putty,Xshell์ ์ด์ฉํ ์์ ์ด๋ผ๋ฉด .ppk๋ฅผ ์ ํ
๋คํธ ์ํฌ ์ค์ ์ ๋์ด๊ฐ์ฃผ๊ธฐ
์คํ ๋ฆฌ์ง๋ 30GB ๊น์ง ๋ฌด๋ฃ์ด๋ฏ๋ก 30GB๋ก ์ค์ ํด์ฃผ๊ธฐ
๊ณ ๊ธ ์ธ๋ถ ์ ๋ณด๋ ๋์ด๊ฐ๊ธฐ
์ธ์คํด์ค ๊ฐ์ <2> ๋ก ์ค์ ํด์ฃผ๊ธฐ
* Jenkins ์ฉ / Nginx ์ฉ ์ด 2๊ฐ ํ์ํจ
์์ฝ ์ ๋ณด ํ์ธํ ์ธ์คํด์ค ์์ โญ๏ธ
๋ง๋ค์ด์ง ์ธ์คํด์ค๋
Docker / Nginx ๋๋ Jenkins / Nginx
๋ณธ์ธ์ด ๊ด๋ฆฌํ๊ธฐ ํธํ ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝํด์ฃผ๊ธฐ.
๐ SSH Client Tool์ ์ด์ฉํด EC2 ์ธ์คํด์ค ์ ์
ํธ๋ฆฌํ๊ฒ ์ธ์คํด์ค ์ ์ํ๋ ค๋ฉด SSH Client Tool์ ์ด์ฉํ๋๋ฐ
๋ค์ํ tool์ด ์๊ธฐ๋๋ฌธ์ ์์ ์๊ฒ ๋ง๋๊ฒ์ ์ ํํ๋ฉด ๋จ
ํ์๊ฐ์ ํด์ฃผ๊ธฐ
์ค์น๊ฐ ์๋ฃ๋์๋ค๋ฉด New Host๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
AWS์์ ๋ง๋ ์ธ์คํด์ค ์ด๋ฆ ์ผ๋ก Label ์ ๋ ฅํ ,
Adress ์นธ์ Ec2 ์ธ์คํด์ค Public IPv4 ์ฃผ์ ์ ๋ ฅ (์์ฑ๋ AWS ์ธ์คํด์ค์์ ํ์ธ ๊ฐ๋ฅ)
EC2 ์ธ์คํด์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก " ec2-user " ์ด๋ผ๋ ๊ณ์ ์ด ๋ง๋ค์ด ์ง๊ณ
๋ก๊ทธ์ธ ๋ฐฉ์์ ID,PW๊ฐ ์๋ KEY (EC2 ํคํ์ดํ ๋ ๋ฐ์ .pemํ์ผ) ๋ก ๋ก๊ทธ์ธ์ ํจ
Password ์ Keys ํด๋ฆญํ (๋ฑ๋กํค๊ฐ ์๋ค๋ฉด) <create a new key> โก
์ด๋ฆ ๋ฑ๋กํ Drag & Drop ๋๋ import from keyfile ๋ก KEY-file (EC2 ํคํ์ดํ ๋ ๋ฐ์ .pemํ์ผ) ๊ฐ์ ธ์ค๊ธฐ
โก (์ํธํ๋ ํ์ผ์ด ์ด๋ ธ๋ค๋ฉด) ์ค๋ฅธ์ชฝ ์๋จ save
๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก Nginx ๋ ๋ง๋ค์ด ์ฃผ๊ธฐ
์ด๋ฐ ํ๋ฉด์ด ๋์๋ค๋ฉด
์ฑ๊ณตโญ๏ธ
โ ๏ธ ERROR โ ๏ธ
๋ง์ฝ ์ด๋ฐ ํ๋ฉด์ด ๋์ค์ จ๋ค๋ฉด ?
Username์ ๋ฐ๊ฟ์ ํ๋ฒ ํด๋ณด์๋ฉด ๋ฉ๋๋ค!
*ec2-user ์ด ๋ง๋ name ์ ๋๋ค. ์์ ์ค์ ํ์๋ฉด ์๋ฌ ๋ฉ๋๋ค.
๐ Docker ์ค์น
* Command ๊ถํ ์์๋๋ ์ปค๋งจ๋ ์์ โจ๏ธ sudo su ์ ๋ ฅํ ์ปค๋งจ๋ ์ ๋ ฅํ๊ธฐ *
โจ๏ธ sudo yum update -y
* ์ต์ด yum Repository๋ฅผ ์ต์ ํ ํด์ค๋๋ค.
โจ๏ธ yum install docker -y
* Docker ์ค์น
โจ๏ธ docker -v
* Docker ๋ฒ์ ํ์ธ
โจ๏ธ sudo service docker start
* Docker ์คํ ํ์ธ
โจ๏ธ usermod -aG docker ec2-user
* Docker์ ์ ์ ๋ฅผ ๋ฑ๋ก
โจ๏ธ exit
* ์ ์ ์ข ๋ฃ ํ ๋ค์ ์ฌ์ ์
โจ๏ธ docker run hello-world
* Docker ๋ช ๋ น์ด๋ฅผ ์คํํด์ ํ ์คํธ
๋์ปค ์ค์น ์๋ฃ โญ๏ธ
๐ Docker ์ Jenkins ์ค์นํ๊ธฐ
โจ๏ธ docker run -itd --name jenkins -p 8085:8080 jenkins/jenkins:lts
* Docker์ Jenkins ๋ฅผ ์ต์ ๋ฒ์ ์ผ๋ก ์ค์นํ๊ณ ์ปจํ ์ด๋๋ก ์คํ
โจ๏ธ docker ps
* ์ ํจ์ค๊ฐ ์๋ํ๋์ง ํ์ธํด์ฃผ๊ธฐ
EC2 ์ธ์คํด์ค์์ Docker ์ธ์คํด์ค ํด๋ฆญํ ํ๋จ์ ๋์ค๋
๋ณด์ โก ๋ณด์๊ทธ๋ฃน ๋ฐ sg-04ab805... ํด๋ฆญ โก ์ธ๋ฐ์ด๋ ๊ท์น โก ์ธ๋ฐ์ด๋ ๊ท์น ํธ์ง โก ๊ท์น ์ถ๊ฐ
์์ <8085> ํฌํธ ์ถ๊ฐํด์ฃผ๊ธฐ
์ธ์คํด์ค ํ์ด์ง๋ก ๋์๊ฐ์ ํผ๋ธ๋ฆญ IPv4 ์ฃผ์๋ฅผ ๊ฐ์ ธ์์, http://ip:8085/ ๋ก ์ ์ํฉ๋๋ค.
* http://๋ด ๋์ปค ํผ๋ธ๋ฆญIPv4์ฃผ์:8085/
์ ํจ์ค์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ผ๊ณ ๋์ค๋๋ฐ, ํจ์ค์๋๋ ์ ํจ์ค ์ปจํ ์ด๋์ ๊ฒฝ๋ก์ ์์ต๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ exec ๋ช ๋ น์ด๋ก ํฐ๋ฏธ๋์์ ์คํ์ค์ธ ์ ํจ์ค ์ปจํ ์ด๋์ ์ ๊ทผํด์ ์ด๋๋ฏผ ํจ์ค์๋๋ฅผ ์ฐพ์๋ด ๋๋ค.
โจ๏ธ docker exec -it jenkins /bin/bash
โจ๏ธ cat /var/jenkins_home/secrets/initialAdminPassword
ํจ์ค์๋๋ฅผ ์ ๋ ฅํ๊ณ ํ๋ฌ๊ทธ์ธ์ ์ค์นํด์ค๋๋ค.
ํ๋ฌ๊ทธ์ธ์ด ์ค์น๋๋ฉด ์ด๋๋ฏผ ๊ณ์ ์ ๋ง๋ค๊ฒ๋ฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ์ด ์ค์น๋๊ณ ์ด๋๋ฏผ ๊ณ์ ๋ง๋ค์ด ์ค๋๋ค.
Jenkins ์ ์ ์๋ฃ โญ๏ธ
๐ Jenkins ์ Gitea ์ฐ๋ ํด์ฃผ๊ธฐ
Jenkins ๋์๋ณด๋์์ Jenkins ๊ด๋ฆฌ๋ก ๋ค์ด๊ฐ์ฃผ์ธ์.
Jenkins ๊ด๋ฆฌ ์์ ํ๋ฌ๊ทธ์ธ ๊ด๋ฆฌ์ ๋ค์ด๊ฐ์ฃผ์ธ์.
- Multibranch Scan Webhook Trigger
- Parameterizwd Trigger
- jQuery
- Delivery Pipeline
- Gitea Plugin
- NodeJS
ํ๋ฌ๊ทธ์ธ ๊ด๋ฆฌ โก ์ค์น ๊ฐ๋ฅ โก ๊ฒ์ ์ผ๋ก ํด๋น ํ๋ฌ๊ทธ์ธ๋ค ์ค์นํด์ฃผ์ธ์.
๋ค์ Jenkins ๊ด๋ฆฌ โก ์์คํ ์ค์ ์์ ์คํฌ๋กค ๋ด๋ฆฌ๋ค๋ณด๋ฉด
Gitea Server ์ค์ ์ด ๋์ค๊ณ ์์ฑํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
* Name, URL (Gitea ์ฃผ์), Manage hooks ์ฒดํฌโ ํ Credentials ์ ์ฉ (์์ผ๋ฉด + Add ํด๋ฆญ)
* Server URL ์์ฑํ ๋ฐ์ Gitea Version ์ด ๋ ์ผ ์ ์์ ์ผ๋ก ์ฐ๋ ๋๊ฒ์ ๋๋ค.
๐ Gitea Token ๋ง๋ค๊ธฐ
Gitea ์ ์ํ ์ฐ์ธก ์๋จ ํ๋กํ โก ์ค์ ์ ๋ค์ด๊ฐ์ค๋๋ค.
์ดํ๋ฆฌ์ผ์ด์ โก ํ ํฐ์ด๋ฆ ์ ๋ ฅํ ํ ํฐ์์ฑ โก ๊ฐ๋ ค์ง ๋ถ๋ถ ํ ํฐ์ ๋ณต์ฌํด๋์์ฃผ์ธ์.
* ํ ํฐ์ ์์ฑ๋ ๋ง๊ณ ๋ค์ ๋ณผ์ ์์ผ๋ ์์ ํ๊ณณ์ ๋ณต์ฌ ํด๋์๋ฉด ๋ฉ๋๋ค.
๋ค์ Jenkins๋ก ๋์์์ Credentials-Gitea์ฉ ์ผ๋ก ๋ง๋ค์ด์ฃผ์ธ์.
* Kind ์์ Gitea Personal Access Token ์ ํํ ํ ํฐ ์ ๋ ฅํด์ฃผ๊ธฐ
Credentials ๊น์ง ์ ํํด์ค ๋ค ์ผ์ชฝ ํ๋จ ์ ์ฅ ๋๋ฌ์ฃผ๊ธฐ
Jenkins ๋์๋ณด๋ ์์ <์๋ก์ด Item> ์ผ๋ก ๋ค์ด๊ฐ๋๋ค.
Item name ์์ฑํ Multibranch Pipeline ์ผ๋ก ๋ง๋ค์ด์ฃผ์ธ์.
name ๊ณผ ์ค๋ช ์์ฑํ Branch Sources ์ Gitea ์ ํํ ์ ๋ณด ์ ๋ ฅํด์ฃผ๊ธฐ
* Gitea ๊ฐ ๋จ์ง ์๋๋ค๋ฉด gitea plugin ์ค์น ํด์ผํฉ๋๋ค.
gitea server ์ฐ๊ฒฐ (์์คํ ์ค์ ์์ ์ ๋ ฅํ Gitea server) โก Credentials ์ ํ โก
Owner (Gitea ๋ณธ์ธ name) ๋ฑ๋กํ๋ฉด ํ๋จ์ ๋ ํฌ์งํ ๋ฆฌ๊ฐ ์๋์ผ๋ก ๋ฑ๋ก ๋ฉ๋๋ค.
์ผ์ชฝ ํ๋จ์ Save ํด๋ฆญ
์ฐ๋ ์๋ฃ โญ๏ธ
๐ Jenkins File
๋ง๋ค์ด๋ Multibranch pipeline repository ์ด๋ฆ์ ํ์ดํ ํด๋ฆญ โก Configure๋ก ๋ค์ด๊ฐ์ฃผ์ธ์.
์ฐ๊ฒฐ ํด๋์๋ Branch Sources ์ Gitea server ์๋์ Behaviours ์ Property strategy ๋ฅผ ์ฌ์ง๋๋ก ์ค์
* ์๋ Add ๋ฒํผ ํด๋ฆญํ Filter by name (with regular expression) ์ถ๊ฐ ํ " (main.*) " ์์ฑ
Build Configuration์ Jenkins-file์ด default ๊ฐ์ผ๋ก ๋์ด์์์ผ๋ก ๊ทธ๋๋ก ๋๊ณ ๋์ด๊ฐ์๋ฉด ๋ฉ๋๋ค.
Multibranch Scan Webhook Trigger ํ๋ฌ๊ทธ์ธ์ ์ค์น ํ๋ค๋ฉด
Scan Multibranch Pipeline Triggers ์ด ์๊ธฐ๊ณ ๋๋ค ์ฒดํฌ๋ฐ์คโ ์ ํํ ์ฌ์ง๊ณผ ๊ฐ์ด ์์ฑ
* Trigger token ์ด๋ฆ์ Gitea์์ webhook ์ค์ ์ ํ ๋ header์ ๋ด์ token์
์ง์ ํด์ฃผ๋ ๊ฑฐ๊ธฐ ๋๋ฌธ์ ์์ ์ด ์ํ๋ ์ด๋ฆ์ผ๋ก ์ง์ ํด์ฃผ๋ฉด ๋จ
์ผ์ชฝ ํ๋จ Save ํด๋ฆญ
Jenkins ์ฐ๋์ ๋์์ง๋ง Jenkinsfile not found ๋ผ๊ณ ๋จ์ จ์ ๊ฒ๋๋ค.
VSCODE์ ํด๋ ๋ง๋ค์ด์ฃผ์๊ณ
์ํ์ผ โก Jenkinsfile ์ ๋ง๋ค๋ฉด ์์ ์จ์ผ๊ตด ๋ชจ์์ ํ์ผ์ด ์์ฑ๋จ
๐ Gitea์ VSCODE๋ฅผ ๋จผ์ ์ฐ๋ํด์ฃผ์ ์ผ ํฉ๋๋ค.
Gitea ์์ ์๋ก์ด ๋ ํฌ์งํ ๋ฆฌ ์์ฑํ VSCODE์์ ์ฐ๋ํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
def FAILED_STAGE
pipeline {
agent any
tools {
nodejs "node16.10.0"
}
stages {
// pull >> test >> build >> sonarqube >> deploy
stage("Checkout") {
steps{
echo "checkout start"
script{
FAILED_STAGE=env.STAGE_NAME
// source code management
// ์์ดํ
์์ ์ฐ๊ฒฐํ git ์ ํตํด ์์ค๋ฅผ ๋ฐ์์จ๋ค.
checkout scm;
}
echo "checkout end"
}
}
stage('Lint') {
steps {
script {
FAILED_STAGE=env.STAGE_NAME
sh "npm install"
sh "npm run lint"
}
}
}
stage('Test') {
steps {
script {
FAILED_STAGE=env.STAGE_NAME
sh 'npm run test'
}
}
}
stage("Build") {
steps {
script{
FAILED_STAGE=env.STAGE_NAME
}
sh "npm run build"
}
}
stage("Sonarqube") {
steps{
script{
FAILED_STAGE=env.STAGE_NAME
def scannerHome = tool 'sonarqube-scanner';
withSonarQubeEnv(๐credentialsId:"SONARQUBE",installationName:'sonarqube'๐) {
sh "${scannerHome}/bin/sonar-scanner"
}
}
}
}
// stage('Quality Gate'){
// steps{
// timeout(time: 1, unit: 'MINUTES') {
// script{
// echo "Start"
// FAILED_STAGE=env.STAGE_NAME
// def qg = waitForQualityGate()
// echo "Status: ${qg.status}"
// if(qg.status != 'OK') {
// echo "NOT OK Status: ${qg.status}"
// error "Pipeline aborted due to quality gate failure: ${qg.status}"
// } else{
// echo "OK Status: ${qg.status}"
// }
// echo "End"
// }
// }
// }
// }
stage("Transfer") {
steps([$class:"BapSshPromotionPublisherPlugin"]){
script{
FAILED_STAGE=env.STAGE_NAME
sshPublisher(
publishers:[
sshPublisherDesc(
configName:"nginx",
verbose:true,
transfers:[
sshTransfer(
sourceFiles:"**/**",
excludes:"**/node_modules/**",
execCommand:"chmod +x /home/ec2-user/deploy/deploy.sh"
)
],
)
]
)
}
}
}
stage("Deploy") {
steps([$class:"BapSshPromotionPublisherPlugin"]){
script{
FAILED_STAGE=env.STAGE_NAME
sshPublisher(
publishers:[
sshPublisherDesc(
configName:"nginx",
verbose:true,
transfers:[
sshTransfer(
execCommand:"/home/ec2-user/deploy/deploy.sh"
)
]
)
]
)
}
}
}
}
// post {
// success {
// discordSend description: "์๋ฆผํ
์คํธ",
// footer: "ํ
์คํธ ๋น๋๊ฐ ์ฑ๊ณตํ์ต๋๋ค.",
// link: env.BUILD_URL, result: currentBuild.currentResult,
// title: "ํ
์คํธ ์ ํจ์ค job",
// webhookURL: "https://discord.com/api/webhooks/1033587512351916064/P4w8KClDjvlW3q7DFoK9MgbsN0P6mS1LRXKOKQ7Rkj9FVoJP7oZQLS6WWLyHnsWYRtIF"
// }
// failure {
// discordSend description: "${env.JOB_NAME} ์๋ฆผํ
์คํธ",
// footer: "ํ
์คํธ ๋น๋๊ฐ ์คํจํ์ต๋๋ค.",
// link: env.BUILD_URL, result: currentBuild.currentResult,
// title: "ํ
์คํธ ์ ํจ์ค ${FAILED_STAGE}",
// webhookURL: "https://discord.com/api/webhooks/1033587512351916064/P4w8KClDjvlW3q7DFoK9MgbsN0P6mS1LRXKOKQ7Rkj9FVoJP7oZQLS6WWLyHnsWYRtIF"
// }
// // always {
// // echo 'I will always say Hello again!'
// // }
// }
}
ํ์ผ์ ์ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ๊ณ push
* ์ค๊ฐ์ SonarQube stage๋ ๋ณธ์ธ๊บผ์ ๋ง๊ฒ ์์ ํ push ํด์ฃผ๊ธฐ
Gitea Repository ์ Commit ๋๊ฒ ํ์ธ
Jenkins ๋ก ๋์๊ฐ์ ๋ค์ Scan + Log ํด๋ณด๊ธฐ
Jenkins-file Found ์๋ฃ โญ๏ธ
๐ Webhook ์ค์
Gitea ์์ ๋ณธ์ธ ๋ ํฌ์งํ ๋ฆฌ๋ก ๋ค์ด๊ฐ๋ค
์ฐ์ธก์ ์ค์ โก ์นํ โก webhook ์ถ๊ฐ โก Gitea ํด๋ฆญ
URL ์๋ http://์ ํจ์ค์ฃผ์/multibranch-webhook-trigger/invoke?token=(Trigger token)
* (Trigger token) ์๋ ์์ ์ค์ ํ๋ Scan by webhook ์ Trigger token ์ ์ด์ฃผ๊ธฐ
Webhook ๊ฐฑ์
webhook ๊ฐฑ์ ๋ฐ
" ์ ๋ฌ ์ํ " ๋ฒํผ์ ํตํด test๋ฅผ ์งํ
๐ก ์ค๋ฅ๊ฐ ๋๋ ์ด์ ๋?
Gitea ์ฌ์ค๋ง์ ์ด์ฉ์ค์ธ ์ํ๋ผ EC2์์ ์ธ๋ฐ์ด๋๊ท์น ์์ ํฌํธ ๋ฅผ Public์ผ๋ก ์ด์ด์ค์ผํฉ๋๋ค.
์นํ ์ฑ๊ณต โญ๏ธ
๐ Docker์ SonarQube ์ค์นํ๊ธฐ
SonarQube๋ SSH๊ฐ ์๋ ๋ก์ปฌ์ ์ค์นํด์ผ ํฉ๋๋ค.
๊ทธ๋์ ํฐ๋ฏธ๋ ์ด์ฉ์ SSH ํฐ๋ฏธ๋์ด ์๋ (mac ๊ธฐ์ค) iTerm ์ผ๋ก ์ค์นํ๋ฉด ๋ฉ๋๋ค.
Docker Desktop ์ค์น
Docker Hub ์ ์ํ ์ผ์ชฝ ์๋จ ๊ฒ์ ์ฐฝ์ " sonarqube " ๊ฒ์
์๋ํ๋ธ ๊ณต์ ๊ณ์ ์ด๋ฏธ์ง์ ๋ช ๋ น์ด๊ฐ ๋์ด
+์ถ๊ฐ๋ก
docker pull sonarqube:lts
โ๋ผ๊ณ ์ ๋ ฅํ ์ค์น๋์ค์ ์๋ฌ๊ฐ ๋ฌ๋ค๋ฉด (with M1)
docker pull --platform linux/amd64 sonarqube:ltsโ
์ต์ ์ ์ค์ linux์ ๋ช ์ํด์ผ ์ ์ ๋ค์ด๋ก๋๊ฐ ๋ฉ๋๋ค.
โ
๋ง์ผ ์ด์์ด ๋ ์์ ๊ฒฝ์ฐ dockerhub์ public์ผ๋ก ์ฌ๋ ค์ง m1์ฉ ์๋ํ๋ธ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ด๊ฑด ๊ณต์์ผ๋ก ์ ๊ณต๋๋ ๊ฒ ์๋๋ผ, ์ ๋ณด๊ณ ๋ฐ์์ผํฉ๋๋ค.
โ
m1์ฉ ์ผ๋ก๋ ์๋์ ๋ค๋ฉด?
mwizner์ผ๋ก ์ฌ๋ผ๊ฐ ์๋ํ๋ธ๋ฅผ ์๋ ์ถ๊ฐํ ๋ช ๋ น์ด๋ก ์ถ๊ฐํด์ ์ฌ์ฉํด๋ณด์๋ฉด ๋ฉ๋๋ค.
docker run -d -p 80:80 --name sonarqube sonarqube:lts
docker run -d -p 9000:9000 mwizner/sonarqube:8.7.1-community
Docker desktop gui์์๋ ๋ด๊ฐ ๋ฐฉ๊ธ ๋ง๋ ์ปจํ ์ด๋๊ฐ ๋์ํ๋ log๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ณผ ์๊ฐ ์์ต๋๋ค.
๐
no matching manifest for linux/arm64/v8 in the manifest list entries
๋ผ๋ ์ค๋ฅ ๋ฐ์์
โจ๏ธ docker pull --platform linux/amd64 sonarqube
latest ํ๊ทธ ๊น์ง ์๋ฃ
๐
โจ๏ธ docker images
* sonarqube ์ด๋ฏธ์ง๊ฐ ๋ฐ์์ง๊ฒ์ ํ์ธํ ์ ์์
โจ๏ธ docker run -d --name sonarqube -p 9000:9000 sonarqube
* ์๋ํ๋ธ ์ปจํ ์ด๋ ์คํ
๐ -d ์ต์ ์ ํตํด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํ๊ณ
-- name ์ต์ ์ผ๋ก sonarqube ๋ผ๊ณ ๋ช ๋ช
-p ์ต์ ์ผ๋ก ํฌํธ๋ฅผ ์ค์ ๐
โจ๏ธ docker ps
* sonarqube ์ปจํ ์ด๋๊ฐ ์คํ๋๊ณ ์๋๊ฒ์ ํ์ธ
๐
๐ ์ ํจ์ค์์ ์๋ํ๋ธ๋ฅผ ๋น๋ํ๊ฒ๋๋ฉด EC2 ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ๋ถ์กฑ์ผ๋ก ๋น๋๊ฐ ๋ฉ์ถ๊ฒ ๋ ์ ์์
๊ทธ๋์ ๋ฏธ๋ฆฌ ์ค์๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์ ํด๋๋ฉด ์ด๋ฅผ ๋ฐฉ์งํ ์ ์์
SSH Docker ํฐ๋ฏธ๋์ ๋ค์ด๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ฃผ๊ธฐ
โจ๏ธ sudo dd if=/dev/zero of=/mnt/swapfile bs=1M count=2048
โจ๏ธ sudo mkswap /mnt/swapfile
โจ๏ธ sudo swapon /mnt/swapfile
๋ง์ฝ sudo not command ์๋ฌ๊ฐ ๋์จ๋ค๋ฉด
โจ๏ธ apt-get install sudo -y
๋ฅผ ๋จผ์ ์คํํ๊ณ ๋ค์ ์งํํ๊ธฐ
๐
Docker Desktop ์ Sonarqube ์ปจํ ์ด๋๊ฐ ์์ฑ๋๊ฒ์ ํ์ธ
๋นจ๊ฐ๋ณ ํ์๋ถ๋ถ์ โถ๏ธ ํด๋ฆญ ํ
* ์ฌ์ง ์์ผ๋ก โผ๏ธ ๋ก ๋์ด ์์ง๋ง Run ์์ ํ์ง ์์ผ์ ๋ถ๋ค์ โถ๏ธ ๋ก ๋ธ
์๋ํ๋ธ ์ปจํ ์ด๋๋ฅผ ๋๋ฌ๋ณด๋ฉด
์ค์น๊ฐ ์งํ ๋๊ณ ์๋๊ฒ์ ํ์ธ
* ์ค๊ฐ์ค๊ฐ ์ ๊น ๋ฉ์ท๋ค๊ฐ ๊ณ์ ์ค์น๊ฐ ๋๊ณ ์๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋
๋์ด์ ์ค์น๊ฐ ์งํ๋์ง์์๋ ์ฏค ๋ธ๋ผ์ฐ์ ์ ์ํ๋๊ฒ์ ์ถ์ฒ
{ ๋ณธ์ธ ๊ณต์ธ IP }:9000 ํน์ localhost:9000
์ผ๋ก ์ ์
* mac ์์ ๊ณต์ธIP ์ปค๋งจ๋ โจ๏ธ curl ifconfig.me
+ ๊ณต์ธ IP๋ ์ธ๋ฐ์ด๋ ๊ท์น์์ ์ค์ ํด์ฃผ์ ์ผ ํฉ๋๋ค.
๋ก๋ฉ์ด ์๊ฐ์ด ์ข ๊ฑธ๋ฆฌ๋ ๊ธฐ๋ค๋ ค์ฃผ์ธ์
์ค์น๊ฐ ๋๋๊ณ ์คํ์ด ๋๋ค๋ฉด admin / admin ์ผ๋ก ๋ก๊ทธ์ธ
๋ก๊ทธ์ธ ํ๊ณ ๋๋ฉด Password ๋ณ๊ฒฝ์ฐฝ์ด ๋์ค๊ณ Password ๋ณ๊ฒฝํด์ฃผ๊ธฐ
์ค์น ์๋ฃ โญ๏ธ
๐ Jenkins ์ SonarQube ์ฐ๋ํ๊ธฐ
Jenkins ๊ด๋ฆฌ์์ ํ๋ฌ๊ทธ์ธ ๊ด๋ฆฌ๋ก ๋ค์ด๊ฐ์ฃผ์ธ์.
SonarQube Scanner for Jenkins ์ค์น
* SonarQube Scanner ๋ผ๊ณ ๋์๋ OK
๋ค์ Jenkins ๊ด๋ฆฌ์์ Global Tool Configuration ํด๋ฆญ
๋ด๋ฆฌ๋ค๋ณด๋ฉด SonarQube Scanner ์์ Add SonarQube Scanner ํด๋ฆญ
Name ์ง์ ํด์ฃผ๊ณ version ๋ ์ต์ ๋ฒ์ ์ผ๋ก ์ ํ โก ์ผ์ชฝ ํ๋จ SAVE
๐ SonarQube ํ๋ก์ ํธ ์์ฑ
* ๋ด ์๋ํ๋ธ ์คํํ ์๋ฒ ์ ์์ด ์ธ๋ถ์์ ์ ๋๋์ง ํ์ธ ํด๋ด์ผ ํฉ๋๋ค.
์ธ๋ฐ์ด๋ ์ค์ ์ ํด์ค์ผํ ์ ๋ ์์ต๋๋ค.
์๋ํ๋ธ ์คํ์์ผ์ฃผ๊ณ , Gitea๊ฐ ์๊ธฐ์ Manually ๋ก ์ ํ
Name ๊ณผ Key ์์ฑํ Set Up ํด๋ฆญ
์ฌ๊ธฐ๋ Gitea ๊ฐ ์์ด์ Other CI ํด๋ฆญ
Token name ์ง์ ํ Generate
Token ์์ฑ ์๋ฃ โก Continue ํด๋ฆญ
Others โก macOS ์ ํํ ๋์ค๋๊ฒ ํ์ธ (ํ์ธ๋ง ํ์ ๋ ๋ฉ๋๋ค. ๋ฐ๋ก ์ค์น ์ํ์ ๋ ๋์.)
Jenkins ๋ก ๋์์ค์ ์ Jenkins ๊ด๋ฆฌ โก Security ์ Manage Credentials ํด๋ฆญ
Stores scoped to Jenkins ์์ (global) โก Add credentials ํด๋ฆญ
๐ Kind = Secret text
๐ Scope = Global
๐ Secret = ์๋ํ๋ธ์์ ํ๋ก์ ํธ ์์ฑ์ ๋ง๋ ํ ํฐ
๐ ID ์ Description ์ ์์๋ก ์ง์
Create ํด๋ฆญ
Jenkins ๊ด๋ฆฌ โก ์์คํ ์ค์ ํด๋ฆญ
๋ด๋ฆฌ๋ค๋ณด๋ฉด SonarQube Servers ๊ฐ ๋์ค๋ฉด Environment variables ์ฒดํฌโ ํ Add SonarQube ํด๋ฆญ
๐ Name = ์์์ง์
๐ Server URL = ๋ณธ์ธ ์๋ํ๋ธ URL
* 9000 ํฌํธ ๋ค์ </> ๊ฐ ๋ถ์ผ๋ฉด ์๋จ
๐ Server authentication token = Credentials ์์ ์์ฑํ ํ ํฐ (์ด๋ฏธ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ์ ํํ๋ฉด ๋จ)
์ผ์ชฝ ํ๋จ SAVE ํด๋ฆญ
VSCODE ์์ Jenkinsfile ๊ณผ ๊ฐ์ ํด๋ ๋ด์ sonar-project.properties ํ์ผ ์์ฑ
# must be unique in a given SonarQube instance
sonar.projectKey=my:project ๐ ๋ณธ์ธ ์๋ํ๋ธ ํ๋ก์ ํธ ์ด๋ฆ ์ ๊ธฐ ๐
# --- optional properties ---
# defaults to project key
#sonar.projectName=My project
# defaults to 'not provided'
#sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Defaults to .
#sonar.sources=.
# Encoding of the source code. Default is default system encoding
#sonar.sourceEncoding=UTF-8
์์ฑํ Gitea์ push ํด๋๊ธฐ
Jenkins Plugin ๊ด๋ฆฌ์์ NodeJS ์ค์น ์ํ์ จ๋ค๋ฉด ์ค์นํด์ค๋๋ค. ( VSCODE npm build์ ํ์ํจ )
Jenkins ๊ด๋ฆฌ โก Global Tool Configuration ์ ๋งจ๋ฐ NodeJS ์ค์ ํด์ฃผ๊ธฐ
Build ์ฑ๊ณต โญ๏ธ
๐ Dockerfile ์ถ๊ฐํ๊ธฐ
Jenkins ์์ ๋์ปค ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋์ปค์ ๋์ปค ํ์ดํ๋ผ์ธ ํ๋ฌ๊ทธ์ธ์ ์ค์น ํด์ฃผ์ ์ผ ํฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ ์์ด ์ฌ์ฉํ๊ฒ ๋๋ฉด ํ์ดํ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ด์์ ๋์ปค ๊ด๋ จ ์ค์ ์ด ์ธ์๋์ง ์์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
โ
#๊ธฐ์กด node 16๋ฒ์ ์ ์ด๋ฏธ์ง๋ก๋ถํฐ ์๋ก์ด ์ด๋ฏธ์ง ์์ฑํจ์ ์ง์
FROM node:16-alpine
#dockerfile์ ์์ฑ/๊ด๋ฆฌํ๋์ฌ๋
MAINTAINER ๐๋ณธ์ธ ์ด๋ฆ <๋ณธ์ธ ์ด๋ฉ์ผ>๐
# ์ด๋ฏธ์ง๋ด์ /app ๋๋ ํ ๋ฆฌ ์์ฑ
# ์ปจํ
์ด๋ ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก root๊ถํ์ผ๋ก ๋ง๋ค์ด์ง
# ๋ง์ผ, ์ด์๊ณ์ ์ ๋ณ๋๋ก ๋ง๋ค์ด ๊ด๋ฆฌํ๋ค๋ฉด ํด๋ ์์ ์ ํน์ ๊ถํ์ ๋ํ ์ค์ ๋ ํด์ผ๋จ.
RUN mkdir -p /app
# ์ด๋ฏธ์ง๋ด์ /app ๋๋ ํ ๋ฆฌ๋ฅผ WORKDIR ๋ก ์ค์
WORKDIR /app
# ํ์ฌ Dockerfile ์๋ ๊ฒฝ๋ก์ ๋ชจ๋ ํ์ผ์ /app ์ ๋ณต์ฌ
COPY ./ /app
# ์คํํ๋ ์ปจํ
์ด๋ ์์์ work dir์ ์๋ package.json์ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ ์ค์น
RUN npm install
#ํ๊ฒฝ๋ณ์ ์ค์ : ์ด์ or ๊ฐ๋ฐ
ENV NODE_ENV production
# ์ปจํ
์ด๋๊ฐ ํ๊ฒ๋ ์คํ ๋ช
๋ น ์ ์ธ.
# RUN์ ์ด๋ฏธ์ง ๋น๋ ์ค ์คํ. ENTRYPOINT ์ CMD๋ ์ด๋ฏธ์ง ๋น๋ ํ ์ปจํ
์ด๋ ์คํ์์ ์ ์ดํ
# ENTRYPOINT ์ CMD ์ฐจ์ด์ ์,
# ENTRYPOINT๋ ์ปจํ
์ด๋๊ฐ ์ํ๋ ๋ ๋ฐ๋์ ์ง์ ํ ๋ช
๋ น์ ์ํ๋๋๋ก ์ง์
# CMD๋ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ๋ ํ๋ผ๋ฏธํฐ์ ๋ฐ๋ผ ๋ณ๋๊ฐ๋ฅ
# ์ถํ ๋๊ฐ์ ๋ช
๋ น์ด ํ
์คํธ ํ์
CMD ["npm","start"]
Dockerfile ๋ ๊ฐ์ด ๋ง๋ค์ด์ ์ ์ฝ๋๋ก push ํด์ฃผ๊ธฐ
* ์ฝ๋ ์ค๊ฐ์ ๐๋ถ๋ถ์ ๋ณธ์ธ ์ด๋ฆ <๋ณธ์ธ ์ด๋ฉ์ผ์ฃผ์> ์ ์ด์ฃผ๊ธฐ
๐ Jenkins ์์ ์๊ฒฉ ๋ฐฐํฌ ํ๊ธฐ
mkdir /home/ec2-user/deploy
SSH docker ํฐ๋ฏธ๋์์ deploy ํด๋๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.
์ ํจ์ค์์ npm build๋ฅผ ์งํ์,
์ปดํ์ผ์ด ์๋ฃ๋ ํ์ผ๋ค์ ์ค์ ์๋น์ค ํ ์ ์๋๋ก ์ด์๋
์๋ฒ์ ์๋์ผ๋ก ์ด๋ > ์คํ๋๊ณ ์๋ ์๋ฒ์ ์์ ํ ํ์ผ ๋ฐ์ > ์ฌ์ดํธ์์ ๋ณด์ฌ์ผํฉ๋๋ค.
Jenkins Plugin ๊ด๋ฆฌ์์ Publish over SSH ํ๋ฌ๊ทธ์ธ์ ์ค์น ํด์ค๋๋ค.
๊ทธ๋ฌ๋ฉด Jenkins ๊ด๋ฆฌ์ ์์คํ ์ค์ ์ ์ผ ํ๋จ์ SSH Server ํญ๋ชฉ์ด ์ถ๊ฐ๋ฉ๋๋ค.
SSH ์ ๋ง๋ค์ด๋ Nginx ์๋ฒ ์ ๋ณด ์ ๋ ฅํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
๐ Name : nginx
๐ Hostname: ์๋ฒ ์ฃผ์(ip)
๐ Username: ec2-user
๐ Remote Directory : /home/ec2-user/deploy
ํ๋จ์ Use passwoard authentication, or ....์ต์ ์ ์ฒดํฌโ ํ๊ณ
Nginx ์๋ฒ ๋ง๋ค๋ ์ฌ์ฉํ AWS key ๋ถ์ฌ๋ฃ๊ธฐ ํด์ค๋๋ค.
* SSH ์์ Nginx ์๋ฒ ์ ๋ณด ์์ ๋ค์ด๊ฐ์๋ฉด,
key ์ค์ ํด์ฃผ๋๊ณณ์์ +new ํด๋ฆญํ AWS ์์ ๋ง๋ ํค ํ์ผ import ํด์ฃผ์๊ณ
private key ๋์ ๋์ค๋ key ๋ณต๋ถ ํ์๋ฉด ๋ฉ๋๋ค.
๐ Docker Compose ์ Nginx ์ค์น
docker compose :
๋์ปค ์ด๋ฏธ์ง๋ก ๋ง๋ค์ด์ง ์ปจํ ์ด๋๋ค์ ๋ง๋ค๊ณ ์คํํ ๋
์ฐ๋ฆฌ๋ ํฌํธ๋ผ๋์ง ์ฌ๋ฌ ์ต์ ๋ค์ ๊ธฐ์ตํ๊ณ ์์ด์ผํ๊ณ ๋ง์ผ ํ๋๊ฐ ์๋๋ผ ์ฌ๋ฌ ์ปจํ ์ด๋๋ค์ ๊ด๋ฆฌ๋ฅผ ํด์ผ๋๋ค๊ณ ํ๋ฉด
์ฌ๊ฐ ๋ถํธํ์ผ์ด ์๋ ์ ์๋ค.
ํ๋์ ์ค์ ํ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก, ์กฐ๊ธ ๋ ์ฌ์ฉ์์๊ฒ ํธ๋ฆฌํ๋๋ก ์ ๊ณตํ๋๊ฒ์ด
docker์ ๊ธฐ๋ฅ ์ค ํ๋์ธ docker compose ์ด๋ค.
$ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
$ mkdir -p $DOCKER_CONFIG/cli-plugins
$ curl -SL https://github.com/docker/compose/releases/download/v2.12.0/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
SSH docker ์๋ฒ์
โจ๏ธ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
โจ๏ธ mkdir -p $DOCKER_CONFIG/cli-plugins
โจ๏ธ curl -SL https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
์คํ ๊ถํ ๋ถ์ฌ๋ฅผ ํด์ค๋๋ค.
docker compose version
๋์ปค ์ปดํฌ์ฆ ๋ฒ์ ํ์ธ
โจ๏ธ docker compose version
๐ Docker ๋ก Nginx ์ค์น
Nginx :
๋์์ ์ ์ฒ๋ฆฌ์ ํนํ๋ ์น ์๋ฒ ํ๋ก๊ทธ๋จ์ด๋ค.
apache๋ณด๋ค ๋์์ด ๋จ์ํ๊ณ ์ ๋ฌ์ ์ญํ ๋ง ํ๊ธฐ ๋๋ฌธ์ ๋์ ์ ์์ฒ๋ฆฌ์ ํนํ๋์ด์๋ค.
๋ฆฌ๋ฒ์ค ํ๋ก์ :
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๊ฐ๋ก์ฑ์ ์ค๊ฐ์ ์น์๋ฒ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ์์ ๋ค์ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๋ค.
์ค์ ์ ๋ฐ๋ผ์ ๋ค์ค ์น์๋ฒ์ ์ฐ๊ฒฐํด์ ์ฌ์ฉํ ์ ์์ด์ ๊ณผ๋ถํ๋ฅผ ๋ง์ ์ ์๋ค.
๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ๋ ๋ก๋๋ฐธ๋ฐ์ฑ (๋ถํ๋ฅผ ๋ถ์ฐ=ํธ๋ํฝ๊ด๋ฆฌ)์ ์ฌ์ฉ๋๋ค
docker pull nginx
SSH docker ์ Nginx ์ด๋ฏธ์ง ๋ค์ด๋ฐ๊ธฐ
docker run -d -p 80:80 --name nginx nginx
์ปจํ ์ด๋ ์คํ
โจ๏ธ docker ps
๋ก ์ด๋ฏธ์ง ์คํ ํ์ธ
AWS Nginx ์ธ์คํด์ค์ ํผ๋ธ๋ฆญIPv4 ๋ก
์น๋ธ๋ผ์ฐ์ ์ ์ ์ํ๋ฉด
Welcome to nginx! ํ์ด์ง๊ฐ ๋์จ๋ค โญ๏ธ
* AWS ์๋ฒ ์ธ๋ฐ์ด๋ ๊ท์น์ 80ํฌํธ ์ถ๊ฐํด์ค์ผํจ
โ
'๐ DevOps' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CI/CD study] - 13. Docker-Compose ์ Nginx ์ค์น (0) | 2022.10.19 |
---|---|
[CI/CD study] - 12. code coverage ( Jest ) ์ค์น ํ ์คํธ (1) | 2022.10.14 |
[CI/CD study] - 11. NPM Build (0) | 2022.10.14 |
[CI/CD study] - 10. Jenkins์ Sonarqube ์ฐ๋ํ๊ธฐ (0) | 2022.10.14 |
[CI/CD study] - 9. Jenkins File (0) | 2022.10.14 |