본문 바로가기
DevOps

CI/CD (Jenkins)

by 이강복 2023. 1. 18.
CI/CD의 정의

CI/CD는 지속적 통합 및 제공/배포를 뜻합니다.

인프라뿐만 아니라 빌드, 테스트 및 배포 단계를 포함하여 커밋에서 프로덕션으로 새 코드를 가져오는데 필요한

수동적인 개입의 대부분 또는 전부를 자동화합니다. CI/CD 파이프 라인을 사용하여 개발 팀은 코드를 변경한 다음 제공 및 배포를 위해 자동으로 테스트되고 푸시됩니다.

 

초기작업

Terraform으로 인프라 구축

 

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