Jenkins - ๐ ๋ก์ปฌ์์ jenkins ์ฐ๋ํ๊ธฐ
1. ๋ก์ปฌ์์ Jenkins ๋ฅผ ๋์ธ Dockerfile ์ ์ค๋นํ๋ค.
โ๏ธ Dockerfile-jenkins
FROM jenkins/jenkins:lts-jdk21 # ๊ณต์ Jenkins ์ด๋ฏธ์ง ์ค JDK 21์ ์ง์ํ๋ LTS ๋ฒ์ ์ ์ฌ์ฉ
# ํ์ํ ๊ฒฝ์ฐ, ์ถ๊ฐ์ ์ธ Jenkins ์ค์ ํ์ผ์ด๋ ํ๋ฌ๊ทธ์ธ์ ๋ณต์ฌํ ์ ์์ต๋๋ค.
# ์์๋ก plugins.txt ํ์ผ์ ๋ณต์ฌํ๊ณ ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
# COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
# RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt
EXPOSE 8080 50000 # (์ต์
) ์ปจํ
์ด๋ ๋ด์์ ์ฌ์ฉํ ํฌํธ๋ฅผ ๋ช
์์ ์ผ๋ก ๋
ธ์ถํฉ๋๋ค.
# ๊ณต์ ์ด๋ฏธ์ง์ ENTRYPOINT ๋ฐ CMD๊ฐ ์ด๋ฏธ ์ค์ ๋์ด ์์ผ๋ฏ๋ก ๋ณ๋์ ์คํ ๋ช
๋ น์ ํ์ํ์ง ์์ต๋๋ค.ํ๋ก์ ํธ๊ฐ Java ๋ฒ์ 21์ ์ฌ์ฉํ๊ณ ์์ด, JDK21 ์ ์ง์ํ๋ Jenkins ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. ๊ทธ๋ ์ง ์๊ณ ์ผ๋ฐ Jenkins lts ๋ฒ์ ์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ฉด Java 17 ๋ฒ์ ์ด ์ค์น๋์ด์์ด, ๋ณ๋๋ก Java 21์ ์ค์นํ๊ณ ๊ธฐ๋ณธ ์ฌ์ฉ ๋ฒ์ ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ปค์คํฐ๋ง์ด์ง ํด์ผ ํฉ๋๋ค. Java 21 ๋ฒ์ ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ ์ ์์ต๋๋ค.
Jenkins JDK 21 installation by Tools
Jenkins ๊ด๋ฆฌ
Tools
JDK installations
Add JDK
Name(jdk21)
Install automatically Check
Add Installer (JDK ์ง์ Site : Amazon-site)
Extract .zip/tar.gz

jenkins file ์์
pipeline {
agent any
tools {
jdk ("jdk21")
}
}2. [1.] ์์ ๋ง๋ Dockerfile ์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ์์ฑ
์ฌ๊ธฐ์๋ docker compose ํ์ผ์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ์์ต๋๋ค. docker compose ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด docker run ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
services:
jenkins:
container_name: jenkins-prac-jpa # Jenkins ์ปจํ
์ด๋๋ช
build:
context: .
dockerfile: ./Dockerfile-jenkins
ports:
- '9081:8080' # ํธ์คํธ์ 9081 ํฌํธ๋ฅผ ์ปจํ
์ด๋์ 9081 ํฌํธ์ ๋งคํ(Jenkins ์น UI ์ ๊ทผ)
- '50000:50000' # ํธ์คํธ์ 50000 ํฌํธ๋ฅผ ์ปจํ
์ด๋์ 50000 ํฌํธ์ ๋งคํ(Jenkins ์์ด์ ํธ ์์ด์ ํธ ํต์ )
volumes:
- ./vol-jenkins:/var/jenkins_home # Jenkins ์ค์ ๊ณผ ๋ฐ์ดํฐ๋ฅผ ํธ์คํธ์ ๋๋ ํ ๋ฆฌ์ ์ฐ๊ฒฐ(์์์ฑ ๋ณด์ฅ)
- ./vol-deployment:/var/deployment # ๋น๋ ์ฐ์ถ๋ฌผ(jar ํ์ผ) ๋ฐฐํฌ ๋์ ํด๋๋ฅผ ๋ง์ดํธ
networks:
- my-network # ๋์ผํ ๋คํธ์ํฌ์ ์ฐ๊ฒฐํ์ฌ ๋ค๋ฅธ ์๋น์ค(db ๋ฑ)๊ณผ ํต์
restart: unless-stopped # ์ปจํ
์ด๋ ์ค๋จ ์ ์๋ ์ฌ์์
networks:
my-network:
driver: bridge # ๋ธ๋ฆฟ์ง ๋คํธ์ํฌ ์ฌ์ฉ. ์ปจํ
์ด๋๊ฐ ๊ธฐ๋ณธ ๋คํธ์ํน ์ ๊ณต3. Jenkins ์ ์
์ฌ๊ธฐ์๋ localhost:9081 ๋ก ํฌํธ๋ฅผ ๋งคํํ์๊ธฐ ๋๋ฌธ์, http://localhost:9081 ๋ก ์ ์ํ๋ฉด, ๋ก์ปฌ ์ ํจ์ค ์ปจํ ์ด๋์ ์ ์ํ ์ ์์ต๋๋ค.
Unlock ํ์ด์ง๋ฅผ ํ์ด์ค๋๋ค.
๋น๋ฐ๋ฒํธ๋ ์ปจํ ์ด๋์ ๋ก๊ทธ์์ ํ์ธํ ์ ์์ต๋๋ค.
๋ํ, ์ง์ ์ปจํ ์ด๋ ์์ ๋ค์ด๊ฐ์ ํ์ธํ ์ ๋ ์์ต๋๋ค.


4. ์ ์ ์์ฑ



5. ํ๋ฌ๊ทธ์ธ ์ค์น



๐ฅฒ ์ ํจ์ค๊ฐ ์๊พธ ๋ฉ์ถ๋ ํ์์ด ์์ต๋๋ค. ๋ฒํผ์ ์๋ฌด๋ฆฌ ํด๋ฆญํด๋ ๋จนํต์ผ ๋๋, ๊ณ ๋ฏผํ์ง ๋ง๊ณ ์ฌ์ ์ ํฉ๋๋ค.
6. New Item -> Pipeline

Item name ์ ์๋ณ๊ฐ๋ฅํ๋๋ก ์ ์ด์ค๋๋ค.
Pipeline ๋ฅผ ์ ํํฉ๋๋ค.

Username with password
Scope ๋ Global ๋ฅผ ์ ํํฉ๋๋ค.
Username ์ ๋ณธ์ธ์ Github ์์ด๋๋ฅผ ์ ์ด์ค๋๋ค.
Password ๋ Github ์์ ๋ฐ๊ธ๋ฐ์ classic token ์ ์ ์ด์ค๋๋ค.
Profile
-> Settings
-> Developer settings
-> Personal access tokens
-> Tokens (classic)
-> Generate new token
์ ํจ๊ธฐ๊ฐ ์๋๋ก, webhook ์ฒดํฌ

7. ngrok
Github Repository ์ setting webhook ์ผ๋ก ๋ค์ด๊ฐ ์ฃผ์๋ฅผ ๋ฑ๋กํด์ค์ผ ํฉ๋๋ค. ์ด ๋ localhost ๋๋ ํผ๋ธ๋ฆญ IP์ port 9081๋ก ๋ฑ๋กํด๋, ๋ก์ปฌ ์ ํจ์ค ์ปจํ ์ด๋๋ฅผ ์ฐพ์ ์ ์์ผ๋ฏ๋ก ngrok ๋ผ๋ ๊ฒ์ ์ฌ์ฉํ์ฌ ์ธ๋ถ IP๋ฅผ ์์๋ก ์์ฑํ์ฌ ๋ฑ๋กํฉ๋๋ค.
7-1. ngrok ์ค์น
brew install --cask ngrok7-2. ngrok ๊ฐ์
7-3. ngrok ์ฌ์ฉํ์ฌ ์ธ๋ถ IP ๋ง๋ค๊ธฐ
๊ฐ์ ํ ๋ฐ๊ธ๋ฐ์ auth ํ ํฐ์ ๋ณต์ฌํ์ฌ ์๋์ ๊ฐ์ด ์ปค๋งจ๋๋ฅผ ์คํํฉ๋๋ค.
ngrok authtoken 20wnvzsRf4Rg3J3lhIpFrXPt49a_*************
# Authtoken saved to configuration file: /Users/your-profile/Library/Application Support/ngrok/ngrok.yml๊ทธ๋ฆฌ๊ณ , localhost:9081 ์ ๋ํ ์ธ๋ถ IP๋ฅผ ์์ฑํฉ๋๋ค.
ngrok http 9081
์์์ ์์ฑ๋ ์ธ๋ถ IP๋ฅผ Github Repository Webhook ์ ๋ฑ๋กํฉ๋๋ค.

8. Jenkinsfile ์์ฑํ์ฌ ์คํฌ๋ฆฝํธ ์์ฑํ๊ธฐ
// Jenkins ๋ก์ปฌ ์ฐ์ต์ฉ
pipeline {
agent any // ๋ชจ๋ Jenkins ์์ด์ ํธ์์ ํ์ดํ๋ผ์ธ ์คํ
environment {
// ์ปจํ
์ด๋ ์ํฌ์คํ์ด์ค ๋ด์ build ์ฐ์ถ๋ฌผ ํจ์ค
JAR_PATH = 'build/libs/prac-jpa-0.0.1-SNAPSHOT.jar'
// ๋ก์ปฌ๊ณผ ๋ง์ดํธ ๋ ์ปจํ
์ด๋ ๋ฐฐํฌ ํด๋
DEPLOY_DIR = '/var/deployment'
// * ์์ / ๋ฅผ ๋ถ์ด๋ฉด ๋ฃจํธ ํด๋ ๊ฒฝ๋ก๊ฐ ๋๋ฉฐ, ์๋ถ์ด๋ ๊ฒฝ์ฐ ์๋ ๊ฒฝ๋ก๊ฐ ๋๋ค.
GIT_URL = 'https://github.com/your-profile/<repository-name>.git'
GIT_BRANCH = 'feature/jenkins-test' # ์ํ๋ ๋๋ก
}
stages {
stage('Check java') {
steps {
// Java ๋ฒ์ ์ ํ์ธํ์ฌ ํ๊ฒฝ์ด ์ฌ๋ฐ๋ฅธ์ง ๊ฒ์ฆ
sh 'java -version'
}
}
stage('Checkout') {
steps {
script {
try {
// Git ๋ ํฌ์งํ ๋ฆฌ์์ ์์ค ์ฝ๋๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
git url: env.GIT_URL, branch: env.GIT_BRANCH
} catch (e) {
print(e)
}
}
}
}
stage('Build & Test') {
steps {
// Gradle์ ํตํด ํด๋ฆฐ ๋น๋ ๋ฐ ํ
์คํธ ์คํ
sh './gradlew clean build'
}
}
stage('check jar') {
steps {
// ๋น๋ ๊ฒฐ๊ณผ๋ก ์์ฑ๋ jar ํ์ผ ๋ชฉ๋ก ํ์ธ
sh 'ls -l build/libs'
}
}
stage('scp jar in jenkins container to local') {
steps {
// ๋น๋ ์ฐ์ถ๋ฌผ jar ํ์ผ์ ๋ฐฐํฌ ๋๋ ํ ๋ฆฌ๋ก ๋ณต์ฌ. ์๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํด์ผ ์ฌ๋ฐ๋ฅธ ์์น์์ ํ์ผ์ ์ฐพ์
sh "cp ${env.JAR_PATH} ${env.DEPLOY_DIR}/"
}
}
}
post {
failure {
// ๋น๋๋ ๋ฐฐํฌ ๊ณผ์ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋ก๊ทธ ๋ฉ์์ง ์ถ๋ ฅ
echo "Fail to Build or deployment failed. Please check the logs."
}
}
}์์ Jenkinsfile ์คํฌ๋ฆฝํธ๋ /feature/jenkins-test ๋ธ๋์น์ ํธ์๋๋ ์๊ฐ ์๋ํฉ๋๋ค. ํด๋น ๋ธ๋์น๋ฅผ jenkins ์ปจํ ์ด๋์์ ์ฒดํฌ์์&๋น๋ํ๊ณ , ์ ํจ์ค ์ปจํ ์ด๋์ ํน์ ํด๋์ ๋น๋ ์ฐ์ถ๋ฌผ์ธ jar ํ์ผ์ ํน์ ํด๋์ ๋ณต์ฌํฉ๋๋ค.
ํน์ ํด๋๋ docker compose ์์ ๋ณผ๋ฅจ๋ง์ดํธ ํ์ฌ, ๋ก์ปฌ ํด๋์์๋ ํด๋น jar ํ์ผ์ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ ์ธ, jar ํ์ผ์ ์คํ ๋ฑ์ ๊ณผ์ ์ ๋ฃ์ง ์์์ต๋๋ค.
๋ค์์๋ Docker ์ AWS์ EC2/Jenkins ๋ฅผ ์ฌ์ฉํ์ฌ CI/CD ๋ฅผ ๊ตฌ์ถํด๋ณด๋ก ํ๊ฒ ์ต๋๋ค.
Last updated