Jenkins를 이용한 CI/CD
Jenkins
Jenkins는 소프트웨어 빌드, 테스트, 제공 또는 배포와 관련된 모든 종류의 작업을 자동화하는 데 사용할 수있는 독립형 오픈 소스 자동화 서버입니다. 즉 CI/CD를 위한 통합 개발 툴이다.
- CI(Continuous Integration)
지속적인 통합을 의미한다. 이는 개발자를 위한 자동화 프로세스 중 하나이며 어플리케이션을 변경할 때 자동으로 빌드 및 테스트되어 Github 공유 레포지토리에 병합된다. 그렇기에 협업 시 발생할 수 있는 충돌문제를 해결할 수 있다. - CD(Continuous Deployment)
지속적인 배포를 의미한다. 어플리케이션 변경 사항이 반영된 공유 레포지토리에서 사용자가 사용 가능한 환경까지 자동으로 배포하는 것을 말한다. 이를 통해 어플리케이션을 원활히 그리고 더 빠르게 제공하므로써 사용자의 피드백을 빠르게 반영할 수 있다.
Jenkins 핵심 기능
프로젝트 표준 컴파일 환경에서의 컴파일 오류 검출
자동화 테스트 수행
정적 코드 분석에 의한 코딩 규약 준수여부 체크
프로파일링 툴을 이용한 소스 변경에 따른 성능 변화 감시
결합 테스트 환경에 대한 배포작업
Jenkins 설치
Jenkins를 설치하는 데 있어서 도커를 이용하여 Jenkins 이미지 컨테이너를 생성한다.
Docker 란?
컨테이너 기반 가상화 플랫폼입니다. 레이어로 관리되는 가벼운 이미지로 컨테이너를 관리해 레지스트리 및 도커허브에 배포가 가능하며, 확장성이 용이합니다.
가. Pre-install
- 도커 환경 설치하기
- OS 환경 : Windows
- Docker 공식 다운로드 : https://hub.docker.com/editions/community/docker-ce-desktop-windows/
나 . 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 발생시 자동으로 실행
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에 올릴 수 있습니다. 그리고 생성한 이미지를 도커 컨테이너 배포도 가능하다.
![image-20201023183151958](/Users/huiyung/Library/Application Support/typora-user-images/image-20201023183151958.png)
이제 잘 실행되는 것을 확인 할 수 있다.