CI/CD의 정의
CI/CD는 지속적 통합 및 제공/배포를 뜻합니다.
인프라뿐만 아니라 빌드, 테스트 및 배포 단계를 포함하여 커밋에서 프로덕션으로 새 코드를 가져오는데 필요한
수동적인 개입의 대부분 또는 전부를 자동화합니다. CI/CD 파이프 라인을 사용하여 개발 팀은 코드를 변경한 다음 제공 및 배포를 위해 자동으로 테스트되고 푸시됩니다.
초기작업
Terraform (Azure)
public_key.tf resource "azurerm_ssh_public_key" "ssh_key" { name = "${var.prefix}-key" resource_group_name = azurerm_resource_group.rg1.name location = "${var.location1}" public_key = file("${var.pub_key_path}") } main.tf provider "azurerm" { features {} s
kb97.tistory.com
https://github.com/kangbock/jenkins
GitHub - kangbock/jenkins
Contribute to kangbock/jenkins development by creating an account on GitHub.
github.com
기존 3티어 웹페이지를 사용
Docker 와 Azure cli 설치
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
sudo apt-get update
sudo apt-get install ca-certificates curl apt-transport-https lsb-release gnupg
sudo mkdir -p /etc/apt/keyrings
curl -sLS https://packages.microsoft.com/keys/microsoft.asc |
gpg --dearmor |
sudo tee /etc/apt/keyrings/microsoft.gpg > /dev/null
sudo chmod go+r /etc/apt/keyrings/microsoft.gpg
AZ_REPO=$(lsb_release -cs)
echo "deb [arch=` dpkg --print-architecture` signed-by=/etc/apt/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/azure-cli/ $AZ_REPO main" |
sudo tee /etc/apt/sources.list.d/azure-cli.list
sudo apt-get install -y azure-cli
sudo apt-get install -y docker.io
az-cli 로그인
az login
az aks install-cli
az aks get-credentials --resource-group test --name test
az aks get-credentials --resource-group prod-rg --name prod-aks
Jenkins 서버
docker pull jenkins/jenkins:lts
docker run -d --name k1 -p 8080:8080 -v /work:/var/jenkins_home -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -u root jenkins/jenkins:lts
# -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock
# 젠킨스 컨테이너에서도 호스트 서버의 도커를 사용하기 위한 바인딩입니다.
# 이렇게 컨테이너 내부에서 설치없이, 외부의 도커를 사용하는 방식을 **DooD(Dock out of Docker)**라고 합니다.
Jenkins 서버에 접속
docker exec -it k1 cat /var/jenkins_home/secrets/initialAdminPassword
# or docker logs k1 으로 패스워드 복사 후 붙여넣기
플러그인 설치
플러그인 관리 → nodejs 설치
Global Tool Configuration → nodejs tool 추가
시스템 설정 → GitHub Server 연결
Pipeline 생성
Pipeline 작성
pipeline {
agent any
environment {
GIT_URL = "https://github.com/kangbock/jenkins.git"
}
tools {
nodejs "nodejs-tool"
}
stages {
stage('Pull') {
steps {
git url: "${GIT_URL}", branch: "main", poll: true, changelog: true
}
}
stage('Build') {
steps {
sh 'docker build -t kangbock/nginx ./nginx/'
}
}
stage('Deploy') {
steps{
sh 'docker rm -f nginx'
sh 'docker run -d --name nginx -p 80:80 kangbock/nginx'
}
}
stage('Finish') {
steps{
sh 'docker images -qf dangling=true | xargs -I{} docker rmi {}'
}
}
}
}
빌드 시작
웹 페이지 정상 작동
GitHub의 WebHooks를 이용한 지속적인 통합
AKS 구성
docker pull jenkins/jenkins:lts
docker run -d --name k1 -p 8080:8080 -v /jenkins:/var/jenkins_home -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v ~/.kube/config:/var/lib/jenkins/.kube/ -v /usr/local/bin/kubectl:/usr/local/bin/kubectl -v /root/.azure/:/var/lib/jenkins/.azure/ -v /usr/bin/az:/usr/bin/az -v /opt/az/bin/:/opt/az/bin/ -v /opt/az/lib/python3.10/:/opt/az/lib/python3.10/ -u root jenkins/jenkins:lts
# -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock
# 젠킨스 컨테이너에서도 호스트 서버의 도커를 사용하기 위한 바인딩입니다.
# 이렇게 컨테이너 내부에서 설치없이, 외부의 도커를 사용하는 방식을 **DooD(Dock out of Docker)**라고 합니다.
docker exec -it k1 cat /var/jenkins_home/secrets/initialAdminPassword
# or docker logs k1
docker exec -it k1 az login
docker exec -it k1 az aks get-credentials --resource-group prod-rg --name prod-aks
docker exec -it k1 docker login
[Dashboard]-[Jenkins 관리]-[Manage Credentials]-[Global credentials]-[Add Credentials] 클릭 후 아래 예시처럼 작성
- Username: Docker hub 아이디
- Password: docker hub access key
- Docker access key(token)은 Docker hub [Account Settings]-[Security] 에서 New Access Token을 클릭해 얻을 수 있음
pipeline {
agent any
environment {
GIT_URL = "<https://github.com/kangbock/jenkins.git>"
}
tools {
nodejs "nodejs-blog"
}
stages {
stage('Pull') {
steps {
git url: "${GIT_URL}", branch: "main", poll: true, changelog: true
}
}
stage('Build') {
steps {
sh 'docker build -t kangbock/nginx ./nginx/'
sh 'docker build -t kangbock/nodejs:${BUILD_NUMBER} ./nodejs/'
}
}
stage('Push') {
steps{
sh 'docker push kangbock/nodejs:${BUILD_NUMBER}'
}
}
stage('Deploy1') {
steps{
sh 'docker rm -f nginx'
sh 'docker run -d --name nginx -p 80:80 kangbock/nginx'
}
}
stage('Deploy2') {
steps{
sh "sed -i ':s/nodejs:.*/nodejs:${BUILD_NUMBER}/g' ./j1.yaml"
sh 'kubectl apply -f ./j1.yaml'
}
}
stage('Finish') {
steps{
sh 'docker images -qf dangling=true | xargs -I{} docker rmi {}'
sh 'docker image prune -af'
}
}
}
}
'DevOps' 카테고리의 다른 글
Harbor (1) | 2023.05.23 |
---|---|
ArgoCD Image Updater (현재 Beta 버전) (0) | 2023.02.24 |
Helm chart / kustomize (0) | 2023.02.24 |
CI/CD (Argo CD) (0) | 2023.01.31 |
Terraform (Azure) (0) | 2023.01.18 |