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 ngrok
7-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