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 배포를 하겠습니다.