| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
- ajax
- spring
- 예매로직
- AWS RDS
- mysql
- MySQL Error
- Kubernetes
- 인생이재밌다
- html
- ES6
- ssh
- node.js
- jsp
- AWS Route53
- sessionStorage
- 영화예매
- Get
- post
- Java
- chartjs
- Bootstrap
- javascript
- topologySpreadConstraints
- AWS
- terminationGracePeriodSeconds
- mongodb
- git
- zombie-hit apartment
- json
- spread operator
- Today
- Total
jongviet
May 29, 2023 - Jenkins 활용 CI/CD 세팅 방법 본문
*5월29일
-전전 개발 직장에서 git action과 Jenkins를 활용하여 CI/CD를 구축한 시니어분이 있었다. 당시에는 그냥 사용해보기만 했었는데 현 직장에서 깃 푸시에 맞춰 빌드 후 쿠버네티스 pod를 띄우는 과정까지 처리하게 되었다. 최초 세팅이고 아직 테스트 쪽이 빠져있어 어떻게 세팅했는지만 개인적으로 정리해보고자 한다.
-리눅스 관련 명령어를 별도로 공부했었는데 오랜만에 하려니 다시 생각이 잘 안난다.. 아래 정도만 다시 리마인드하자..
$df -h // 용량
$free -h //메모리
$sudo find / -name 'swap.*’ // 파일찾기
$cat // 파일 터미널 상 표시
$ls -al // 숨김 파일 포함 전체 파일 표시
$vi
$vim
1.적절한 AWS EC2 인스턴스를 선택해서 생성 후 보안그룹, swap memory 처리까지 해보자.
-일단 일부 웹 프로젝트에만 선제적으로 적용할 계획이고 jenkins 세팅을 통해 동시 빌드가 불가능하도록 세팅해 최소한의 사양만 가지고 가기로 했다.
ubuntu 20.04 LTS, x86 / 16gb gp3 / rsa key pair / 2gb memory - 프리티어보다 한 단계 높은 수준
-보안그룹은 22, 80, 443, jenkinsPort 정도 내 아이피 기준으로 최소한으로 열고, 추가적으로 git webhook용으로 하기를 뚫어줘야 push 이후 jenkins 빌드 작업이 된다.
192.30.252.0/22, 140.82.112.0/20 // gitwebhook
-swap memory 설정은 저사양 ec2 인스턴스 사용 시 거의 필수적으로 적용하는데 ec2 메모리가 너무 작아서 실제 디스크의 용량을 좀 당겨 쓰는 개념이다. 일반적으로 ec2 메모리 기준 2배 정도가 추천된다고 한다. (터지게 하지 않는 정도의 목적.. 스왑메모리를 통한다면 당연히 속도는 좀 더 느리다)
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=32 // bs*count가 최종 용량이라고 생각하면된다.
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ sudo swapon -s
$ sudo vi /etc/fstab // 맨 아래줄에 '/swapfile swap swap defaults 0 0' 삽입
-free -h를 통해 보면 적절하게 할당되었음을 볼 수 있다.
total used free shared buff/cache available
Mem: 1.9Gi 829Mi 166Mi 0.0Ki 977Mi 970Mi
Swap: 4.0Gi 0B 4.0Gi
-만약 용량을 재설정하고 싶다면, 하기 과정을 수행 후 새로 세팅하면 된다.
$ sudo swapoff -v /swapfile
$ sudo vi /etc/fstab // '/swapfile swap swap defaults 0 0' 주석처리
$ sudo rm /swapfile
-이렇게 해준다면 적어도... 0.5gb 메모리 기준으로도 yarn 하다가 터지지는 않는다. (물론 프로젝트 사이즈 별로 다름..)
2.Jenkins 셋업
-아래 명령어 한꺼번에~
$ curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
/usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update
sudo apt-get install jenkins
-public IP로 웹에서 접근하여 초기 비밀번호를 요구하면 아래에서 받아서 입력
$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword
-많이 세팅 해봤다면 본인이 필요한 플러그인을 잡고 아니라면 suggested plugin 기준으로 설치

-다 설치가되면 새로운 item 추가를 통해 여러가지 방식으로 빌드 처리를 할 수 있다. freeStyle / pipeline 정도로 진행해봤는데 freeStyle은 마치 lambda를 콘솔에서 처리하는 방식처럼 편리하지만 프로젝트 내 jenkinsFile을 넣고 깃을 통해 함께 관리하는 방식과 같이 협업에 맞지 않는 것 같아서 pipeline 방식으로 최종 가기로 했다.
-ec2 사양이 충분하다면 모르겠지만... 아니라면 아래와 같이 동시 빌드 미허용으로 가자.. 추가적으로 같은 파이프라인에 빌드 요청이 왔을 때 이전 빌드가 진행중이면 중단 시키는 세팅이 있는데 이는 팀 내 협업 방식에 따라 맞게 가자.
-추가적으로 오래된 빌드 삭제 세팅을 통해 일부 용량을 세이브 할 수 있다. 로그 관리와 같이 원하는 기간 만큼 보관 할 수 있고 최대 보관 개수를 설정할 수 있다. (path는 /var/lib/jenkins/workspace/ 이므로 테스트 단계에서 용량이 부족하다면 직접 지워가면서... 그럴일은 없을듯하긴 하다)

-빌드 트리거는 github hook trigger for GITScm polling로 잡아서 특정 깃 내 특정 브랜치에 푸시 되었을 때 폴링하고 있던 jenkins가 반응하도록 처리. 약어가 궁금해서 찾아본 SCM은 아래와 같다.
SCM stands for Source Control Management

-파이프라인은 pipeline script from SCM으로 잡아 프로젝트 루트 경로 내 JenkinsFile을 쓰도록 하자.
-Repo를 연결해주고 credentials는 id & git personal token을 이용해서 뚫어주자.

-빌드할 브랜치, jenkinsFile path

-추가적으로 global tool configuration에서 필요한 Nodejs, docker, JDK 버전 등이 있다면 별도로 셋업해주면 된다. 거기에 이름으로 적은 명칭을 JenkinsFile 내 툴 명칭으로 연결해주면 된다.
tools {
nodejs 'myNodejs'
}
-스크립트는 예시가 많으니 필요에 따라 구성하면되고, 각 스테이지가 jenkins admin 내 아래와 같이 표시된다고 보면 된다. 좀 더 세부적으로 구분할 필요가 있다.

ex)
stage('Yarn') {
steps {
echo 'yarn installing...' // 젠킨스 로그 상 남길 수 있다.
sh 'yarn' // 실제 쉘 스크립트 상 실행할 명령어
}
}
-슬랙 알림의 경우 상단에 def로 변수 지정 후 사용해도 되고, 다른 방식으로 적용해도 된다.
-셋업의 경우 젠킨스 관리 -> 시스템 구성으로 넘어가 본인 workspace, 슬랙 통합 토큰 자격 증명 그리고 채널명등을 활용하여 셋업하면 된다.
post {
failure {
slackSend (
channel: SLACK_CHANNEL,
message: "배포 실패 REPO: ${REPO_NAME} / ENV: ${NAMESPACE}"
)
}
success {
slackSend (
channel: SLACK_CHANNEL,
message: "배포 성공 REPO: ${REPO_NAME} / ENV: ${NAMESPACE}"
)
}
}
3.git 관련 설정
-CI/CD를 적용하고자 하는 프로젝트 setting -> webhooks로 이동한다. payload URL은 당연히 jenkins와 같이 잡고 뒤에 /github-webhook/ 을 붙여주면 된다.
ex)http://1.2.3.4:{jenkins-port}/github-webhook/
-Recent deliveries 탭에서 특정 브랜치 코드 푸시 이후 POST로 잘 전달 되었는지 내역을 볼 수 있다. 여기서 주로 전달이 안되는 경우는 보안그룹 문제나 payload URL 문제이므로 잡아주면 된다.

-EC2 내 깃도 미리 추가해두고 본인 깃 계정 SSH Key 설정도 해두자
$sudo apt-get install git
4.기타 필요 패키지들 셋업
#java
$sudo apt update
$sudo apt install openjdk-11-jdk
$java -vercion
$javac -version
$vim ~/.bashrc
맨 아랫줄
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
export PATH=$PATH:$JAVA_HOME/bin
$source ~/.bashrc
$echo $JAVA_HOME
#docker
$sudo apt install -y docker.io
$sudo chmod 666 /var/run/docker.sock
$sudo user add jenkins
$grep docker /etc/group
$sudo user mod -a -G docker jenkins
$grep docker /etc/group
docker:x:123:jenkins
분명히 jenkins admin password를 똑바로 쳤는데도 패스워드가 틀렸다고 돌게 만드는 경우가 있다. 그렇다면 아래 실행
sudo vi /etc/sudoers
jenkins ALL=(ALL) NOPASSWD: ALL
$ sudo service docker start
$ sudo systemctl enable docker.service
$ docker run hello-world // 작동 테스트
#kubernetes 및 helm 셋업
$ curl -o kubectl // 본인의 쿠버 버전 url curl
$ chmod +x ./kubectl
$ mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
$ echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
$ kubectl version --short
$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 > get_helm.sh
$ chmod 700 get_helm.sh
$ ./get_helm.sh
-그후 eks도 연동 후 쿠버네티스 경로 관련 문제가 생기면 kubectl client를 /usr/local/bin으로 옮겨주자! kubectl get pods로 테스트!
#aws cli
$sudo apt install awscli
$aws configure
#nodejs & yarn
$sudo apt-get install nodejs
$curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$sudo apt update
$sudo apt install yarn
5.기타 짜증나는 것들...
-ssh로 직접 ec2 접근하여 진행 시 문제는 없던것들이 젠킨스 빌드 통해서 진행하면 자꾸 접근 권한 문제 등이 생긴다.
error: the server doesn't have a resource type "deploy”
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.24/auth": dial unix /var/run/docker.sock: connect: permission denied
kubectl not found..
docker not found...
Failed to initialize Kubernetes secret provider
-아래와 같이 젠킨스 내 직접 뚫어주자.
$sudo su jenkins
$aws configure // 적절한 IAM 권한 및 eks 연동