๐ ์ ํจ์ค ํํ ๋ฆฌ์ผ ๋ด์ฉ ์ ๋ฆฌ
Node + React ๋ก ๋ง๋ ์น์ ํ๋ฆฌ์ผ์ด์ ์
Docker + Jenkins๋ก CI/CD ํด๋ณด๊ธฐ ์ํ ์ํ ํ๋ก์ ํธ.
1. ๋์ปค๋ฅผ ์ค์นํ๋ค.
2. ๋์ปค Bridge network ๋ฅผ ๋ง๋ ๋ค.
docker network create jenkins
3. Jenkins nodes ๋ด๋ถ์์ `Docker commands`๋ฅผ ์คํํ๊ธฐ ์ํด์ `docker:bind` ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์คํ.
- ์ฌ์ฉํ๋ ํฐ๋ฏธ๋์ ๋ฐ๋ผ ์ปค๋งจ๋ ๊ฐํ ๋ฌธ์๊ฐ ๋ค๋ฆ.
bash - \, powershell - `, ๋ช ๋ นํ๋กฌํธ - ^ - Windows์ ๊ฒฝ์ฐ ์คํจ์ 13๋ฒ ์๋ตํด๋ณด์ธ์.
๋๋ณด๊ธฐ
๋๋ณด๊ธฐ
docker run \ --name jenkins-docker \ --rm \ --detach \ --privileged \ --network jenkins \ --network-alias docker \ --env DOCKER_TLS_CERTDIR=/certs \ --volume jenkins-docker-certs:/certs/client \ --volume jenkins-data:/var/jenkins_home \ --publish 3000:3000 \ --publish 2376:2376 \ docker:dind \ --storage-driver overlay2
- ์ปจํ ์ด๋ ์ด๋ฆ ์ง์ .
- ์ข ๋ฃ๋๋ฉด ์ปจํ ์ด๋ ์๋ ์ ๊ฑฐ.
- ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ปจํ ์ด๋ ์คํ. ์ปจํ ์ด๋ ID๋ฅผ ์ถ๋ ฅํ๋ค. ์ต์ ์ ์ง์ ํ์ง ์์ผ๋ฉด ํ์ฌ ํฐ๋ฏธ๋์ฐจ์ ๋์ปค ๋ก๊ทธ ์ถ๋ ฅ.
- Docker-in-Docker ์ ์ ์๋ ์ํด์ ๊ถํ ๋ถ์ฌ.
- ์์ ์์ฑํ "jenkins"๋ผ๋ ์ด๋ฆ์ ๋คํธ์ํฌ ์ฌ์ฉ.
- "jenkins" ๋คํธ์ํฌ์์ `Docker ์ปจํ ์ด๋` ๋ด๋ถ์ `Docker`๋ฅผ "docker"๋ผ๋ ํธ์คํธ ์ด๋ฆ์ผ๋ก ์ฌ์ฉ.
- Docker ์๋ฒ์์ TLS ์ฌ์ฉ์ ํ์ฑํํ๋ค. ๊ถํ ์๋ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ถ์ฅ๋๋ค. ์๋์ ์ค๋ช ๋ ๊ณต์ ๋ณผ๋ฅจ ์ต์ ์ ์ฌ์ฉํด์ผ ํ๋ค. ์ด ํ๊ฒฝ ๋ณ์๋ Docker TLS ์ธ์ฆ์๊ฐ ๊ด๋ฆฌ๋๋ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ ์ดํ๋ค.
- ์ปจํ ์ด๋ ๋ด๋ถ์ /certs/client ๋๋ ํ ๋ฆฌ๋ฅผ jenkins-docker-certs๋ผ๋ Docker ๋ณผ๋ฅจ์ ๋งคํํ๋ค. jenkins-docker-certs ๋ณผ๋ฅจ์ด ์์ผ๋ฉด ์์ฑํ๋ค.
- ์ปจํ ์ด๋ ๋ด๋ถ์ /var/jenkins_home ๋๋ ํ ๋ฆฌ๋ฅผ jenkins-data๋ผ๋ Docker ๋ณผ๋ฅจ์ ๋งคํํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด `Docker ์ปจํ ์ด๋์ Docker ๋ฐ๋ชฌ`์ด ์ ์ดํ๋ `โโ๋ค๋ฅธ Docker ์ปจํ ์ด๋`๊ฐ Jenkins์ ๋ฐ์ดํฐ๋ฅผ ํ์ฌํ ์ ์์ต๋๋ค.
- Docker ๋ฐ๋ชฌ ํฌํธ๋ฅผ ๋ ธ์ถํ๋ค.
- ํธ์คํธ ์์คํ ์ Docker ๋ฐ๋ชฌ ํฌํธ๋ฅผ ๋ ธ์ถํ๋ค. ๋ด๋ถ Docker ๋ฐ๋ชฌ์ ์ ์ดํ๊ธฐ ์ํด ํธ์คํธ ์์คํ ์์ docker ๋ช ๋ น์ ์คํํ๋ ๋ฐ ์ ์ฉํ๋ค.
- docker:dinder ์ด๋ฏธ์ง ์์ฒด. ์ด ์ด๋ฏธ์ง๋ docker image pull docker:dind ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์คํํ๊ธฐ ์ ์ ๋ค์ด๋ก๋ํ ์ ์๋ค.
4. ๊ณต์ Jenkins ๋์ปค ์ด๋ฏธ๋ฅผ ์ปค์คํฐ๋ง์ด์ง ํ๋ค.
4-1. ๋ค์๊ณผ ๊ฐ์ด `Dockerfile`์ ๋ง๋ ๋ค.
FROM jenkins/jenkins:2.319.1-jdk11
USER root
RUN apt-get update && apt-get install -y lsb-release
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
https://download.docker.com/linux/debian/gpg
RUN echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean:1.25.2 docker-workflow:1.26"
4-2. `Dockerfile`๋ก ์๋ก์ด ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋ง๋ ๋ค.
docker build -t myjenkins-blueocean:1.1 .
5. ๋ง๋ `myjenkins-blueocean:1.1` ์ด๋ฏธ์ง๋ฅผ ์ปจํ ์ด๋๋ก ์คํ.
- 10๋ฒ์ ๊ฒฝ๋ก๋ ํ์ฌ ์ฌ์ฉ์ ํด๋๋ฅผ ๊ฐ๋ฅดํจ๋ค. => /c/Users/{์ฌ์ฉ์๋ช }
- Host์ ๋์ปค ์ปจํ ์ด๋ ๊ฒฝ๋ก๋ฅผ ๋งํฌ๊ฑธ๊ฒ ๋๋ฏ๋ก ๊ถํ์ด ํ์ํ๋ค. ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ์คํ.
- Windows์ ๊ฒฝ์ฐ 10๋ฒ = --volume "%HOMEDRIVE%%HOMEPATH%":/home
- ๋ก์ปฌ์ Jenkins๋ฅผ 8080 ํฌํธ๋ก ์ฌ์ฉํ๊ณ ์๋ ๊ฒฝ์ฐ, 6๋ฒ ํฌํธ๋ฅผ ๋ณ๊ฒฝํด์ ๋งํฌํ์.(8888:8080)
๋๋ณด๊ธฐ
๋๋ณด๊ธฐ
docker run \ --name jenkins-blueocean \ --rm \ --detach \ --network jenkins \ --env DOCKER_HOST=tcp://docker:2376 \ --env DOCKER_CERT_PATH=/certs/client \ --env DOCKER_TLS_VERIFY=1 \ --publish 8080:8080 \ --publish 50000:50000 \ --volume jenkins-data:/var/jenkins_home \ --volume jenkins-docker-certs:/certs/client:ro \ --volume "$HOME":/home \ myjenkins-blueocean:1.1
- ์ปจํ ์ด๋ ์ด๋ฆ ์ง์ .
- ์ข ๋ฃ๋๋ฉด ์ปจํ ์ด๋ ์๋ ์ ๊ฑฐ.
- ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ปจํ ์ด๋ ์คํ. ์ปจํ ์ด๋ ID๋ฅผ ์ถ๋ ฅํ๋ค. ์ต์ ์ ์ง์ ํ์ง ์์ผ๋ฉด ํ์ฌ ํฐ๋ฏธ๋์ฐจ์ ๋์ปค ๋ก๊ทธ ์ถ๋ ฅ.
- ์ด ์ปจํ ์ด๋๋ฅผ ์ด์ ๋จ๊ณ์์ ์ ์ํ "jenkins" ๋คํธ์ํฌ์ ์ฐ๊ฒฐํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํธ์คํธ ์ด๋ฆ "docker"๋ฅผ ํตํด ์ด Jenkins ์ปจํ ์ด๋์์ ์ด์ ๋จ๊ณ์ Docker ๋ฐ๋ชฌ์ ์ฌ์ฉํ ์ ์๋ค.
- ์ด์ ๋จ๊ณ์์ ์์ฑํ Docker ๋ฐ๋ชฌ์ ์ฐ๊ฒฐํ๊ธฐ ์ํด docker, docker-compose ๋ฐ ๊ธฐํ Docker ๋๊ตฌ์์ ์ฌ์ฉํ๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ง์ .
- ํ์ฌ ์ปจํ
์ด๋์ ํฌํธ 8080์ ํธ์คํธ ์์คํ
์ ํฌํธ 8080์ ๋งคํ.
์ฒซ ๋ฒ์งธ ์ซ์๋ ํธ์คํธ์ ํฌํธ๋ฅผ ๋ํ๋ด๊ณ ๋ง์ง๋ง ์ซ์๋ ์ปจํ ์ด๋์ ํฌํธ๋ฅผ ๋ํ๋ธ๋ค.
๋ฐ๋ผ์ ์ด ์ต์ ์ -p 49000:8080์ ์ง์ ํ๋ฉด ํธ์คํธ ์์คํ ์์ ํฌํธ 49000์ ํตํด Jenkins์ ์ก์ธ์คํ๊ฒ ๋๋ค. - ํ์ฌ ์ปจํ
์ด๋์ ํฌํธ 50000์ ํธ์คํธ ์์คํ
์ ํฌํธ 50000์ ๋งคํ.
์ด๋ ๋ค๋ฅธ ๋จธ์ ์ ํ๋ ์ด์์ ์ธ๋ฐ์ด๋ Jenkins ์์ด์ ํธ๋ฅผ ์ค์ ํ ๊ฒฝ์ฐ์๋ง ํ์ํ๋ฉฐ, ์ด๋ ์ฐจ๋ก๋ก jenkins-blueocean ์ปจํ ์ด๋(Jenkins "์ปจํธ๋กค๋ฌ")์ ์ํธ ์์ฉํ๋ค.
์ธ๋ฐ์ด๋ Jenkins ์์ด์ ํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก TCP ํฌํธ 50000์ ํตํด Jenkins ์ปจํธ๋กค๋ฌ์ ํต์ ํ๋ค. ๊ธ๋ก๋ฒ ๋ณด์ ๊ตฌ์ฑ ํ์ด์ง๋ฅผ ํตํด Jenkins ์ปจํธ๋กค๋ฌ์์ ์ด ํฌํธ ๋ฒํธ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค. - ์ปจํ
์ด๋์ /var/jenkins_home ๋๋ ํฐ๋ฆฌ๋ฅผ jenkins-data๋ผ๋ ์ด๋ฆ์ Docker ๋ณผ๋ฅจ์ ๋งคํํ๋ค.
/var/jenkins_home ๋๋ ํ ๋ฆฌ๋ฅผ Docker ๋ณผ๋ฅจ์ ๋งคํํ๋ ๋์ ์ด ๋๋ ํ ๋ฆฌ๋ฅผ Host์ ๋ก์ปฌ ํ์ผ ์์คํ ์ ๋งคํํ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด ์ต์ ์ง์ `--volume $HOME/jenkins:/var/jenkins_home`๋ Host์ $HOME ๋๋ ํ ๋ฆฌ์ ์๋ jenkins ํ์ ๋๋ ํ ๋ฆฌ(์ผ๋ฐ์ ์ผ๋ก /Users/<your-username>/jenkins ๋๋ /home/<์ฌ์ฉ์ ์ด๋ฆ>/jenkins)๋ก ๋งคํํ๋ค. ์ด์ ๋ํ ์์ค ๋ณผ๋ฅจ ๋๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ ์์ docker:dind ์ปจํ ์ด๋์์ ๋ณผ๋ฅจ์ ์ด์ ๋ง๊ฒ ์์ ํด์ผ ํ๋ค. - /certs/client ๋๋ ํ ๋ฆฌ๋ฅผ ์ด์ ์ ์์ฑ๋ jenkins-docker-certs ๋ณผ๋ฅจ์ ๋งคํํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด DOCKER_CERT_PATH ํ๊ฒฝ ๋ณ์๋ก ์ง์ ๋ ๊ฒฝ๋ก์์ Docker ๋ฐ๋ชฌ์ ์ฐ๊ฒฐํ๋ ๋ฐ ํ์ํ ํด๋ผ์ด์ธํธ TLS ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. - ํธ์คํธ ์์คํ ์ $HOME ๋๋ ํ ๋ฆฌ(์ผ๋ฐ์ ์ผ๋ก /Users/<your-username> ๋๋ ํ ๋ฆฌ)๋ฅผ ์ปจํ ์ด๋์ /home ๋๋ ํ ๋ฆฌ์ ๋งคํํ๋ค.
- ์ด์ ๋จ๊ณ์์ ๋น๋ํ Docker ์ด๋ฏธ์ง์ ์ด๋ฆ์ด๋ค.
6. Jenkins ์ค์
- ์ํ ํ๋ก์ ํธ ์์ฑ(๊ฒฝ๋ก ์์: c/Users/{์ฌ์ฉ์๋ช }/dev/node-react-jenkins/simple-node-js-react-npm-app)
- Jenkins ์ ์(localhost:8080)
- ํ๋ฉด์ ํ์๋ ๊ฒฝ๋ก์์ ๋น๋ฐ๋ฒํธ ์ ๋ ฅํ๊ณ ๋ก๊ทธ์ธ
- ์๋ก์ด Item > ํ์ดํ๋ผ์ธ ๋ง๋ค๊ธฐ
- Jenkins ํ์ดํ๋ผ์ธ ์ค์ ( /home = /c/Users/{์ฌ์ฉ์๋ช } )
7. Jenkins script
pipeline {
agent {
docker {
image 'node:lts-buster-slim'
args '-p 3000:3000'
}
}
environment {
CI = 'true'
}
stages {
stage('Build') {
steps {
sh 'npm install'
}
}
stage('Test') {
steps {
sh './jenkins/scripts/test.sh'
}
}
stage('Deliver') {
steps {
sh './jenkins/scripts/deliver.sh'
input message: 'Finished using the web site? (Click "Proceed" to continue)'
sh './jenkins/scripts/kill.sh'
}
}
}
}
'Develop > DevOps' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Vagrant ๊ฐ ๋ญ์ง? (0) | 2022.05.15 |
---|---|
[docker] ERROR [internal] load metadata for docker.io/library/node:14.17.0-alpine (0) | 2021.12.28 |
[docker] ๋ช ๋ น์ด cheatsheet (0) | 2021.12.26 |
[docker] ๋์ปค๋ ์ด๋ป๊ฒ ์ปจํ ์ด๋๋ฅผ ๊ฒฉ๋ฆฌ ์ํฌ๊น?๐ค (0) | 2021.12.26 |
[docker] ๋์ปค ๋คํธ์ํฌ ๋๋ผ์ด๋ฒ, Bridge Network ?? (0) | 2021.12.25 |
๋๊ธ