
์ด ๊ฐ์ด๋๋ MacOS ํ๊ฒฝ์์ Docker๋ฅผ ์ด์ฉํด Jenkins๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
Jenkins๋ฅผ ๋น ๋ฅด๊ฒ ์ค์นํ๊ณ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํด๋ด ์๋ค.!!
Docker Desktop ๋ค์ด๋ก๋
docker --version)Jenkins ์คํ์ ์ํ ๋๋ ํ ๋ฆฌ ์์ฑ

mkdir -p ~/jenkins_home
chmod 777 ~/jenkins_home
docker run -d \
--name jenkins \
-p 8080:8080 -p 50000:50000 \
-v ~/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkins/jenkins:lts
d : ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ-name jenkins : ์ปจํ
์ด๋ ์ด๋ฆp 8080:8080 : ์น UI ํฌํธ ๋งคํp 50000:50000 : ์์ด์ ํธ ํต์ ํฌํธv ~/jenkins_home:/var/jenkins_home : Jenkins ๋ฐ์ดํฐ ์ ์งv /var/run/docker.sock:/var/run/docker.sock : Docker ๋ด๋ถ์์ Docker ์คํ ์ง์docker ps
Jenkins ์ปจํ ์ด๋๊ฐ ์ ์์ ์ผ๋ก ์คํ ์ค์ธ์ง ํ์ธํ์ธ์.
docker logs jenkins | grep -A 5 "Administrator password"
์ถ๋ ฅ ์์:
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
123asdkjalskdjqlkweasd1234125
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
installation: ๋ฐ๋ก ์๋ ์๋ ๋ฌธ์์ด์ ๋ณต์ฌํ ํ ๋ธ๋ผ์ฐ์ ์์ Jenkins์ ๋ก๊ทธ์ธํ์ธ์.
๋ธ๋ผ์ฐ์ ์์ http://localhost:8080 ์ ์

์ด๊ธฐ ํจ์ค์๋ ์ ๋ ฅ ํ ๋ก๊ทธ์ธ
"Install suggested plugins" ์ ํ


๊ด๋ฆฌ์ ๊ณ์ ์์ฑ ํ Jenkins ์ค์ ์๋ฃ

Main ํ๋ฉด ์
์ฅ

Jenkins์์ GitHub์ Docker ๋น๋, AWS ECR ์ ๋ก๋๋ฅผ ์ํํ๊ฒ ์ํํ๊ธฐ ์ํด ๋ค์ ํ๋ฌ๊ทธ์ธ์ ์ค์นํด์ผ ํฉ๋๋ค.
Jenkins๊ฐ GitHub์์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด ์ธ์ฆ์ด ํ์ํฉ๋๋ค.
GitHub์ ์ ๊ทผํ๋ ๋ฐฉ์์ SSH ํค ์ธ์ฆ๊ณผ Personal Access Token (PAT) ์ธ์ฆ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
Jenkins ์๋ฒ์์ SSH ํค ์์ฑ
ssh-keygen -t rsa -b 4096 -C "your-email@example.com"
/var/jenkins_home/.ssh/id_rsaid_rsa.pub ํค๋ฅผ ๋ณต์ฌGitHub์ SSH ํค ๋ฑ๋ก
Settings โ SSH and GPG keys โ New SSH Keyid_rsa.pub ๋ด์ฉ ๋ถ์ฌ๋ฃ๊ธฐJenkins์์ SSH ํค ๋ฑ๋ก
gitid_rsa ๋ด์ฉ ๋ถ์ฌ๋ฃ๊ธฐโ GitHub SSH ์ธ์ฆ ํ์ธ
ssh -T git@github.com
์ถ๋ ฅ ์์
Hi your-username! You've successfully authenticated, but GitHub does not provide shell access.
โ๏ธ GitHub ๊ณ์ ์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋์ฒดํ๋ ํ ํฐ์ ๋ฐ๊ธ๋ฐ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
Settings โ Developer settings โ Personal access tokensGenerate new token ํด๋ฆญrepo ๋ฐ workflow ๊ถํ ์ ํ ํ Generate token ํด๋ฆญgithub-tokenJenkins์์ GitHub ์ ์ฅ์๋ฅผ ์ฐ๋ํ์ฌ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ ๋น๋ํ ์ ์๋๋ก ์ค์ ํฉ๋๋ค.
Jenkins โ New Item โ Pipeline ์ ํ
Pipeline Name ์ ๋ ฅ ํ OK ํด๋ฆญ
General โ GitHub Project ์ฒดํฌ ํ Repository URL ์ ๋ ฅ
https://github.com/your-repo/your-project.git
Build Triggers โ GitHub hook trigger for GITScm polling ์ฒดํฌ
Jenkins์์๋ GitHub์ Jenkinsfile์ ์ฌ์ฉํด ๋น๋ ํ์ดํ๋ผ์ธ์ ์ ์ํฉ๋๋ค.
ํ๋ก์ ํธ ๋ฃจํธ์ Jenkinsfile์ ์ถ๊ฐํ์ฌ Jenkins๊ฐ ์๋์ผ๋ก ํ์ดํ๋ผ์ธ์ ์คํํ ์ ์๋๋ก ์ค์ ํฉ๋๋ค.
pipeline {
agent any
environment {
AWS_REGION = "ap-northeast-2" // AWS ๋ฆฌ์ ์ค์
AWS_ACCOUNT_ID = "123456789012" // AWS ๊ณ์ ID (ECR ์ ์ฅ์ ์์ ์)
ECR_REPO = "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/my-jenkins-image" // AWS ECR ์ ์ฅ์ URL
IMAGE_TAG = "latest" // ๊ธฐ๋ณธ ํ๊ทธ ์ค์
}
stages {
stage('Ensure ECR Exists') {
steps {
script {
// ECR ์ ์ฅ์๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๊ณ ์์ผ๋ฉด ์์ฑ
sh """
aws ecr describe-repositories --repository-names my-jenkins-image --region ${AWS_REGION} || \
aws ecr create-repository --repository-name my-jenkins-image --region ${AWS_REGION}
"""
}
}
}
stage('Checkout') {
steps {
// GitHub ์ ์ฅ์์์ ์ฝ๋ ๊ฐ์ ธ์ค๊ธฐ
git branch: 'main', credentialsId: 'your-credentials-id', url: 'git@github.com:your-repo/your-project.git'
}
}
stage('Build Docker Image') {
steps {
script {
// Docker ์ด๋ฏธ์ง ๋น๋ (ํ๊ทธ ํฌํจ)
sh "docker build -t ${ECR_REPO}:${IMAGE_TAG} ."
}
}
}
stage('AWS ECR Login') {
steps {
script {
// AWS ECR ๋ก๊ทธ์ธ ์ํ
sh "aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ECR_REPO}"
}
}
}
stage('Push Docker Image to ECR') {
steps {
script {
// Docker ์ด๋ฏธ์ง๋ฅผ ECR์ Push
sh "docker push ${ECR_REPO}:${IMAGE_TAG}"
}
}
}
}
}
์ด Jenkinsfile์ GitHub์์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ , AWS ECR์ ์
๋ก๋ํ๋ ์ ์ฒด CI/CD ๊ณผ์ ์ ์ํํฉ๋๋ค.
pipeline { agent any }agent any๋ ์ด๋ค Jenkins ๋
ธ๋์์๋ ์คํํ ์ ์๋๋ก ํ์ฉํ๋ ์ค์ ์
๋๋ค.environment {} (ํ๊ฒฝ ๋ณ์ ์ค์ )AWS_REGION = "ap-northeast-2"
AWS_ACCOUNT_ID = "123456789012"
ECR_REPO = "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/my-jenkins-image"
IMAGE_TAG = "latest"AWS_REGION โ AWS์์ ์ฌ์ฉํ ๋ฆฌ์ (์์ธ ๋ฆฌ์ "ap-northeast-2")AWS_ACCOUNT_ID โ AWS ๊ณ์ ID, ECR ๋ฆฌํฌ์งํ ๋ฆฌ ์์ ์์ IDECR_REPO โ ECR ์ ์ฅ์ URLIMAGE_TAG โ Docker ์ด๋ฏธ์ง ํ๊ทธ (latest ๊ธฐ๋ณธ ์ค์ )stage('Ensure ECR Exists') (ECR ์ ์ฅ์ ํ์ธ ๋ฐ ์์ฑ)stage('Ensure ECR Exists') {
steps {
script {
sh """
aws ecr describe-repositories --repository-names my-jenkins-image --region ${AWS_REGION} || \
aws ecr create-repository --repository-name my-jenkins-image --region ${AWS_REGION}
"""
}
}
}
aws ecr describe-repositories ๋ช
๋ น์ด๋ก ์กด์ฌ ์ฌ๋ถ ํ์ธaws ecr create-repository๋ฅผ ์คํํ์ฌ ์์ฑโ ์ด ๋จ๊ณ๋ฅผ ์ถ๊ฐํ๋ฉด ์ต์ด ๋ฐฐํฌ์์๋ ์ค๋ฅ ์์ด ์งํ ๊ฐ๋ฅํฉ๋๋ค.
stage('Checkout') (GitHub์์ ์ฝ๋ ๊ฐ์ ธ์ค๊ธฐ)stage('Checkout') {
steps {
git branch: 'main', credentialsId: 'your-credentials-id', url: 'git@github.com:your-repo/your-project.git'
}
}
main ๋ธ๋์น์ ์ฝ๋๋ฅผ Jenkins ์์
๊ณต๊ฐ์ผ๋ก ๊ฐ์ ธ์ต๋๋ค.credentialsId: 'your-credentials-id' โ Jenkins์ ์ ์ฅ๋ GitHub SSH Key or Token์ ์ฌ์ฉํ์ฌ ์ธ์ฆurl: 'git@github.com:your-repo/your-project.git'https://github.com/your-repo/your-project.git)stage('Build Docker Image') (Docker ์ด๋ฏธ์ง ๋น๋)stage('Build Docker Image') {
steps {
script {
sh "docker build -t ${ECR_REPO}:${IMAGE_TAG} ."
}
}
}
docker build ๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ Docker ์ด๋ฏธ์ง๋ฅผ ์์ฑ${ECR_REPO}:${IMAGE_TAG} โ ECR ์ ์ฅ์๋ฅผ ์ฐธ์กฐํ์ฌ ํ๊น
โ ECR ์ ์ฅ์์ ๋ง๊ฒ ์ด๋ฏธ์ง๊ฐ ์๋ ํ๊น ๋๋ฏ๋ก ์ถ๊ฐ ์ค์ ํ์ ์์
stage('AWS ECR Login') (AWS ECR ๋ก๊ทธ์ธ)stage('AWS ECR Login') {
steps {
script {
sh "aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ECR_REPO}"
}
}
}
aws ecr get-login-password --region ${AWS_REGION} โ AWS์์ ECR ๋ก๊ทธ์ธ ๋น๋ฐ๋ฒํธ ๊ฐ์ ธ์ค๊ธฐdocker login --username AWS --password-stdin ${ECR_REPO} โ ํด๋น ํจ์ค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธโ ์ด ๋จ๊ณ๋ฅผ ์ํํด์ผ ECR์ Docker ์ด๋ฏธ์ง๋ฅผ ํธ์ํ ์ ์์
stage('Push Docker Image to ECR') (Docker ์ด๋ฏธ์ง ํธ์)stage('Push Docker Image to ECR') {
steps {
script {
sh "docker push ${ECR_REPO}:${IMAGE_TAG}"
}
}
}
docker push ๋ช
๋ น์ด๋ก ๋น๋๋ ์ด๋ฏธ์ง๋ฅผ AWS ECR ์ ์ฅ์์ ์
๋ก๋โ ์๋ฃ ํ AWS ECR์์ ์ด๋ฏธ์ง๋ฅผ ํ์ธํ ์ ์์
aws ecr list-images --repository-name my-jenkins-image --region ap-northeast-2
์ด Jenkinsfile์:
Checkout)Build Docker Image)AWS ECR Login)Push Docker Image to ECR)์ ์ํํ๋ ์์ ํ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํฉ๋๋ค.
brew install awscli
์ฌ์ฉ์ ์ถ๊ฐ โ ํ๋ก๊ทธ๋จ ๋ฐฉ์ ์ ๊ทผAmazonEC2ContainerRegistryFullAccessaws-credentialsJenkins์์ GitHub์ ๋ณ๊ฒฝ ์ฌํญ์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ๋น๋๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ค๋ฉด Webhook์ ์ค์ ํด์ผ ํฉ๋๋ค.
GitHub Repository โ Settings โ Webhooks ์ด๋
Webhook ์ถ๊ฐ (Add webhook) ํด๋ฆญ
Webhook ์ ๋ณด ์ ๋ ฅ
http://your-jenkins-url/github-webhook/your-jenkins-url์ Jenkins ์๋ฒ์ ์ค์ URL๋ก ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. http://jenkins.yourdomain.com/github-webhook/).application/jsonJust the push event ์ฒดํฌ (๊ธฐ๋ณธ์ ์ผ๋ก ์ฝ๋ ๋ณ๊ฒฝ ์ ์๋ ํธ๋ฆฌ๊ฑฐ)Pull requests๋ฅผ ํฌํจํ๋ ค๋ฉด ๋ณ๋๋ก ์ฒดํฌ ๊ฐ๋ฅWebhook ์ ์ฅ (Add webhook) ํด๋ฆญ
Jenkins๊ฐ Webhook ์์ฒญ์ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ค๋ฉด GitHub Plugin์ ํ์ฑํํด์ผ ํฉ๋๋ค.
GitHub Webhook ์ค์ ํ์ธUsername with passwordGlobalJenkins์์ Webhook์ ์ฌ์ฉํ๋ ค๋ฉด Job์์ ํด๋น ์ต์ ์ ํ์ฑํํด์ผ ํฉ๋๋ค.
GitHub hook trigger for GITScm polling ์ฒดํฌโ ์ด์ GitHub์์ ์ฝ๋๊ฐ ํธ์๋ ๋๋ง๋ค Jenkins๊ฐ ์๋์ผ๋ก ๋น๋๋ฅผ ์ํํฉ๋๋ค. ๐
โ ์ฑ๊ณต ์ AWS ECR ํ์ธ
aws ecr list-images --repository-name my-jenkins-image --region ap-northeast-2
์ด์ Jenkins๋ฅผ ํตํด GitHub์์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ , AWS ECR์ ์ ๋ก๋ํ๋ ์๋ํ CI/CD ํ์ดํ๋ผ์ธ์ด ๊ตฌ์ถ๋์์ต๋๋ค! ๐
๋ค์์ผ๋ก ๋ฐฐํฌ ํ๊ฒฝ (ECS, Kubernetes)๊น์ง ํ์ฅํ๋ ๊ณผ์ ์ ์งํํ๋ฉด ์์ ํ DevOps ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
โ Jenkins์์ GitHub ์ธ์ฆ์ด ์ ๋ ๋?
ssh -T git@github.com)โ ECR ํธ์๊ฐ ์ ๋ ๋?
aws ecr get-login-password ์คํ ํ docker login ์ฌ์๋โ GitHub Webhook์ด ์๋ํ์ง ์์ ๋?
์ด์ Jenkins๋ฅผ ํ์ฉํด ์์ ํ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค! ๐
๊ถ๊ธํ ์ ์ด ์์ผ๋ฉด ์ธ์ ๋ ์ง ์ง๋ฌธํด์ฃผ์ธ์. ๐