jongviet

May 29, 2023 - Jenkins 활용 CI/CD 세팅 방법 본문

카테고리 없음

May 29, 2023 - Jenkins 활용 CI/CD 세팅 방법

jongviet 2023. 5. 29. 13:08

*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 연동

 

Comments