안녕하세요.
"CI - Jenkins (1)" 포스팅 내용에 이어서
Jenkins의 세부설정과 CI에서 사용되는 Jenkinsfile에 대해서 다뤄보겠습니다.
구성도
작업하려고하는 부분입니다.
사용한 Plugin List
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'
순서로 진입해서 목적에 따라 설정하면 됩니다.
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 |