젠킨스를 eks에 올리면 좋은 점 : pod로 띄워서 slave가 빌드를 해줌
빌드 시작될때, slave를 동적으로 파드의 형태로 배포해서 해당 파드에서 빌드를 수행!!!
RAM을 아낄수있따!!!! 라는 것
https://hudi.blog/jenkins-build-optimization/
https://devroach.tistory.com/32
# jenkins-pvc.yml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: jenkins-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-pvc
namespace: jenkins
spec:
accessModes:
- ReadWriteOnce
storageClassName: jenkins-sc
resources:
requests:
storage: 12Gi
kubectl create namespace jenkins
helm repo add jenkins https://charts.jenkins.io
helm repo update
helm pull jenkins/jenkins
tar xvf jenkins-4.3.30.tgz
cd jenkins
vi values.yaml
# 51, 52번째줄 수정
adminUser:
adminPassword:
# helm 차트에 있는 ingress는 aws alb를 제대로 만들어주지 않는다.
# ingress를 만들려면 따로 만들어야함..^^;;
# VALUES_SUMMARY.md
# jenkins-controller-ingress.yaml
# 두 파일 보니까, api버전도 다르고 값도 다르고 해서 안되는 것으로 보인다.
# 혹시 helm 차트에 바로 하는 법 아시면 댓글로 알려주세요 ㅜㅜ
helm install jenkins -n jenkins -f values.yaml jenkinsci/jenkins
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: jenkins
name: jenkins-ingress
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
alb.ingress.kubernetes.io/load-balancer-name: yusa-jenkins
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/ssl-redirect: '443'
alb.ingress.kubernetes.io/certificate-arn: ${자신의 서티 arn넣기}
spec:
rules:
- host: jenkins.literaryyusa.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: jenkins
port:
number: 8080
[root@ip-10-1-8-104 jenkins]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
atlantis atlantis-0 1/1 Running 7 (8h ago) 8h
jenkins ecs-test-pipeline-23-wk2kq-qg5kx-n3p8d 2/2 Running 0 5s
jenkins jenkins-0 2/2 Running 0 7h23m
저렇게 젠킨스 젠킨스 slave친구들이 만들어졌다가 사라진다!
이제 PV를 붙혀서 slave친구들이 떨어뜨린 파일들을 저장해보자
# agent 595번째 줄 수정
agent:
workingDir: "/var/jenkins_home"
# 627번째 volumes 수정
volumes:
- type: PVC
claimName: jenkins-pvc
mountPath: /var/jenkins_home
readOnly: false
# 658번째 workspaceVolume 수정
workspaceVolume:
type: PVC
claimName: jenkins-pvc
readOnly: false
확인
kubectl exec --namespace jenkins -it svc/jenkins -c jenkins -- /bin/sh
$ cd /var/jenkins_home/workspace/ecs-test-pipeline
$ cat pv-test
Jenkins pv test
확인 완료
**
1. ecs-test-pipeline-53-hlsdm-g6j9g-mnf6k 파드가 뜰때, kankio, aws-cli 컨테이너를 올려줌
2. 20분 제한 넣기
3. 카니코 컨테이너에서 빌드하고
4. aws-cli 컨테이너에서 ecs를 업데이트함.
pipeline {
agent {
kubernetes {
//cloud 'kubernetes'
yaml """
kind: Pod
metadata:
name: kaniko
spec:
containers:
- name: kaniko
image: gcr.io/kaniko-project/executor:debug
imagePullPolicy: Always
command:
- /busybox/cat
tty: true
volumeMounts:
- name: docker-config
mountPath: /kaniko/.docker
# when not using instance role
- name: aws-secret
mountPath: /root/.aws/
- name: aws-cli
image: public.ecr.aws/bitnami/aws-cli:2.4.25
resources:
requests:
cpu: 200m
memory: 400Mi
limits:
cpu: 1024m
memory: 2048Mi
command:
- cat
tty: true
securityContext:
runAsUser: 0
fsGroup: 0
restartPolicy: Never
volumes:
- name: docker-config
configMap:
name: docker-config
- name: aws-secret
secret:
secretName: aws-secrett
"""
}
}
options {
timeout(time: 20, unit: 'MINUTES')
buildDiscarder(logRotator(numToKeepStr: '5', daysToKeepStr: '7'))
}
stages {
stage('Checkout') {
steps {
echo 'Checkout'
git branch: 'main',credentialsId: 'gitlab', url:'${깃랩레포}'
sh """
ls -al
"""
}
}
stage('Build with Kaniko') {
steps {
container(name: 'kaniko') {
sh '''
/kaniko/executor --dockerfile `pwd`/Dockerfile \
--context `pwd` \
--destination={$ECR_repo}
'''
}
}
}
stage('Deploy'){
steps {
container(name: 'aws-cli') {
script{
try {
withAWS(credentials: 'Jenkins') {
sh '''
aws ecs describe-clusters --region us-east-1 --cluster yusa-test-ecs
aws ecs update-service --region us-east-1 --cluster yusa-test-ecs --service hello-yusa-service --force-new-deployment
'''
}
} catch (error) {
print(error)
echo 'Remove Deploy Files'
sh "rm -rf /var/lib/jenkins/workspace/${env.JOB_NAME}/*"
currentBuild.result = 'FAILURE'
}
}
}
}
post {
success {
echo "The deploy stage successfully."
}
failure {
echo "The deploy stage failed."
}
}
}
}
}
task가 늘어났다가 줄어드는 것을 볼수있다.
또한 기존화면에서 변경되는 것을 확인할수 있다.
기존
변경 후
베스트 프렉티스... 대 실패~
role assume해서 하는게 계속 안되서, 그냥 크리덴셜을 넣어버렸다..^^;;
ingress 로 접속하기 위해서 jenkins헬름 values.yaml값을 어떤걸 어떻게 변경하셨나요? 또 그런 정보는 어디에서 대체 알게되나요?
파이프라인 만들때 스크립트는 어떻게 참조했나요? 직접 다 스크립트로 손수 짜야하나요?
공부방법은요?;;; 감사합니다