jenkins

jenkins - pipe line build job(3)

nerd mix 2020. 4. 3. 01:06

여러개의 서버의 소스를 배포하고 관리하는 과정에서 pipe line을 사용했습니다. 

aws cloud에 세팅 되어있는 서버들은 모두 다른 instance에 존재했습니다. 

jenkins의 하나의 job 안에서 서로 다른 서버에 소스를 배포하는 방법을 찾던 차에 

pipe line을 알게되어 사용하게 되었습니다. 

 

pipe line은 여러개의 stage를 두어 pipe line의 script를 실행하는 것 뿐만이 아니라

jenkins에서 생성해둔 job(item)을 직접 실행시킬 수도 있었습니다. 

 

이번 포스팅에서는 pipe line을 통해서 기존에 생성했던 job을 실행하는 예제입니다. 

job을 실행하기 전에 지난번 포스팅에서 다루었던 input을 통해 변수를 

받고 다음 job에서 파라미터로 받아 실행해보도록 하겠습니다. 

 

이번 포스팅의 진행 순서는 다음과 같습니다. 

1. job 생성

- parameter를 받을 수 있게 세팅

2. pipe line 세팅

input -> job(parameter)

 

1. job 생성

 

 

jenkins 메인 화면에서 "새로운 item"을 클릭하여 "Freestyle project"를 생성합니다. 

위 화면은 "Freestyle project"입니다. 두가지를 설정해줍니다. 

1. General 탭에서 "이 빌드는 매개변수가 있습니다"를 클릭하여 위와같이 설정해줍니다. 

- 매개변수명: pipeline에서 매개변수 이름으로 사용됩니다. 

- Default Value: 값이 할당되지 않으면 기본으로 할당되는 값 입니다. 

2. Build 탭에서 "Execute shell"를 클릭하여 위와같이 설정해줍니다. 

- Command: test용이기 때문에 받은 파라미터를 출력해주는 작업만 해보겠습니다. 

 

2. pipeline 세팅

 

def INPUT_PARAMS
def NODE_ENV

pipeline {
   agent any

   stages {
      stage('Hello') {
         steps {
            timeout(time: 30, unit: 'SECONDS') {
                    script {
                        // Show the select input modal
                       INPUT_PARAMS = input (
                                            message: 'Please Provide Parameters', 
                                            ok: 'Next',
                                            parameters: [
                                                choice(name: 'ENVIRONMENT', choices: ['test','prod'].join('\n'), description: 'Please select the Environment')
                                            ]
                                        )
                        NODE_ENV = INPUT_PARAMS
                        
                        echo NODE_ENV
                    }
                }
         }
      }
      stage('build') {
        steps {
            build job: 'test.api.app.build', parameters: [string(name: 'NODE_ENV', value: NODE_ENV)]
        }
      }
   }
}

 

pipeline은 위와같이 세팅해줍니다. 

pipeline에서의 문법은 일반 programming 언어와 비슷한 면을 가지고 있습니다. 

 

위에서 설명하였듯이 이번 pipeline은 두개의 단계를 가지고 있습니다. 

1. input modal로 값 받기

2. 받은 값을 변수로 받아서 다음 stage에 넘기기

 

최 상단에 사용할 변수인 INPUT_PARAMS와 NODE_ENV 변수를 선언합니다. 

첫번째 stage "Hello"에서 input을 생성하여 string 값을 받습니다. 

input으로 받은 string을 NODE_ENV로 받습니다. 

두번째 stage "Build"에서 NODE_ENV 변수를 사용하여 생성한 job에 파라미터를 넘깁니다. 

 

작업을 완료하였다면 완료하고 다시 pipeline 대시보드로 이동합니다. 

대시보드에서 "Build Now"를 클릭하여 build를 진행합니다. 

 

 

결과는 다음과 같이 확인할 수 있습니다. 

첫번째 stage에서 "prod"라는 값을 input으로 입력받았습니다. 

두번째 stage까지 완료되는 것을 확인 한 후에 두번째 stage를 클릭하면

"Logs"라는 버튼이 나옵니다. "Logs"라는 버튼을 클릭하면

두번째 stage에서 실행한 job의 로그를 확인할 수 있습니다. 

위와 같이 두번째 stage의 로그에 "prod"라는 입력받은 값이 나오는 것을 볼 수 있습니다. 

 

실제로 제가 이 작업을 통해서 적용항 flow는 블록체인 network를 구성하는 6개의 서버를 

배포하는데 사용하였습니다. 

 

6개의 원격 서버를 구동하는데 상황에 따라서

전체 network를 재시작을 하는 경우와 초기화를 하는 경우를 input 변수로 받아서 

모든 stage에서 shell script로 분기를 하는 것이었습니다. 

 

pipeline에서 각 job에 각각의 다른 상황마다 다른 일을 할 수 있게 설정을 할 때 

input이나 parameter를 사용하면 좋을 것 같다는 생각이 들었습니다. 

 

jenkins pipe line의 문법을 자세히 알고 싶으시다면

jenkins pipe line syntax