Jenkins 페이지에 들어가서, 오른쪽 상단에 닉네임을 클릭하면 아래와 같은 메뉴가 나온다.
여기서, Security를 들어가준다.
그러면, 밑에와 같은 API Token 값을 만들수가 있다.
여기서 Token값을 만들면 나에게 Token값을 부여함. 해당 토큰값은 한번만 보여주니 별도로 저장해 놓자.
📌 Jenkins에서 Generic Webhook Trigger Plugin 설치.
Jenkins 관리 ➡️ System Configuration ➡️ Plugins 에 들어가면,
해당 페이지가 나온다. 여기서, Available Plugins 에 들어가 Generic Webhook Trigger Plugin 을 설치해준다.
📌 Jenkins Pipeline 작성
위에 까지 구축해 놨으면, 이제 Pipeline Project를 작성해주면 된다.(freestyle로 작성해도 무관.)
Pipeline과 freestyle 프로젝트 중에 원하는걸로 작성해도 되지만, CI/CD의 유연성을 위해 Pipeline으로 작성했다.
📦 Pipeline Configure
📌General
이 부분은 설명할 것을 넣어주고 필요한 옵션들을 선택해주면 된다. 물론, 선택을 안해도 상관없다. (난 선택 안함..)
📌 Trigger
Pipeline에 Trigger를 넣어놔서 Jenkins UI에 적용시키지 않아도 적용이 된다.
Pipeline 스크립트에 설정하면 자동으로 적용됨
📌 Pipeline. (Pipeline Script.)
파이프라인 스크립트로 작성했다. Trigger 부분은 위에서 선택하고 작성 부분이랑 중복될 수있다. 참고해서 보자.
pipeline {
agent any
triggers {
GenericTrigger(
genericVariables: [
[key: 'branch_name', value: '$.push.changes[0].new.name']
],
tokenCredentialId: '', // Bitbucket Webhook 토큰 Credential ID
causeString: 'Triggered by Bitbucket Push to ${branch_name}',
printContributedVariables: true,
printPostContent: true,
regexpFilterText: '$branch_name',
regexpFilterExpression: '^dev$' //branch 이름.
)
}
environment {
TELEGRAM_API_URL = ""
CHAT_ID = ""
}
stages {
stage('Clone Repository') {
steps {
echo 'Cloning repository...'
git branch: 'develop',
credentialsId: '', // CredentialId 이름 넣기.
url: '' // bitbucket URL
}
}
stage('Test & Build') {
steps {
script {
try {
sh '''
// 실행할 CLI 명렁어.
'''
sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n🥷 Jenkins CICD | Step Testing and building Success!'"
} catch (e) {
sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n❌ Jenkins CICD | Step Testing and building Failed!'"
throw e
}
}
}
}
stage('Old Directory Remove') {
steps {
script {
try {
sh '''
// 실행할 CLI 명렁어.
'''
sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n🥷 Jenkins CICD | Step Old Directory Remove Success!'"
} catch (e) {
sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n❌ Jenkins CICD | Step Old Directory Remove Failed!'"
throw e
}
}
}
}
stage('Deploy to Server') {
steps {
script {
try {
sh '''
// 실행할 CLI 명렁어.
'''
sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n🥷 Jenkins CICD | Step Deploy to Server Success!'"
} catch (e) {
sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n❌ Jenkins CICD | Step Deploy to Server Failed!'"
throw e
}
}
}
}
}
post {
always {
echo 'Pipeline execution completed.'
}
failure {
sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n❌ Jenkins CICD | Pipeline Failed!'"
}
success {
sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n✅ Jenkins CICD | Pipeline Succeeded!'"
}
}
}
🚀 code 내용
Repo Clone (젠킨스 서버로 복제) ➡️ Repo HOST OS 로 이동 ➡️ Repo node container로 이동 ➡️ Test & Build (통과하면) ➡️ 배포할 서버에 기존 Directory 삭제 ➡️ 배포하고 싶은 서버에 배포. 순으로 Pipeline 작성
✅ 추가 작업 사항
✔️ credentialId
credentialId을 만드는 법은 Jenkins 페이지에서 오른쪽 상단에 닉네임을 클릭하면 아래와 같은 메뉴가 나온다.
여기서 Credentials 를 들어가,
Add. Credentials 해준다. 그럼, 아래와 같은 화면이 나오는데,
Username : 비트버킷 아이디
password : 비트버킷에서 받은 앱 비밀번호
ID : Credential ID
Description : 설명
비트버킷에서 받은 앱 비밀번호는 비트버켓에서 받을 수 있다.
✔ 비트버킷에서 앱 비밀번호 받는 법
Personal Bitbucket settings ➡️ 앱 비밀번호
이곳에서 받으면 된다.
✔ Bitbucket_URL 가져오는 법
비트버킷 URL을 가져오려면 비트버킷에서 Access tokens을 설정해야 한다. 비트버킷에서 Repository Setting로 들어가 Access Token 메뉴를 들어가서 token을 생성하면 URL 생성이 된다.
✔ Publish over SSH 설정하는 법
해당 플러그인은 여러개의 키값을 설정할 수가 없어서 다른 플러그인을 써도 되고, 키파일을 ssh로 설정을 해서 접근을 가능하게 만들어도 된다. (원하는대로..)
docker login 서버IP:5000
---
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
🚀 Private Docker 저장소에 Push
docker push 서버IP:5000/도커이미지이름:태그이름
🚀 Private Docker 저장소에 Pull
docker pulll 서버IP:5000/도커이미지이름:태그이름
🧷 SSL이 적용되어야 etc/docker/daemon.json 파일 생성 과정이 생략 가능.
docker 컨테이너를 수동으로 생성 -> docker run = [pull] + create + start + [command]
docker pull ubuntu:16.04
docker images
docker create -it --name myubuntu16-1 ubuntu:16.04
docker ps -a
docker start myubuntu16-1
docker attach myubuntu16-1
-----
한번에 한다면?
docker run -it --name=myubuntu16-2 ubuntu:16.04 bash
Docker 컨테이너 CLI
docker [container] run [option] docker_image [command]
docker CLI 옵션
docker top | port | stats
# 컨테이너엣 실행 중인 프로세스 조회.
docker top node-run
# 컨테이너에 매핑된 포트 조회
docker port node-run
# 컨테이너 리소스 사용 통계에 대한 실시간 스트림 출력(스트림 통계 비활성화, --no-stream)
docker stats node-run
# 컨테이너에서 발생하는 stdout(표준출력), stderr(표준에러) 출력.
while true; do curl 192.168.56.101:6060; sleep 3; done
# 다른 터미널에서.
docker logs -f node-run
# 출력되는 로그 양이 큰 경우, disk full error의 원인.
docker info | grep -i log
# 출력되는 로그 양이 큰 경우, disk full error의 원인이 되기도 함.
sudo ls -l /var/lib/docker/containers/[CONTAINER ID]
# 해당 파일 내용 비우기.
sudo truncate -s 0 [CONTAINER ID]-json.log
# 컨테이너에서 발생하는 log size 제한.
sudo vi /etc/docker/daemon.json
sudo systemctl restart docker.service
sudo systemctl status docker.service
docker run -dit -p 6062:6060 --name=node-run2 \
-h node-run --log-driver json-file --log-opt max-size=30m --log-opt max-file=10 \
noderun:1.0
# mySQL 컨테이너 로그 확인.
docker run -dit --name=mydb mysql:5.7-debian
docker ps -a
docker logs mydb
docker [container] inspect
# 컨테이너 내부 구조 정보 확인.
docker container inspect node-run
docker는 플랫폼의 기능과 유용성을 개선하는 새로운 기능 및 개선 사항이 포함된 업데이트를 정기적으로 릴리즈하여 새로운 docker 기능을 도입 -> 모든 작업의 workflow를 단순화 할 수 있음.
2) 버그 수정
docker에도 다른 소프트웨어 처럼 버그 또는 예기치 못한 버그가 발생함. 발견된 버그를 해결하여 안정성 및 성능을 개선하는 수정사항을 제공.
3) 보안 패치
널리 사용되고 있는 컨테이너화 플랫폼인 docker는 보안 취약성에 대해 지속적으로 inspect되어, 최신 버전의 docker를 사용하면 최신 보안 패치를 사용하여 잠재적 악용 위험을 최소화하고 컨테이너화 된 애플리케이션의 전반적인 보안 태세를 개선할 수 있음.
4) 성능 개선.
docker 업데이트에 종종 성능 최적화가 포함되어 있기 때문에 작업을 더 빠르고 효율적으로 만듦. 이러한 개선 사항은 컨테이너 시간 단축, 네트워킹 및 I/O 성능 향상, 전반적인 리소스 활용도 향상으로 이어질 수 있음. 즉, 최신성을 갖는 docker는 컨테이너화 된 애플리케이션을 최적화할 수 있음.
5) 최신 기술과의 호환성
기술 환경은 지속적으로 발전하고 있으며 새로운 도구와 프레임워크가 새롭게 생겨나고 있음. 최신 버전의 Docker를 사용하여 최신기술과의 호환성이 보장되어 컨테이너 환경에서 새로운 최신 tool들을 활용할 수 있음.
6) 커뮤니티 및 생태계 지원
docker의 발전은 주변 생태계의 발전에 영향을 줌. 인기있는 도구 및 라이브러리 들은 docker 기능 및 버전을 지원하도록 업데이트되고, 최신 버전의 docker를 사용하여 docker 기반 플러그인 및 통합을 활용해 컨테이너화 된 application을 build 및 관리하기 위한 옵션을 사용 가능.
7) 유지 관리 및 오랜 기간 동안의 지원
docker는 일부 release를 장기지원(LTS) 버전으로 지정하는 관리체계를 따름. LTS 버전은 버그 수정 및 보안 패치를 포함하여 확장된 유지 관리 및 지원을 받아 중요한 프로덕션 환경에 적합하기 때문에 최신 Docker를 사용하면 장기적인 요구 사항에 대해 안정적이고 잘 지원되는 docker 환경을 보장 받을 수 있음.
Docker 버전 업데이트 시,
1) 기존에 실행 중이던 컨테이너들을 stop 함. 2) 현재 사용 중인 19.x 버전의 docker엔진을 삭제함. 3) 최신 버전의 docker 엔진을 설치. 4)기존 버전에서 운영중 이였던 컨테이너 재기동(start) 5) if, error 발생 시 원인 파악, 문제 해결 -> 중지되었던 컨테이너 start 6) 필요에 따라 Ubuntu Linux도 18.04 -> 22.04로 upgrade 진행