GitOps / Jenkins - Pipeline Ver. Docker

codelab·2024년 1월 18일
0

GitOps

목록 보기
2/4

Docker image manual build & push

처음부터 자동화를 하다보면 문제 발생 시 원인을 찾기 어려울 수 있습니다.
급할수록 돌아가봅시다.

# 도커이미지 빌드
docker build -f ./apps/storage/Dockerfile --target development --tag storage:0.10 .

# 도커이미지 태그를 컨테이너 레지스트리의 주소로 변경
docker tag storage:0.10 ap-seoul-1.ocir.io/cnqphqevfxnp/storage:0.10

# 컨테이너 레포지토리 로그인
docker login --username=cnqphqevfxnp/codelab --password='<비번>' ap-seoul-1.ocir.io

# 컨테이너 레포지토리로 도커 이미지 푸시
docker push ap-seoul-1.ocir.io/cnqphqevfxnp/storage:0.10

# 올린 도커 이미지를 pull해서 도커 컨테이너 실행 
docker run -p 3000:80 -e SERVICE_NAME=storage -d --name oracle-posts ap-seoul-1.ocir.io/cnqphqevfxnp/storage:0.10

실행이 잘 됩니다.

Jenkins Plugin install


docker pipeline, junit을 설치해 줍니다.

Pipeline for Jenkins

Github Webhook

git push 하면 자동으로 젠킨스의 파이프라인을 실행하도록 Git Repository와 Jenkins Pipeline을 연결합니다.

웹훅 주소 예시

https://jenkins.code-lab.kr/github-webhook/

반드시 끝에 / 를 넣는다… 아니면 302 리디이렉트로만 응답이 와서 웹훅이 실행되지 않는다… ㅂㄷㅂㄷ

Git Jenkinsfile
<sub module root path>/Jenkinsfile

git push 하면 자동으로 실행되는 Jenkinfile 입니다.
1. 깃 저장소에서 소스를 체크아웃 후
2. 컨테이너 이미지를 빌드하고
3. 테스트를 진행 후
4. 컨테이너 레지스트리에 이미지를 Push 합니다.
5. 미리 설정한 트리거(젠킨스 파이프라인)을 실행합니다.

# ocir
node {
    def app

     stage('Clone repository') {
         checkout scm
     }

     stage('Build image') {
         app = docker.build("ap-seoul-1.ocir.io/cnqphqevfxnp/posts")
     }

    stage('Test image') {
        app.inside {
            sh 'echo "Tests passed"'
        }
    }

     stage('Push image') {
         docker.withRegistry('https://ap-seoul-1.ocir.io', 'ocir') {
         // docker.withRegistry('https://register.hub.docker.com', 'docker-hub') {   
             app.push("${env.BUILD_NUMBER}")
         }
     }

     stage('Trigger ManifestUpdate') { 
        echo "triggering tuplus-update-manifest job"
        build job: 'tuplus-update-manifest', parameters: [
            string(name: 'DOCKERTAG', value: env.BUILD_NUMBER),
            string(name: 'SERVICE', value: 'posts')
        ]
     }
}


# azurecr
node {
    def app

     stage('Clone repository') {
         checkout scm
     }

     stage('Build image') {
         app = docker.build("tuplus.azurecr.io/history")
     }

    stage('Test image') {
        app.inside {
            sh 'echo "Tests passed"'
        }
    }

     stage('Push image') {
         docker.withRegistry('https://tuplus.azurecr.io', 'azurecr') {
             app.push("${env.BUILD_NUMBER}")
         }
     }

     stage('Trigger ManifestUpdate') { 
        echo "triggering tuplus-update-manifest job"
        build job: 'tuplus-update-manifest', parameters: [
            string(name: 'DOCKERTAG', value: env.BUILD_NUMBER),
            string(name: 'SERVICE', value: 'history')
        ]
     }
}

Add Jenkins Credentials

젠킨스에서 위 Jenkinsfile을 실행하기 위해 우리는 젠킨스에게 적어도 두 가지 정보를 미리 알려줘야 합니다.
요즘은 보안상 PW 보다는 엑세스 토큰 형태로 시스템에서 제공되는 경우가 많습니다. 아래 PW는 엑세스 토큰 입니다.

  1. 깃헙 ID/PW
  • 소스를 체크아웃하고 하기 위해 필요합니다.
  • 젠킨스의 Job(update manifest)에서 k8s 배포용 git manifast 레포지토리(argoCD에서 감시 예정)에 접근하고 이미지의 태그로 새로운 build version을 업데이트하고 반영할 때 필요합니다.
  1. 컨테이너 레지스트리 ID/PW
  • 이미지를 빌드 후 해당 이미지를 저장할 레지스트리의 계정 정보를 젠킨스에 미리 등록해 두어야 합니다.

container registry credential

Password 확인

az acr credential show --name tuplus --output table

젠킨스 파이프라인 설정


Update-manifest Job

개별 서브 프로젝트의 빌드 파이프라인에서 호출되는 젠킨스 트리거 입니다.
앞에서 넘겨준 두 개의 String 파라미터(DOCKERTAG, SERVICE)와 미리 젠킨스에 등록한 깃헙 계정정보를 활용하여 쿠버네티스 deploy yaml의 이미지버전을 업데이트하고 Git 저장소에 반영합니다.

우리는 추후 ArgoCD가 main project GitRepo를 감시하도록 하고 특정 경로의 파일이 변경되면 쿠버네티스 클러스터에 자동으로 배포하도록 하려고 합니다. Update-manifest Job은 이를 위한 트리거입니다.

<manifest git-repo의 root path>/Jenkinsfile

node {
    def app

     stage('Clone repository') {
         checkout scm
     }

     stage('Update GIT') {
        script {
            catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
                withCredentials([usernamePassword(credentialsId: 'github_cred', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')]) {
                    sh "git config --global user.email master@code-lab.kr"
                    sh "git config --global user.name codelab-kr"
                    sh "git checkout feature"
                    sh "git pull"
                    sh "cat ./scripts/deploy/${SERVICE}.yaml"
                    sh "sed -i 's+cnqphqevfxnp/${SERVICE}.*+cnqphqevfxnp/${SERVICE}:${DOCKERTAG}+g' ./scripts/deploy/${SERVICE}.yaml"
                    sh "cat ./scripts/deploy/${SERVICE}.yaml"
                    sh "git add ."
                    sh "git commit -m 'Done by Jenkins Job updatemaifest: ${SERVICE} to ${DOCKERTAG}'"
                    sh "git push https://${GIT_USERNAME}:${GIT_PASSWORD}@github.com/${GIT_USERNAME}/tuplus.git HEAD:feature"
                }
            }
        }
     }
}

Jenkins

Github
video-streaming.yaml 파일이 반영된 것을 확인할 수 있습니다.

Jenkins

profile
Think about a better architecture

0개의 댓글