동적 변수를 젠킨스 파라미터로 사용하기 (Extended Choice Parameter)

![jenkins-banner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/4784deb8-fff3-86f5-0700-5d87c4105ac1.png)
## TL;DR
> 동적 변수를 젠킨스 파라미터로 가져와서 사용하는 방법을 공유합니다.
> 예) AWS S3의 버킷리스트 확인하고, 지정 버킷에 파일 업로드
> [Extensible Choice Parameter](https://plugins.jenkins.io/extensible-choice-parameter/) 플러그인과 Groovy 그리고 [AWS CLI](https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-chap-install.html)를 사용하였습니다.

## 사전 설치
- Jenkins 2.222.1
  - [Extensible Choice Parameter](https://plugins.jenkins.io/extensible-choice-parameter/) 1.6.0 플러그인 설치
- [AWS CLI](https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-chap-install.html) 1.18.43

### AWS CLI 설치 및 설정

```bash
# aws cli 설치
$ apt-get update
$ apt-get install python-pip
$ pip install awscli
aws-cli/1.18.43 Python/2.7.13 Linux/4.15.0-43-generic botocore/1.15.43

# aws configure 설정
$ aws configure
AWS Access Key ID [None]: # Access Key 입력
AWS Secret Access Key [None]: # Secret Key 입력
Default region name [None]: # ap-northeast-2
Default output format [None]: # 그냥 엔터

# S3 Butcket 리스트 확인
$ aws s3 ls
2020-04-29 01:46:23 jenkins-bucket-01
2020-04-29 01:46:37 jenkins-bucket-02
2020-04-29 01:46:46 jenkins-bucket-03
2020-04-29 05:06:10 jenkins-bucket-04
2020-04-29 05:06:22 jenkins-bucket-05
```

## Jenkins Job 설정 및 실행

### 1. Extended Choice Parameter 추가
`S3_BUCKET_NAME` 이름의 파라미터를 생성하고, 아래 그림과 같이 설정합니다.

![j001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/e67e3d25-fd1a-5a06-bcb7-002a5e6bb83d.png)


```groovy:GroovyScript

import hudson.model.*
import jenkins.model.*

def listBucket() {
    def bucket= ("aws s3 ls").execute() // s3 버킷 리스트 확인
    return bucket.text.readLines().collect { it.split()[2] }.unique().join(",")
}
return listBucket()
```
### 2. Git 추가
업로드 테스트 할 `Dockerfile` 파일을 젠킨스 저장소에서 다운로드 받습니다.
https://github.com/jenkinsci/jenkins.git 
![j002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/c61bed62-da47-b2d0-f560-931c86f18e8f.png)


### 3. Excute shell 추가
`Dockerfile` 파일의 업로드와 업로드확인 명령을 수행합니다.
![j003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/795663d1-226c-b074-0111-4b5556e6b51d.png)

```bash:shell
#!/bin/sh
echo "    > AWS S3 ${S3_BUCKET_NAME} 업로드.."
aws s3 cp ./Dockerfile s3://${S3_BUCKET_NAME}/Dockerfile

echo "    > AWS S3 ${S3_BUCKET_NAME} 업로드 확인..."
aws s3 ls s3://${S3_BUCKET_NAME}
```
### 4. Job 실행
최초 Build with Parameters 선택시 바로 실행되지 않습니다.
Groovy Script 동작을 승인하는 과정이 필요합니다. (1회)

> In-Process Script Approval > Approve

![r001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/55325fa2-4add-b04e-feae-89a66de2a4d0.png)
![r002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/5abce991-767d-bcc6-4adb-7f64bd017544.png)

다시 Build with Parameters 선택 합니다.
드디어! :thumbsup_tone2: 매개변수 항목에 S3 Bucket 리스트를 확인하고 선택할 수 있습니다.
`jenkins-bucket-05`로 선택 후, 빌드하기를 해보겠습니다.
![v001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/bbdefaac-1233-f5e0-5cb9-5e533c899e2b.png)
![s001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/b6f3e179-7d8a-50eb-7971-2a08111c3a56.png)


콘솔 아웃풋 보면, `Dockerfile`이 업로드 됨을 확인할 수 있습니다.
물론 AWS 웹 콘솔에서도 확인 가능합니다.
![v002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/e61018a0-c279-aeef-a009-cdc0cbd021ad.png)
![v003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/2cdda6a6-4be2-7328-925d-3430d929f55d.png)

## 맺음말
> 어떤 동적 변수를 가져와서 잘 활용하느냐가 가치일 것입니다.

최근 AWS 시작(?)하면서, 예를 S3로 하였습니다.
(Shell 방식이 아닌) AWS 관련 Jenkins 플러그인도 설치하고 사용하면서 다른 후기도 남겨볼께요.