Jenkins + Argocd Pipline 설정(5부)

mcock·2022년 5월 30일
0

NKS CI/CD구축

목록 보기
6/7

4부에서 Argocd 설정을 진행하였습니다.
5부에서는 1~4부까지 그간 진행한걸 모두 합쳐서 jekins pipeline을 통해 웹어플리케이션 소스를 pull 하고 Maven build 한 후 Docker build , Docker push 및 deployment.yaml Push, Argocd Deploy 까지 되도록 합니다.

아래와 같이 2부에서 생성 했던 mypipleline 을 수정하겠습니다

General 탭에서 String Parameter 매개변수를 추가 합니다.

아래와 같이 추가 하였습니다.
JENKINS_HOME : /var/lib/jenkins
ARGOCD_DOMAIN : argocd.도메인주소
ARGOCD_APP_NAME : mysample
ARGOCD_PW : argocd admin계정의 비번
NCR_TASK_URL : NCR 리파지토리 URL
GIT_AUTHOR_NAME : SourceCommit 계정
GIT_PASSWORD : SourceCommit 비번
NCLOUD_ACCESS_KEY_ID : NCR 리파지토리 ACCESS_KEY_ID
NCLOUD_SERCRET_ACCESS_KEY : NCR 리파지토리 SERCRET_ACCESS_KEY

아래와 같이 Pipeline script 를 작성 하였습니다.

pipeline {
    agent any

    tools {
        // Install the Maven version configured as "M3" and add it to the path.
        maven "M2_HOME"
    }

    stages {
		stage('git Pull') {
            steps {
                // Get some code from a GitHub repository
                git credentialsId: '****', url: 'https://devtools.ncloud.com/****/myreposit.git'
            }           
        }	
        stage('Build') {
            steps {
                // Run Maven on a Unix agent.
                sh "mvn -Dmaven.test.failure.ignore=true -N -f ${JENKINS_HOME}/workspace/mypipeline/review/pom.xml clean package"
            }
        }
        stage('Docker Build') {
            steps {
                script{
					sh "rm -rf ${JENKINS_HOME}/workspace/review_image/Dockerfile"
					sh "rm -rf ${JENKINS_HOME}/workspace/review_image/*.war"
					sh"""
					#!/bin/bash
					cp ${JENKINS_HOME}/workspace/mypipeline/review/**/*.war ${JENKINS_HOME}/workspace/review_image/
					cd ${JENKINS_HOME}/workspace/review_image
                    cat>Dockerfile<<-EOF
FROM tomcat:9-jre8-alpine

COPY server.xml /usr/local/tomcat/conf

RUN rm -rf /usr/local/tomcat/webapps/ROOT.war
RUN rm -rf /usr/local/tomcat/webapps/ROOT
RUN rm -rf /usr/local/tomcat/webapps/docs
RUN rm -rf /usr/local/tomcat/webapps/examples
RUN rm -rf /usr/local/tomcat/webapps/host-manager
RUN rm -rf /usr/local/tomcat/webapps/manager

COPY ROOT.war /usr/local/tomcat/webapps

ENV TZ=Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/\$TZ /etc/localtime && echo \$TZ > /etc/timezone

EXPOSE 7000
EOF"""
					sh"""
					cd ${JENKINS_HOME}/workspace/review_image
					docker login registrytest.kr.ncr.ntruss.com -u ${NCLOUD_ACCESS_KEY_ID} -p ${NCLOUD_SERCRET_ACCESS_KEY}
					docker build -t review .
					docker tag review:latest ${NCR_TASK_URL}/review:ver${env.BUILD_NUMBER}
					docker push ${NCR_TASK_URL}/review:ver${env.BUILD_NUMBER}
					"""
                }
            }
        }
        stage('Push Yaml'){
            steps {
                script{
					sh "rm -rf ${JENKINS_HOME}/workspace/mypipeline/review"
					git url: "https://devtools.ncloud.com/****/yamlreposit.git", branch: "master", credentialsId: "****"
					sh "rm -rf ${JENKINS_HOME}/workspace/mypipeline/yaml"
					sh """
					cd ${JENKINS_HOME}/workspace/mypipeline
					mkdir yaml
					cd yaml
					#!/bin/bash
					cat>deployment.yaml<<-EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: review
  name: review-deployment
spec:
  selector:
    matchLabels:
      app: review
  replicas: 1
  template:
    metadata:
      labels:
        app: review
    spec:
      containers:
      - name: review
        image: ${NCR_TASK_URL}/review:ver${env.BUILD_NUMBER}
        ports:
        - containerPort: 7000
      imagePullSecrets:
      - name: regcred
EOF
					"""
					sh """
					cd ${JENKINS_HOME}/workspace/mypipeline
					git init
					git add .
					git config --global user.email "****"
					git config --global user.name "****"
					git commit -m "Deploy $env.JOB_NAME $env.BUILD_NUMBER" || true
					""" 
					sh"""
#!/bin/bash
expect << EOF
spawn git push https://devtools.ncloud.com/****/yamlreposit.git


expect "Username for 'https://devtools.ncloud.com':"
send "$GIT_AUTHOR_NAME\r";    


expect "Password for 'https://$GIT_AUTHOR_NAME@devtools.ncloud.com':"
send "$GIT_PASSWORD\r";    
                                
expect eof
EOF
					"""                    
                }
            }
        }
		stage('Argo Deploy'){
            steps {
                script{
					sh"""
#!/bin/bash
expect << EOF
spawn /usr/local/bin/argocd login --grpc-web $ARGOCD_DOMAIN


expect "Username:"
send "admin\r";    


expect "Password:"
send "$ARGOCD_PW\r";    
                                
expect eof
EOF
						/usr/local/bin/argocd app get $ARGOCD_APP_NAME
						/usr/local/bin/argocd app sync $ARGOCD_APP_NAME
					"""
				}
			}
        }		
    }
}

위 script 에서 credentialsId, 리포지토리 주소 값 등 별표 **** 은 각자에 맞게 수정해서 사용해야 합니다.

위 pipeline을 실행하기 전에 아래와 같이 jenkins 의 workspace 에 review_image 폴더를 생성 하였습니다.
추가로 review_image 하위에 server.xml 복사해 놓았습니다. (2부 내용 참고)
권한으로 chown -R jenkins.jenkins * 로 주었습니다.

기존 4부에서 생성한 argocd 에 mysample 이란 어플리케이션에서 nginx-deployment deploy 는 콘솔에서 삭제 합니다. (mysample 어플리케이션 말고 deploy 를 삭제 해야 합니다.) 아래 명령어로 삭제된것을 확인 합니다.

이제 pipeline 을 실행해 보시면 한번에 잘되면 좋겠으나 오류들이 발생 될 것 입니다. 주로 권한 문제들 입니다. 그중 아래 오류 발생 시

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/auth: dial unix /var/run/docker.sock: connect: permission denied

sudo usermod -a -G docker jenkins 실행 후 jenkins 재시작 합니다.
이밖에도 /usr/local/bin/argocd 에 대한 권한이 없다면 chmod 755 argocd 로 권한을 부여 합니다.

이제 서비스 확인을 합니다.
각 mysample-svc.yaml 과 mysample-ingress.yaml 파일을 각 생성 합니다.

apiVersion: v1
kind: Service
metadata:
  name: review-svc
spec:
  ports:
    - port: 7000
      name: http
      protocol: TCP
      targetPort: 7000
  type: NodePort
  selector:
    app: review
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: review-ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
    alb.ingress.kubernetes.io/description: 'alb ingress controller'
  labels:
    app: review-ingress
spec:
  backend:
    serviceName: review-svc
    servicePort: 7000
  rules:
    - http:
        paths:
          - path: /*
            backend:
              serviceName: review-svc
              servicePort: 7000

각 파일을 저장 후

kubectl apply -f mysample-svc.yaml

kubectl apply -f mysample-ingress.yaml 

를 실행 합니다.
최종 아래와 같이 로드밸런서가 생성이 됩니다.

혹여나 진행하다가 막히면 아래 명령어로 pod, svc 7000포트 연결이 잘되는지 확인 해보고 로그밸런서 로그 확인해서 디버깅 합니다.

kubectl port-forward --address 0.0.0.0 pod/review-deployment-6888877bd4-bj52b 7000:7000

kubectl port-forward --address 0.0.0.0 svc/review-svc 7000:7000

kubectl logs -n kube-system -l app.kubernetes.io/name=alb-ingress-controller

6부에서는 argcd pollout 설정을 통한 blue/green 배포를 하겠습니다.

0개의 댓글