2022이전/Toy_Project

Jenkins를 이용한 CI/CD

바로퇴장 2020. 10. 23. 18:37

Jenkins

Jenkins는 소프트웨어 빌드, 테스트, 제공 또는 배포와 관련된 모든 종류의 작업을 자동화하는 데 사용할 수있는 독립형 오픈 소스 자동화 서버입니다. 즉 CI/CD를 위한 통합 개발 툴이다.

  • CI(Continuous Integration)
    지속적인 통합을 의미한다. 이는 개발자를 위한 자동화 프로세스 중 하나이며 어플리케이션을 변경할 때 자동으로 빌드 및 테스트되어 Github 공유 레포지토리에 병합된다. 그렇기에 협업 시 발생할 수 있는 충돌문제를 해결할 수 있다.
  • CD(Continuous Deployment)
    지속적인 배포를 의미한다. 어플리케이션 변경 사항이 반영된 공유 레포지토리에서 사용자가 사용 가능한 환경까지 자동으로 배포하는 것을 말한다. 이를 통해 어플리케이션을 원활히 그리고 더 빠르게 제공하므로써 사용자의 피드백을 빠르게 반영할 수 있다.

Jenkins 핵심 기능

  • 프로젝트 표준 컴파일 환경에서의 컴파일 오류 검출

  • 자동화 테스트 수행

  • 정적 코드 분석에 의한 코딩 규약 준수여부 체크

  • 프로파일링 툴을 이용한 소스 변경에 따른 성능 변화 감시

  • 결합 테스트 환경에 대한 배포작업

Jenkins 설치

Jenkins를 설치하는 데 있어서 도커를 이용하여 Jenkins 이미지 컨테이너를 생성한다.

Docker 란?

컨테이너 기반 가상화 플랫폼입니다. 레이어로 관리되는 가벼운 이미지로 컨테이너를 관리해 레지스트리 및 도커허브에 배포가 가능하며, 확장성이 용이합니다.

가. Pre-install

나 . Install

  • Java Spring Boot 형식 프로젝트 생성

    • Gradle을 통해 Build 하기 위함이다.
  • Docker Jenkins DockerFile 작성

  • Build.gradle 에 Docker 실행

  • gradle 명령어를 통해 미리 작성된 내용으로 컨테이너를 생성한다.

    gradlew docker dockerRun

Jenkins Seed Job 설정하기

젠킨스 또한 github과 연동하여 변경사항을 관리가 가능합니다.. SeedJob.xml SCM에 Github 주소를 등록하여 Pipeline 변경사항을 github을 통해 관리하도록 하였습니다. 그리고 createJob.groovy 파일에 원하는 pipeline 을 작성하였습니다.

Jenkins-Demo>SeedJob.xml

<?xml version='1.1' encoding='UTF-8'?>
<project>
  <description></description>
  <keepDependencies>false</keepDependencies>
  <properties/>
  ...
  <scm class="hudson.plugins.git.GitSCM" plugin="git@4.2.2">
    <configVersion>2</configVersion>
    <userRemoteConfigs>
      <hudson.plugins.git.UserRemoteConfig>
        <url>https://github.com/gmldbd94/jenkins-demo.git</url>
      </hudson.plugins.git.UserRemoteConfig>
    </userRemoteConfigs>
    <branches>
      <hudson.plugins.git.BranchSpec>
        <name>*/master</name>
      </hudson.plugins.git.BranchSpec>
    </branches>
    <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
    <submoduleCfg class="list"/>
    <extensions/>
  </scm>
    ...
</project>

Jenkins-Demo>createJob.groovy

pipelineJob('pipelineJob') {
    definition {
        cps {
            script(readFileFromWorkspace('pipelineJob.groovy'))
            sandbox()
        }
    }
}
pipelineJob('openshy4j'){
    definition{
        cpsScm{
            scm{
                git{
                    remote{
                        url 'https://github.com/sieun4/openshy4j.git'
                    }
                    branch 'master'
                    scriptPath 'Jenkinsfile'
                }
            }
        }
    }
}
pipelineJob('openshy4j-docker'){
    definition{
        cpsScm{
            scm{
                git{
                    remote{
                        url 'https://github.com/sieun4/openshy4j.git'
                    }
                    branch 'master'
                    scriptPath 'Jenkinsfile-docker'
                }
            }
        }
    }
}

위 pipeline을 작성함으로써 관리하고자 하는 프로젝트의 Jenkinsfile,Jenkinsfile-docker 파일의 내용을 바탕으로 Pipeline이 동작할 수 있도록 설정을 했습니다.

위 코드들의 동작 과정은 아래의 동작과정와 과정을 거쳐 작동합니다.

  • Seed-job : jenkins 초기 pipeline을 입력
  • CreateJobs.groovy : Jenkins GitHub Fetch
  • Pipeline 감시 : 각 스테이지에 해당하는 동작들을 프로젝트 GitHub 내용을 모니터링하여 Commit 발생시 자동으로 실행
img

Pipepline 설정하기

openshy4j>Jenkinsfile

pipeline {
    agent any

    triggers {
        pollSCM '* * * * *'
    }
    stages {
        stage('Build') {
            steps {
                sh './gradlew assemble'
            }
        }
        stage('Test') {
            steps {
                sh './gradlew test'
            }
        }
    }
}

openshy4j>jenkinsfile-docker

pipeline {
    agent any

    triggers {
        pollSCM '* * * * *'
    }
    stages {
        stage('Build') {
            steps {
                sh 'chmod +x gradlew'
                sh './gradlew assemble'  ##build파일 생성
            }
        }
        stage('Build Docker image') {
            steps {
                sh 'chmod +x gradlew'
                sh './gradlew docker' ## 도커 실행
            }
        }
        stage('Push Docker image') {
            environment {
                DOCKER_HUB_LOGIN = credentials('docker-hub')
            }
            steps {
                sh 'chmod +x gradlew'
                sh 'docker login --username=$DOCKER_HUB_LOGIN_USR --password=$DOCKER_HUB_LOGIN_PSW'
                sh './gradlew dockerPush' ## 도커 허브에 이미지 파일 업로드
            }
        }
    }
}

openshy4j>DockerFile

FROM openjdk:11

ARG JAR_FILE
COPY ${JAR_FILE} app.jar

ENTRYPOINT ["java", "-jar", "/app.jar"]

openjdk 서비스를 이용하여 도커 컨테이너의 배포환경이 바로 될 수 있도록 설정함으로써 도커이미지를 설정해주었습니다.

여기서, app.jar 파일은 openshy4j 프로젝트를 build하여 jar파일 입니다.

openshy4j>Build.gradle

![image-20201021123817414](/Users/huiyung/Library/Application Support/typora-user-images/image-20201021123817414.png)

위와 같은 Pipeline을 통해 Openshy4j 배포환경의 컨테이너 이미지가 생성되고 해당 이미지를 DockerHub에 올릴 수 있습니다. 그리고 생성한 이미지를 도커 컨테이너 배포도 가능하다.

img

![image-20201023183151958](/Users/huiyung/Library/Application Support/typora-user-images/image-20201023183151958.png)

이제 잘 실행되는 것을 확인 할 수 있다.