반응형

Jenkins Pipeline 으로 CI/CD 를 구축할 때 가장 기본적으로 repository 에서 git 을 clone 하여 build 하는 과정은 반드시 존재한다.

이 과정이 CI (Continuous Integration) 으로 지속적인 통합이라고 할 수 있다.
즉 개발자는 소스코드 개발에만 집중하며 변경사항이 공유 레파지토리에 지속적으로 통합하는 것을 의미한다.
공유 레파지토리에 수정사항이 발생하면 파이프라인은 자동으로 빌드 후 배포까지 수행할 수 있어 개발자는 온전히 소스 코드만 개발할 수 있다는 장점이 있다.

 

1. Git Clone

그럼 먼저 공유 레파지토리에서 소스를 가져오는 stage 가 필요하다.
공유 저장소가 PUBLIC 권한이라면 상관없겠지만 대부분은 PRIVATE 저장소로 구성되어 있다. 그래서 저장소에 접근할 수 있는 계정을 먼저 Jenkins 의 Credential 로 저장해 놓아야 한다.

파이프라인에서 git 명령을 사용하려면 plugin 이 설치되어 있어야 한다. 그렇지 않으면 DSL 에러가 발생할 것이다.
https://plugins.jenkins.io/git/

 

Git

This plugin integrates <a href="https://git-scm.com/" target="_blank" rel="nofollow noopener noreferrer">Git</a> with Jenkins.

plugins.jenkins.io

해당 주소의 문서에서 참고하면 파이프라인 코드를 쉽게 작성할 수 있다.

def checkout(git_url, credentialsId) {
    println "${branch}"
    println "${credentialsId}"
    println "${git_url}"
  def req_branch = "${branch}"
  req_branch = req_branch.trim()

  checkout poll: false,
  changelog: true,
  scm: [$class: 'GitSCM',
  branches: [[name: req_branch]],
  doGenerateSubmoduleConfigurations: false,
  extensions: [[$class: 'PruneStaleBranch'],[$class: 'WipeWorkspace']],
  submoduleCfg: [],
  userRemoteConfigs: [[credentialsId: "${credentialsId}",
  url: "${git_url}"]]]
}

git_url, branch, credential 정보를 받아서 수행하는 함수, 원하는 공유 레파지토리의 브랜치를 지정한 credential 로 받아올 수 있다.
추가 옵션으로 PruneStaleBranch (원격에 존재하지 않는 branch 제거), WipeWorkspace (clone 전에 디렉토리 정리) 지정하였다.

 

2. Build

소스를 가져왔으면 이제 빌드를 수행해야 한다. 빌드 툴이 무엇을 사용하냐에 따라 다를 수 있다. gradle, gardlew, maven, node 등 많은 빌드 툴이 있고 그에 따른 명령어가 다르기 때문에 파이프라인에서 해당 소스 코드의 툴을 지정해줘서 분기를 탈 수 있게 해주어야 한다.
여기서는 gradle 이 장비에 설치되어 있어서 해당 gradle 을 사용한다고 가정한다.

def gradle() {
  def gradle_home = //gradle directory
  sh "#!/bin/sh -e\n " + "${gradle_home}/gradle clean build" + " --refresh-dependencies"
}

빌드 시에는 정말 다양한 옵션이 추가될 수 있는데 여기서는 gradle clean build --refresh-dependencies 로 빌드한 것이다.
Jenkins 의 파라미터 여부에 따라서 옵션이 추가될 수 있도록 변경할 수 도 있기 때문에 해당 파이프라인이 적용되어야 할 프로젝트에 맞게 저 빌드툴, 빌드 커맨드를 조절해주면 된다.

3. Pipeline Stage

이제 앞서 만든 함수들을 이용해서 파이프라인을 작성해주면 된다. 근데 주의할 점은 gradle 로 빌드하더라도 JAVA 버전이 일치해야 한다.
그래서 파이프라인에서 JAVA Version 까지 지정하여 build Stage 를 작성한다.
이번 편에서는 gradle, jdk17 등 특정 상황에 대한 내용만 있지만 파이프라인과 함수들을 수정하여 분기를 태우면 모든 상황에 대해 대처가 가능한 파이프라인을 생성할 수 있다.

def pipeLine()
{
	node {
        stage ('code Update') {
			git.checkout("git_url", "credential")
		}

		stage ('build') {
			//java17 설정
			env.JAVA_HOME = "/usr/lib/jvm/jdk-17"
			env.PATH="${env.JAVA_HOME}/bin:${env.PATH}"
			sh "java -version"
			
			build.gradle("test")
		}
	}
}

pipeLine()

git_url, credential 에는 앞서 지정했던 주소와 크레덴셜을 작성해주면 원하는 저장소의 Code 를 clone 할 수 있다.
다음 build stage 에서 jdk 경로, path 설정 후 build 명령을 실행하면 git clone 부터 build 까지의 파이프라인을 작성할 수 있다.

반응형