상세 컨텐츠

본문 제목

젠킨슨을 활용하여 helm 배포 - 2

EKS - CI-CD

by drogva 2024. 3. 20. 22:40

본문

-작성한 파이프라인   (도커 이미지 빌드 ->  eks 리소스에 접근하여 helm install)

 

-젠킨슨에 직접 접근하여 aws-cli. kubectl, helm 을 설치하였다.

 

: kubernates cli plugin 을 사용하여  새로운 계정을 생성한 후 시크릿을 출력하여 크리덴셜에 저장하려 하였으나
    eks 에서는 출력이 안되는 모양이다. 결국 kubeconfig 경로를 참조하여 파이프라인을 작성하려 하였으나 쉽지가 않고

    eks 이므르 aws cli 를 사용하여 kubeconfig 를 출력하여야 했다.

 최초 계획은 podTemplate 를 생성하여 내부 컨테이너 (helm-kubectl) 을 활용하려 하였으나 앞서 말한 /.kube/config 을 플러그인만으로 참조하여 파이프라인을 작성하기에 어려움이 있어 포기했다. 
kubernates {   형식으로  컨테이너 (helm-kubectl)  을 실행 후 클러스롤이 바인딩 된 계정의 시크릿 값을 마운트 하려 하였으나 시크릿 값이 docs 처럼 출력이 되지 않아 포기.

 

 

aws cli 설치

 

-kubectl exec -it jenkins-0 -n jenkins  -- /bin/bash

-cd /var/jenkins_home

-curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

-unzip awscliv2.zip

-aws/install --install-dir ~/aws-cli

-echo 'export PATH=$PATH:/var/jenkins_home/aws-cli/v2/current/bin' ~/.bashrc

-source ~/.bashrc

-aws configure

 

kubectl 설치

 

-kubectl exec -it jenkins-0 -n jenkins  -- /bin/bash

-cd /var/jenkins_home

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

$ chmod +x ./kubectl

 

$ mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH

 

$ echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc

 

$ kubectl version

 

aws eks --region (   )  update-kubeconfig --name (eks 이름)

 

helm 설치

 

-cd /var/jenkins_home

- curl -fsSL -o helm.tar.gz https://get.helm.sh/helm-v3.7.1-linux-amd64.tar.gz

 

- tar -zxvf helm.tar.gz

- mkdir helm

- mv linux-amd64/helm helm/

-export PATH="/your/helm/directory:$PATH"

-helm version

 

파이프라인

 

pipeline {
    agent any

    environment {
        TAG = 'hi'
        AWS_CREDENTIALS_ID = 'aws'
        AWS_REGION = 'ap-northeast-2'
        ECR_URL = '553186839963.dkr.ecr.ap-northeast-2.amazonaws.com/drogva'
        GIT_CREDENTIALS = 'drogva'
        CHART_NAME = 'jiral'
        KUBE_CONFIG = '/var/jenkins_home/.kube/config'
        AWS_CLI_PATH = '/var/jenkins_home/aws-cli/v2/current/bin/aws'
        HELM_INSTALL_DIR = '/var/jenkins_home/helm'
    }

    stages {
        stage('Checkout') {
            steps {
                // Use Kubernetes Service Account Secret
                withCredentials([string(credentialsId: '051fff9e-e37e-4306-b8d8-769ec1d6f0b0', variable: 'KUBE_CONFIG')]) {
                    // Clone the repository for building the image
                    sh "rm -rf jen && git clone https://github.com/drogva/jen.git"
                    // Clone the repository for deploying Helm chart
                    sh "rm -rf jiral && git clone https://github.com/drogva/jiral.git"
                }
            }
        }

        stage('Set Execute Permission for Gradle Wrapper') {
            steps {
                // Give execute permission to the Gradle Wrapper
                sh 'chmod +x ./jen/gradlew'
            }
        }

        stage('Login to ECR') {
            steps {
                // AWS Steps를 사용하여 ECR에 로그인
                script {
                    withAWS(region: "${AWS_REGION}", credentials: "${AWS_CREDENTIALS_ID}") {
                        ecrLogin()
                    }
                }
            }
        }

        stage('Build and Push image using Jib') {
            steps {
                script {
                    // AWS Steps를 사용하여 ECR에 로그인
                    withAWS(region: "${AWS_REGION}", credentials: "${AWS_CREDENTIALS_ID}") {
                        env.AWS_REGION = 'ap-northeast-2'
                        sh 'echo jib build and push'
                        def ecrLoginResult = ecrLogin()
                        env.ECR_PASSWORD = ecrLoginResult.split("-p ")[1].split(" ")[0]
                        sh "./jen/gradlew -p jen jib -Pprofile=prod -Djib.to.image=${ECR_URL}:${TAG} -Djib.to.auth.username=AWS -Djib.to.auth.password=${ECR_PASSWORD}"
                    }
                }
            }
        }

        stage('Deploy Helm Chart') {
            steps {
                // Add Helm directory to PATH
                script {
                    env.PATH = "${HELM_INSTALL_DIR}:${env.PATH}"
                    env.PATH = "/var/jenkins_home/aws-cli/v2/current/bin:${env.PATH}"
                }

                // Use Kubernetes Service Account Secret
                withCredentials([string(credentialsId: '051fff9e-e37e-4306-b8d8-769ec1d6f0b0', variable: 'KUBE_CONFIG')]) {
                    // Set KUBE_CONFIG_PATH directly
                    sh "export KUBE_CONFIG_PATH=${KUBE_CONFIG}"

                    // Deploy Helm chart
                    sh "helm upgrade -i $CHART_NAME ./jiral --kubeconfig=\$KUBE_CONFIG_PATH --debug"
                }
            }
        }
    }
}

 

 

- 젠킨슨에 root 권한으로 접근 할 수 없고  인터페이스를 깔았다고 하나 /usr/local/bin 에 설치한 것이 아니라 환경변수를 참조하는 방식으로 구성했다. env 로 구성 안하면 권한이 없어 eks 에 리소스를 생성할 수 없다.


 

 

 

 

 

 

 

 

 

 

 

'EKS - CI-CD' 카테고리의 다른 글

젠킨슨을 활용해 helm 배포하기  (0) 2024.03.20

관련글 더보기