Ops-Beginner
article thumbnail
Published 2023. 8. 23. 20:44
CI - Jenkins (2) CICD
반응형

안녕하세요.

"CI - Jenkins (1)" 포스팅 내용에 이어서
Jenkins의 세부설정과 CI에서 사용되는 Jenkinsfile에 대해서 다뤄보겠습니다.

구성도

작업하려고하는 부분입니다.

Jenkins를 이용하여 Image Build 후 ECR로 Push

 

사용한 Plugin List

Plugins 설정할 때

Credentials

  • AWS token, Git access token, secret key, ssh(username, password)등 중요한 정보들을 저장할 때 사용합니다.

Git

  • Git에서 소스코드를 가져와서 빌드할 수 있도록 도와줍니다.

Pipeline Plugin

  • 파이프라인 단계별로 다양한 것을 할 수 있습니다.

 

Credentials 설정

'Dashboard -> Jenkins 관리 -> Credentials'에서 등록되어있는 목록을 볼 수 있습니다.

(초기에는 등록되어있는 값이 없습니다.)

등록되어있는 값

'Dashboard -> Jenkins 관리 -> Credentials -> System -> Global credentials -> Add credentials'

순서로 진입해서 목적에 따라 설정하면 됩니다.

Credentials 등록 시

AWS Credentials

AWS IAM Access key, Secret key를 등록하면 AWS Resource를 사용할 수 있습니다.

ID 값으로 Pipeline에서 환경변수로 불러와서 사용할 수 있습니다. 

 

Git Credentials

Git Token으로 발급받은 값을 Password에 기입해서 사용하면 됩니다.

동일하게 Pipeline에서 변수로 사용할 수 있습니다.

 

Jenkinsfile

Pipeline 처리 방식

  • Pipeline에서 kaniko를 이용하여 Build하고 ECR에 Push 하는 방식입니다.
    • kaniko는 컨테이너 또는 Kubernetes 클러스터 내부의 Dockerfile에서 컨테이너 이미지를 빌드하는 도구입니다.
    • Docker 데몬에 의존하지 않으며 완전히 사용자 공간에서 Dockerfile 내의 각 명령을 실행합니다.

애플리케이션으로 사용한 것은 Toy 프로젝트로 공유 되어있는 Tetris를 사용했습니다.

pipeline {
  agent {
    kubernetes {
        yaml '''
# Kaniko를 사용
# kaniko-secret를 사용함으로써 ECR에 Image Push 가능하게 설정
apiVersion: v1
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
    - name: kaniko
      image: gcr.io/kaniko-project/executor:debug
      tty: true
      command:
        - /busybox/cat
      imagePullPolicy: Always
      volumeMounts:
        - name: kaniko-secret
          mountPath: /kaniko/.docker
      resources:
        requests:
          memory: "1Gi"
          cpu: "0.5"
        limits:
          memory: "1.5Gi"
          cpu: "1"
    - name: jnlp
      image: 'jenkins/inbound-agent:4.9-1-jdk11'
      resources:
        requests:
          memory: "500Mi"
          cpu: "250m"
        limits:
          memory: "1Gi"
          cpu: "1"
  restartPolicy: Never
  volumes:
    - name: kaniko-secret
      secret:
        secretName: regcred
        items:
          - key: .dockerconfigjson
            path: config.json
'''
    }
  }
# Github에 있는 Dockerfile을 통해 Build 후 ECR로 Push
  stages {
    stage('Image build and ECR push') {
      steps {
        container(name: 'kaniko') {
            sh '''
            /kaniko/executor --dockerfile=./Dockerfile --context=git://$GIT_CREDS@github.com/tetris.git --cache=false --log-timestamp=true --verbosity=debug --destination=$ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/dev/tetris:$BUILD_NUMBER
            '''
        }
      }
    }

    stage('Git Repo Clone & Commit Push') {
     steps {
        container(name: 'jnlp') {
          sh """
          mkdir git-repo
          chown 1000:1000 git-repo
          """

          dir (path: 'git-repo') {
            git branch: 'main',
                # Git Token이 등록된 환경변수 사용, Git URL 기입
                credentialsId: 'gitcredit',
                url: '{Git URL}'
            sh """
            # Deploy를 하기위해 Github에 등록되어있는 'deploy.yaml' sed 명령어로 변경
            sed -i 's#123412341234.dkr.ecr.*#123412341234.dkr.ecr.ap-northeast-2.amazonaws.com/dev/tetris:'$BUILD_NUMBER'#' deploy.yaml
            
            git config --global user.email "{EMAIl}"
            git config --global user.name "{USERNAME}"

            git remote set-url origin https://$GIT_CREDS@{GITURL}

            git add .
            git commit -m 'fix image'
            git push -f origin main
          """
          }
        }
     }    
    }
  }
  # Pipeline에서 변수를 사용하기 위해 추가
  environment {
      GIT_CREDS = credentials('gitcredit')
      ACCOUNT_ID = '123412341234'
      REGION = 'ap-northeast-2'
  }
}

 

마무리

Jenkins에서 CI부분을 정리해봤습니다.

좀 더 상세하게 작성되야하는 부분들은 차후에 다듬어보겠습니다. (Jenkins Pipeline 대시보드 설정, ECR 설정, Github 소스)

다음시간에는 CD부분에 해당되는 내용을 가져오겠습니다.

반응형

'CICD' 카테고리의 다른 글

CD - ArgoCD  (0) 2023.08.24
CI - Jenkins (1)  (0) 2023.08.23
profile

Ops-Beginner

@asher_r

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!