[ 1. ๊ธ์ ์์ฑํ๋ ์ด์ ]
ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ๋ง์ง๋ง์ผ๋ก Jenkins๋ฅผ ์ด์ฉํ ํ์ดํ๋ผ์ธ CI/CD๋ฅผ ํ๋ฉด์ ๋๋ฌด ๋ง์ ์ค๋ฅ๋ฅผ ๋ง๋ฌ์ต๋๋ค. ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํ๋ ์๊ฐ์ ๊ฐ์ง๊ฒ ๋์์ต๋๋ค.
์ด ์์ฑ ๊ธ์๋ ์ค๋ณต์ ์ธ ๋ด์ฉ์ด ์๊ธฐ ๋๋ฌธ์ ์์ ๊ธ์ ๋ณด์๋ฉด ๋์์ด ๋ฉ๋๋ค.
[ 2. Jenkins Pipeline์ ๋ํด์ ์์๋ณด์ ]
์ด๋ฒ์ ์งํํ ๋ฐฐํฌ๋ ํ์ดํ๋ผ์ธ์ ์ด์ฉ์ ํด์ ํ๋ ค๊ณ ํฉ๋๋ค. ์ผ๋จ ๊ธฐ๋ณธ์ ์ผ๋ก Jenkins ์ธ์คํด์ค์ Workspace ์ธ์คํด์ค๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด SSH ํ๋กํ ์ฝ์ ์ฌ์ฉํฉ๋๋ค.
์ดํ Jenkins์์ ๋น๋ํ jarํ์ผ์ Docker์ ์ฌ๋ ค์ Workspace์ ์คํํ๋ ๋ฐฉ์์ ์ฌ์ฉ์ ํ๋ ค๊ณ ํฉ๋๋ค.
์ถ๊ฐ์ ์ผ๋ก Git์ Git Webhook์ ์ด์ฉํด์ ๋ณ๊ฒฝ๋ ์ฌํญ์ ํ์ ํ์ฌ Jenkins ์ธ์คํด์ค์ push ํ๊ฒ ์ถ๊ฐ์ ์ธ ์์ ์ ํ์ต๋๋ค.
[ 3. Jenkins Pipeline ์คํํ๊ธฐ]
์ ํฌ๊ฐ ์ด์ ์ ์์ฑํ ์์ฑ๊ธ์ ์๊ฐ๋ฅผ ํ๋ ๋ฉ๋ชจ๋ฆฌ Swap , Docker, Jenkins์ ๋ํ ์ค์ ์ ์ค๋น๋ฅผ ํฉ๋๋ค.
[ Jenkins ] Jenkins Item Freestyle CI/CD ๋ฐฐํฌ
1. ์๋ก ์๋ ํ์ธ์. ์ด๋ฒ์๋ AWS EC2์์ Jenkins Item์ FreeStyle ๋ฐฐํฌ์ ๋ํด์ ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํ๊ธฐ ์ํด ๊ธ์ ์์ฑ์ ํ์ต๋๋ค. ๋ฐฐํฌ๋ฅผ ํฌ๊ฒ 2๊ฐ๋ก ๋๋์ด Github๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ฐฉ์๊ณผ ์ฌ์ฉํ
pos04167.tistory.com
Memory Swap
sudo dd if=/dev/zero of=/swapfile bs=128M count=32
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon -s
sudo vi /etc/fstab
--------------------
[ vi์ ํ๋จ์ ์ถ๊ฐ ]
/swapfile swap swap defaults 0 0
----------------------
## ์ฉ๋ ํ์ธ
free
Docker ์ค์นํ๊ธฐ
# ์ค๋๋ ๋ฒ์ ์ญ์
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
# repository ์ค์
sudo apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
# Docker์ Official GPG Key ๋ฅผ ๋ฑ๋ก
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# stable repository ๋ฅผ ๋ฑ๋ก
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# Docker Engine ์ค์น
sudo apt-get -y install docker-ce docker-ce-cli containerd.io
# ์ค์น ์๋ฃ ํ์ธ, ๋ฒ์ ํ์ธ
docker --version
# /var/run/docker.sock ์ ๊ทผ ๊ถํ ํ์ฉ
sudo chmod 666 /var/run/docker.sock
# docker hub ๋ก๊ทธ์ธ id/pw ์
๋ ฅ
docker login
Docker ์ด์ฉํด์ Jenkins ์ค์นํ๊ธฐ
docker run \
--name jenkins-docker \
-p 8080:8080 -p 50000:50000 \
-v /home/jenkins:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-u root \
-d \
jenkins/jenkins:lts
# jenkins ์ปจํ
์ด๋ ์ ์
docker exec -it [jenkins ์ปจํ
์ด๋ID] bin/bash
# jenkins ์ปจํ
์ด๋ log ํ์ธ
docker logs [jenkins ์ปจํ
์ด๋ID]
์ดํ Jenkins์ ๋ค์ด๊ฐ์ SSH Privateํค ์ค์ ํ ์ดํ SSH Agent๋ฅผ ์ค์น๋ฅผ ํด์ผ ๋ฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ ๊ด๋ฆฌ > Avaliable Plugins > SSH Agent Plugin > ์ค์น ํ ์ฌ ์คํ > Installed plugins์ ์ค์น๊ฐ ๋์๋์ง ํ์ธํ๋ค.
๊ทธ๋ฆฌ๊ณ Item์ Pipeline์ ์ด์ฉํด์ ํ๋ก์ ํธ๋ฅผ ์์ฑ์ ํฉ๋๋ค.
์ดํ Pipeline์ script์ ์คํฌ๋ฆฝํธ๋ฅผ ์ ๋ ฅ์ ํด์ค๋๋ค. ์ ํฌ๋ ์ด์ ์ node ๋ฒ์ ์ด ์๋ stoarge๋ฐฉ์์ ์ฌ์ฉ์ ํฉ๋๋ค.
pipeline {
agent any
stages {
stage('Prepare') {
steps {
git branch: 'master',
url: 'https://github.com/Side-Challenge-Study-Time/StudyTime_BE.git'
}
}
stage('Build Gradle') {
steps{
sh 'chmod +x gradlew'
sh './gradlew clean build'
sh 'ls -al ./build'
}
}
stage('Docker build image') {
steps{
sh 'docker build -t kimmugeon/docker-jenkins-github-test .'
}
}
stage('Docker push image') {
steps{
sh 'docker login -u {id} -p {password}'
sh 'docker push kimmugeon/docker-jenkins-github-test'
}
}
stage('Run Container on SSH Dev Server'){
steps{
echo 'SSH'
sshagent (credentials: ['ubuntu-server']) {
sh "ssh -o StrictHostKeyChecking=no ubuntu@13.209.121.xxx 'whoami'"
sh "ssh -o StrictHostKeyChecking=no ubuntu@13.209.121.xxx 'docker ps -q --filter name=docker-jenkins-github-test | grep -q . && docker rm -f \$(docker ps -aq --filter name=docker-jenkins-github-test)'"
sh "ssh -o StrictHostKeyChecking=no ubuntu@13.209.121.xxx 'docker rmi -f kimmugeon/docker-jenkins-github-test'"
sh "ssh -o StrictHostKeyChecking=no ubuntu@13.209.121.xxx 'docker run -d --name docker-jenkins-github-test -p 8081:8080 kimmugeon/docker-jenkins-github-test'"
}
}
}
}
}
์ผ๋จ ์คํฌ๋ฆฝํธ์ ๋ํด์ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ผ๋จ ์์๋ก๋ Jenkins ์ธ์คํด์ค๋ Git Clone > Gradle build > Docker build > Docker push๋ฅผ ์งํํ๋ฉฐ
SSH ์ธ์คํด์ค๋ Docker pull > Docker run
1. jenkins์ธ์คํด์ค git clone
2. jenkins์ธ์คํด์ค gradle build
3. jenkins์ธ์คํด์ค docker build
4. jenkins์ธ์คํด์ค docker push
5. jenkins์ธ์คํด์ค -> server์ธ์คํด์ค ssh์ ์
6. server์ธ์คํด์ค docker pull
7. server์ธ์คํด์ค docker run
์ดํ ์ ํฌ๋ SSH Agent๋ฅผ ์ด์ฉํด์ Jenkins Credential ์ค์ ์์ Secret text๋ฅผ ์งํ์ ํ๊ฒ ์ต๋๋ค.
Pipeline Sytax > Steps > Sample Step > ssgagent: SSH Agent > Add๋ฅผ ์ถ๊ฐํ๋ค.
์ดํ Kind์ SSH Username with private key๋ฅผ ์ ํ์ ํฉ๋๋ค.
๐ฃ์ฌ๊ธฐ์ ์ค์ํ ๋ถ๋ถ์ธ Private Key๋ฅผ ์ ํ์ ํด์ผ ๋ฉ๋๋ค. ์ ํฌ๋ AWS์ pem ํ์ผ๋ด์ฉ์ ์ ํ์ ํฉ๋๋ค.
-----BEGIN RSA PRIVATE KEY-----
~~~~~ ssh ์ธ์คํด์ค์ pem ํ์ผ์ ํด๋ฆญํ๋ฉด ๋์ต๋๋ค
-----END RSA PRIVATE KEY-----
์ดํ ์ ์ฅ์ ํ๊ณ ์ง๊ธ ๋น๋๋ฅผ ์ ํ์ ํ๋ฉด ๋น๋๊ฐ ์คํ์ด ๋๋ค.
์ ์์ ์ผ๋ก ๋น๋๊ฐ ๋ ๊ฒ์ ํ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค.
[ 4. Git WebHook ]
์ ํฌ๊ฐ ์ฐ๊ฒฐํ๊ณ ์ถ์ Github Repository๋ฅผ ์ ํ์ ํฉ๋๋ค.
Setting > Webhooks > Add webhook์ ์ ํ์ ํฉ๋๋ค.
GitHub - Side-Challenge-Study-Time/StudyTime_BE: ์คํฐ๋ ํ์ ํ๋ก์ ํธ(Back_End)
์คํฐ๋ ํ์ ํ๋ก์ ํธ(Back_End). Contribute to Side-Challenge-Study-Time/StudyTime_BE development by creating an account on GitHub.
github.com
์ฌ๊ธฐ์ URL์ WorkSpace์ ํ๋ ฅ์ IP๋ฅผ ์ ๋ ฅํ๊ณ ํฌํธ ๋ฐ github-webhook์ ์ ๋ ฅํฉ๋๋ค.
์ด๋ ๊ผญ Json์ ์ ํ์ ํฉ๋๋ค.
http://{ํ๋ ฅ์ IP}:8080/github-webhook/
์ดํ Jenkins์ ์ค์ ์ Github๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ค์ ํ๋ฉด ์ฑ๊ณต์ ์ผ๋ก ํ์ฑํ๋ฉ๋๋ค.
'๐ AWS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ AWS ] Docker + AWS EC2 Aphache/ MySQL ๊ฐ๋ฐํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ (0) | 2023.04.21 |
---|---|
[ Jenkins ] Jenkins FreeStyle Github ๋ฐฐํฌํ๊ธฐ (0) | 2023.04.21 |
[ Jenkins ] Jenkins Item Freestyle CI/CD ๋ฐฐํฌ (0) | 2023.04.19 |
[ Jenkins ] Jenkins CI/CD ๋ฌด์์ธ๊ฐ? (0) | 2023.04.15 |
[ AWS ] AWS๋ ์นํด์ง๊ธฐ - 3 (Docker๋ฅผ ์ด์ฉํด์ ๋ฐฐํฌํ๊ธฐ) (0) | 2023.04.07 |