CI/CD

Jenkins Kubernetes Manifest Deploy

uuuhhh 2022. 12. 14. 09:54

👀 Epilogue


  • 현재 프로젝트에 적용할 CD 파이프라인 소개

 

  1. 도커 이미지 빌드
  2. 도커 이미지 Docker Hub Registry에 Push
  3. Kubernetes Deployment Manifest 파일에 도커 이미지 태그 수정

 

  • ArgoCD가 수정 사항을 감지하여 새로 Push 된 Docker Image를 가지고 배포를 진행한다.
  • 이로써 GitOps 환경이 구축이 된다.

 

  • 진짜 역대급으로 힘들었고 시간 많이 잡아먹었던 파이프라인 Stage
    • 왜냐고 물으신다면 이 빌드 숫자를 보아하니..^^

 

 

⚡ Leggo


  • Jenkinsfile
environment{
        ...
        gitToken = credentials('github-repo-access-token')
    }

...

stage('Kubernetes Manifest Update'){
            steps{
                git branch: 'main',
                    url: '<https://github.com/Cucumber-web/Test-Kubernetes.git>',
                    credentialsId: 'github-repo-access-token'
                
                sh '''
                    git config --global user.email "uh9222959@gmail.com"
                    git config --global user.name "UhyeongJo"
                '''

                sh "sed -i 's/cucumber-back:.*\\$/cucumber-back:${currentBuild.number}/g' back_deployment.yaml"
                sh "git add back_deployment.yaml"
                sh "git commit -m '[Update] test-back ${currentBuild.number} image versioning'"
                
                sshagent(credentials: ['****************']){
                    sh 'git remote set-url origin '
                    sh "git push origin main"
                }

                /*
                sh '''
                    git config --global user.email "{e-mail-***}"
                    git config --global user.name "{username-***}"
                '''
                sh "sed -i 's/cucumber-back:.*\\$/cucumber-back:${currentBuild.number}/g' back_deployment.yaml"
                sh "git add back_deployment.yaml"
                sh "git commit -m '[Update] test-back ${currentBuild.number} image versioning'"
                sh "git remote set-url origin "
                sh "git push --set-upstream origin main"
                */
            }
        }

 

 

▪ 이건 또 하나의 삽질 경험기


  • 젠킨스 컨테이너 접속
    • 젠킨스 홈 디렉토리에 들어가서 공개-비밀키 쌍을 생성하고 Github의 Secret과 Jenkins의 Credentials로 등록을 해줘야 했다.
    • $ kubectl exec -it [jenkins-pod-name] /bin/bash -n [jenkins-namespace]

 

  • 젠킨스 홈 디렉토리에 공개-비밀키 쌍 생성 과정
    • $ cd /var/jenkins-home
    • $ mkdir .ssh
    • $ cd .ssh
    • $ ssh-keygen -t rsa -C [github e-mail]
    • Enter + Enter + Enter ,,
    • id_rsa (private key) → COPY → jenkins credential
    • id_rsa.pub (public key) → COPY → github secret

 

  • ssh agent
    • 위에서 등록한 Jenkins ssh private key를 가지고 사용 및 활용할 수 있는 agent
    ...
    [ssh-agent] Using credentials ***-key
    [ssh-agent] Looking for ssh-agent implementation...
    [ssh-agent] Exec ssh-agent (binary ssh-agent on a remote machine)
    $ ssh-agent
    ...
    
    • credentials에 username이 아니라 ID를 입력해야 함
 

SSH Agent

This plugin allows you to provide SSH credentials to builds via a ssh-agent in Jenkins.

plugins.jenkins.io

 

  • Environment Credential Secure
    • sh "git remote set-url origin <https://${gitToken}@github.com/Cucumber-web/Test-Kubernetes.git>"
    • 현재 Jenkins에서 연결되어 있는 원격 Repository의 주소를 변경하기 위한 명령인데 자꾸 자격 증명 에러가 발생..
      • fatal: could not read Username for '<https://github.com>': No such device or address
      • Host key verification failed.
      • … 아주 다양..
    • Github Token을 통하여 이를 해결하였다.
    • 그러나 보안 상 Github Token이 환경 변수로 사용하지만 명령어로 유출될 가능성이 있다는 경고 발생
Warning: A secret was passed to "sh" using Groovy String interpolation, which is insecure.
		 Affected argument(s) used the following variable(s): [gitToken, gitToken_PSW]

 

  • 해결법은 간단하다.
  • 큰따옴표 → 작은따옴표
  • sh ~~~   sh ~~~ 
 

Using a Jenkinsfile

For more advanced usage with Scripted Pipeline, the example above node is a crucial first step as it allocates an executor and workspace for the Pipeline. In essence, without node, a Pipeline cannot do any work! From within node, the first order of busines

www.jenkins.io

 

  • 성공 ~ 😉

빌드 성공 !

 

로그에서도 반가운 SUCCESS !

 

새로운 도커 이미지 Push !

 

Kubernetes Deployment Manifest 파일의 새로운 도커 이미지 태그 수정 확인 !