CI/CD - Jenkins, Docker

gyehwan·2023년 6월 19일
0

Docker와 Jenkins를 이용한 CI/CD 환경을 구축해보려고 한다.
SpringBoot 어플리케이션을 AWS EC2 Linux에 올려놓은 상태이다.

먼저 CI/CD에 대해 알아보자.

🧬 CI/CD

CI (Continuous Integration)

✅ 빌드/테스트 자동화 과정
CI는 개발자를 위한 자동화 프로세스인 '지속적인 통합'을 의미한다.
코드의 새로운 변경 사항이 정기적으로 빌드 및 테스트를 거쳐 공유 레포지토리에 병합된다. 따라서 여러 명의 개발자가 동시에 어플리케이션 개발과 관련된 코드 작업을 할 경우 서로 충돌하는 문제를 이 방법으로 해결할 수 있다.

CD (Continous Deployment)

✅ 배포 자동화 과정
CD는 '지속적인 배포' 또는 '지속적인 서비스 제공'을 의미한다.
지속적인 배포란 개발자의 변경 사항을 레포지토리에서 고객이 사용 가능한 프로덕션 환경까지 자동으로 릴리스하는 것을 의미한다.

CI/CD를 적용하면, 빌드/테스트/배포를 자동화할 수 있고 에러를 미리 방지할 수 있기 때문에 생산성이 높아진다!


🤵🏻‍♂️ Jenkins

1. Jenkins란?

CI/CD 환경을 구축하기 위한 도구이다. 빌드, 테스트, 배포 프로세스를 자동화하여 소프트웨어 품질과 개발 생산성을 높일 수 있다.

2. 기능

  • 프로젝트 표준 컴파일 환경에서의 컴파일 오류 검출
  • 자동화 테스트 수행
  • 정적 코드 분석에 의한 코딩 규약 준수 여부 체크
  • 프로파일링 툴을 이용한 소스 변경에 따른 성능 변화 감시
  • 결합 테스트 환경에 대한 배포 작업

🐳 Docker

먼저 Docker를 이해하려면, 컨테이너에 대한 개념부터 알아야 한다.

컨테이너란?

  • 어플리케이션을 구동하는데 필요한 실행 파일, 라이브러리, 설정 파일 등을 감싸서 어느 환경에서든 실행할 수 있도록 하는 기술이다.
  • 컨테이너를 관리하는 도구 중 가장 유명한 것이 Docker이다.

가상화, 가상머신과 도커의 비교는 아래 블로그를 참조하자.
https://m.blog.naver.com/complusblog/220980996544


CI/CD 환경 구축 실습

1. EC2에 Docker 설치

AWS EC2 환경에 접속 후, 아래 명령어로 Docker 설치

$ sudo yum install docker -y

Docker 실행

$ sudo service docker start

Docker 그룹에 sudo 추가 (인스턴스 접속 후 바로 도커 제어할 수 있도록)

$ sudo usermod -aG docker ec2-user

2. Jenkins image 다운로드

$ docker pull jenkins/jenkins:lts

🚨 위의 명령어를 실행하는 도중 오류를 만났다.

위에서 Docker 그룹에 사용자를 추가했지만 재접속해야 변경 사항이 적용된다고 한다.

3. Docker Image를 Container로 띄우기

아래 명령어를 통하여 다운로드 받은 image를 container로 띄울 수 있다.

$ docker run -d -p 9090:8080 -v/jenkins:/var/jenkins_home --name jenkins -u root jenkins/jenkins:lts
  • -d : detached mode, 백그라운드로 실행할 수 있게 해준다.
  • -p : host(앞)와 container(뒤)의 포트를 연결해준다.
    (포트포워딩) 로컬 Port:컨테이너 Port
  • -v : host(앞)와 container(뒤)의 디렉토리를 연결해준다.
    로컬 Directory:컨테이너 Directory
  • --name : 실행할 컨테이너의 이름을 지정한다.
  • -u : 사용할 사용자의 이름을 지정한다.

🚨 로컬 포트로 8080번을 사용했더니 ec2에 8080포트를 사용하고 있는 것이 있어서 오류가 발생했다.
-> 로컬 포트를 9090번으로 바꿔주고 보안그룹-인바운드 정책에 9090번을 추가해준다.

4. Jenkins 접속하기

ec2 인스턴스의 퍼블릭 IPv4 주소:9090 또는 퍼블릭 IPv4 DNS:9090로 접속이 가능하다.
정상적으로 접속이 되면 다음과 같은 화면을 볼 수 있다.

패스워드는 도커 컨테이너 안의 특정 파일에 존재한다.
아래 명령어를 통하여 패스워드를 확인할 수 있다.

$ docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

🚨 오류를 만났다.
ec2 인스턴스가 불안해서 생긴 문제 같아서 인스턴스 중지, 시작 후 다시 도커를 시작했다.
계정을 만들고 젠킨스를 시작한다.

*Docker 컨테이너 시작/중단/삭제 명령어

  • 컨테이너 시작하기
$ docker start [컨테이너ID or 컨테이너Name]
  • 컨테이너 중지하기
$ docker stop [컨테이너ID or 컨테이너Name]
  • 컨테이너 삭제하기
$ docker rm [컨테이너ID or 컨테이너Name]

5. Jenkins 잡(Job) 생성 및 세팅

젠킨스에서 잡(Job)을 생성하는 방식은 크게 프리스타일과 파이프라인 두 가지로 나뉜다.

프리스타일

프리스타일은 GUI기반으로 젠킨스 잡을 구성할 수 있다. 따라서 간단한 작업에 적합하고 복잡한 작업에는 적절하지 않다.

파이프라인

파이프라인은 일련의 배포 과정을 코드로 작성할 수 있따. 이 코드는 Jenkinsfile이라고 불리는 파일로 관리할 수 있어, Git을 통한 버전관리도 가능하다. 스테이지(Stage)라는 단위로 각 작업에 소요되는 시간, 실패 여부를 시각화하여 확인할 수 있다.

Scripted vs Declarative

파이프라인도 문법에 따라 크게 Scripted와 Declarative 두 가지로 나뉜다.
Scripted 문법은 Declarative에 비해 유연성이나 확장성이 높지만, 복잡도와 유지 보수 난이도가 더 높다.
최근 CI/CD 기조는 Declarative 스타일로 많이 이동되고 있다고 한다.

깃허브에 푸시를 할 때 자동으로 젠킨스가 실행될 수 있도록 깃허브 웹훅을 설정해준다.

Github Webhook 생성

  • Payload URL: 젠킨스 주소/github-webhook/
  • Content type: application/json

Github Access Token 생성

Credentials 만들기

파이프라인 생성

파이프라인 Script

pipeline {
   agent any
   stages {
       stage('Github') {
           steps {
               git branch: 'main', url: 'https://github.com/Chatting-Bar/Chatting-Bar-Server.git'
           }
       }
       stage('Build') {
           steps {
               dir('Chatting-Bar-Server')
                   sh "./gradlew build"
           }
       }
       stage('Deploy') {
           steps {
               dir('Chatting-Bar-Server/build/libs') {
                   sshagent(credentials: ['github_access_token']) {
                        sh 'scp chatbar-0.0.1-SNAPSHOT.jar ec2-user@ip-172-31-42-72'
                        sh 'nohup java -jar chatbar-0.0.1-SNAPSHOT.jar &'
                   }
               }
           }
       }
   }
}

0개의 댓글

관련 채용 정보