DevOps 관리자 또는 개발자는 Code Stream의 기능을 확장하는 사용자 지정 스크립트를 생성할 수 있습니다.

스크립트를 사용하여 애플리케이션을 구축, 테스트 및 배포하는 고유한 CICD(지속적 통합 및 전달) 툴 및 API와 Code Stream을 통합할 수 있습니다. 사용자 지정 스크립트는 특히 애플리케이션 API를 공개적으로 노출하지 않는 경우에 유용합니다.

사용자 지정 스크립트는 Code Stream과 통합되는 빌드, 테스트 및 배포 도구에 필요한 거의 모든 작업을 수행할 수 있습니다. 예를 들어 스크립트는 파이프라인 업무 공간에서 작동하여 애플리케이션을 구축 및 테스트하는 지속적 통합 작업과 애플리케이션을 배포하는 지속적 전달 작업을 지원할 수 있습니다. 또한 파이프라인이 완료되면 Slack에 메시지를 보내는 등의 작업을 수행할 수 있습니다.

Code Stream 파이프라인 업무 공간은 지속적 통합 작업 및 사용자 지정 작업을 위해 Docker 및 Kubernetes를 지원합니다.

업무 공간 구성에 대한 자세한 내용은 파이프라인 작업 공간 구성에서 참조하십시오.

지원되는 언어 중 하나로 사용자 지정 스크립트를 작성합니다. 스크립트에서 비즈니스 논리를 포함하고 입력과 출력을 정의합니다. 출력 유형에는 숫자, 문자열, 텍스트 및 암호가 포함될 수 있습니다. 다양한 비즈니스 논리, 입력 및 출력을 사용하여 여러 버전의 사용자 지정 스크립트를 생성할 수 있습니다.

생성한 스크립트는 Code Stream 인스턴스에 상주합니다. YAML 코드를 가져와서 사용자 지정 통합을 생성하거나 스크립트를 YAML 파일로 내보내서 다른 Code Stream 인스턴스에서 사용할 수 있습니다.

파이프라인이 사용자 지정 작업에서 릴리스된 스크립트 버전을 실행하도록 합니다. 릴리스된 버전이 여러 개 있는 경우 그 중 하나를 최신으로 설정할 수 있습니다. 그러면 사용자 지정 작업을 선택할 때 최신 -->이 함께 표시됩니다.

파이프라인에서 사용자 지정 통합을 사용하는 경우 사용자 지정 통합을 삭제하려고 하면 오류 메시지가 표시되고 삭제할 수 없음을 나타냅니다.

사용자 지정 통합을 삭제하면 사용자 지정 스크립트의 모든 버전이 제거됩니다. 임의의 스크립트의 버전을 사용하는 사용자 지정 작업이 있는 기존 파이프라인은 실패합니다. 기존 파이프라인이 실패하지 않도록 하려면 더 이상 사용하지 않으려는 스크립트 버전을 폐기하고 철회하면 됩니다. 해당 버전을 사용하는 파이프라인이 없는 경우 이를 삭제할 수 있습니다.

표 1. 사용자 지정 스크립트를 작성한 후 수행할 작업
수행할 작업... 이 작업에 대한 자세한 내용...

파이프라인에 사용자 지정 작업을 추가합니다.

사용자 지정 작업:

  • 파이프라인의 다른 CI 작업과 동일한 컨테이너에서 실행됩니다.
  • 파이프라인이 사용자 지정 작업을 실행하기 전에 스크립트가 채우는 입력 및 출력 변수를 포함합니다.
  • 스크립트에서 입력과 출력으로 정의된 여러 데이터 유형과 다양한 메타데이터 유형을 지원합니다.

사용자 지정 작업에서 스크립트를 선택합니다.

스크립트에서 입력 및 출력 속성을 선언합니다.

파이프라인을 저장한 다음 사용하도록 설정하고 실행합니다.

파이프라인이 실행되면 사용자 지정 작업이 지정된 스크립트를 호출하고 스크립트 내의 비즈니스 논리를 실행합니다. 그러면 구축, 테스트 및 배포 도구가 Code Stream과 통합됩니다.

파이프라인이 실행되면 실행을 살펴봅니다.

파이프라인에서 예상한 결과를 전달했는지 확인합니다.

사용자 지정 통합 버전을 호출하는 사용자 지정 작업을 사용하는 경우 사용자 지정 환경 변수를 파이프라인 작업 공간 탭에 이름-값 쌍으로 포함할 수 있습니다. 빌더 이미지가 CI 작업을 실행하고 이미지를 배포하는 작업 공간 컨테이너를 생성하는 경우 Code Stream은 컨테이너에 환경 변수를 전달합니다.

예를 들어 Code Stream 인스턴스에 웹 프록시가 필요하고 Docker 호스트를 사용하여 사용자 지정 통합을 위한 컨테이너를 생성하는 경우 Code Stream은 파이프라인을 실행하고 이 컨테이너에 웹 프록시 설정 변수를 전달합니다.

표 2. 환경 변수 이름-값 쌍의 예
이름
HTTPS_PROXY http://10.0.0.255:1234
https_proxy http://10.0.0.255:1234
NO_PROXY 10.0.0.32, *.dept.vsphere.local
no_proxy 10.0.0.32, *.dept.vsphere.local
HTTP_PROXY http://10.0.0.254:1234
http_proxy http://10.0.0.254:1234
PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

이름-값 쌍은 사용자 인터페이스에 다음과 같이 나타납니다.

Code Stream은 빌더 이미지가 생성하는 컨테이너에 환경 변수를 전달합니다.

이 예는 Code Stream을 Slack 인스턴스에 연결하고 메시지를 Slack 채널에 게시하는 사용자 지정 통합을 생성합니다.

사전 요구 사항

  • 사용자 지정 스크립트를 작성하려면 Python 2, Python 3, Node.js와 같은 언어 중 하나 또는 Bash, sh 또는 zsh와 같은 셸 언어가 있는지 확인합니다.
  • 설치된 Node.js 또는 Python 런타임을 사용하여 컨테이너 이미지를 생성합니다.

프로시저

  1. 사용자 지정 통합을 생성합니다.
    1. 사용자 지정 통합 > 새로 만들기를 클릭하고 적절한 이름을 입력합니다.
    2. 기본 런타임 환경을 선택합니다.
    3. 생성을 클릭합니다.
      스크립트가 열리면서 코드가 표시됩니다. 여기에는 필요한 런타임 환경이 포함되어 있습니다. 예를 들어 runtime: "nodejs"가 표시됩니다. 스크립트에는 파이프라인이 실행될 때 파이프라인에 추가하는 사용자 지정 작업이 성공할 수 있도록 빌더 이미지가 사용하는 런타임이 포함되어야 합니다. 그렇지 않으면 사용자 지정 작업이 실패합니다.
    사용자 지정 통합 YAML의 주요 영역에는 런타임, 코드, 입력 속성 및 출력 속성이 포함되어 있습니다. 이 절차는 다양한 유형과 구문에 대해 설명합니다.
    사용자 지정 통합 YAML 키 설명
    runtime

    Code Stream이 코드를 실행하는 작업 런타임 환경. 다음과 같은 문자열(대/소문자 구분 안 함) 중 하나일 수 있습니다.

    • nodejs
    • python2
    • python3
    • shell

    아무 것도 제공하지 않으면 shell이 기본값으로 간주됩니다.

    code 사용자 지정 작업의 일부로 실행할 사용자 지정 비즈니스 논리입니다.
    inputProperties 사용자 지정 작업 구성의 일부로 캡처할 입력 속성 어레이입니다. 이러한 속성은 일반적으로 코드에서 사용됩니다.
    outputProperties 사용자 지정 작업에서 내보내 파이프라인에 전파할 수 있는 출력 속성 어레이입니다.
  2. 사용 가능한 데이터 유형과 메타 데이터를 사용하여 스크립트에서 입력 속성을 선언합니다.
    입력 속성은 스크립트에 대한 컨텍스트로 YAML의 code: 섹션에 전달됩니다.
    사용자 지정 작업 YAML 입력 키 설명 필수
    type 렌더링할 입력 유형:
    • text
    • textarea
    • number
    • checkbox
    • password
    • select
    name 사용자 지정 작업에 대한 입력의 이름 또는 문자열. 사용자 지정 통합 YAML 코드에 삽입됩니다. 사용자 지정 통합에 대해 정의된 각 입력 속성에 대해 고유해야 합니다.
    title 파이프라인 모델 캔버스에서 표시되는 사용자 지정 작업 입력 속성의 텍스트 문자열 레이블입니다. 비워 두면 name이 기본적으로 사용됩니다. 아니요
    required 사용자가 사용자 지정 작업을 구성할 때 입력 속성을 반드시 입력해야 하는지 여부를 결정합니다. true 또는 false로 설정합니다. true로 설정하면 사용자가 파이프라인 캔버스에서 사용자 지정 작업을 구성할 때 값을 제공하지 않을 경우 작업은 구성되지 않은 상태로 유지됩니다. 아니요
    placeHolder 값이 없는 경우 입력 속성의 입력 영역에 표시되는 기본 텍스트입니다. html placeholder 특성에 매핑됩니다. 특정 입력 속성 유형에 대해서만 지원됩니다. 아니요
    defaultValue 파이프라인 모델 페이지에서 사용자 지정 작업을 렌더링할 때 입력 속성의 입력 영역을 채우는 기본값입니다. 아니요
    bindable 파이프라인 캔버스에서 사용자 지정 작업을 모델링할 때 입력 속성이 달러 기호 변수를 수락하는지 여부를 결정합니다. 제목 옆에 $ 표시기를 추가합니다. 특정 입력 속성 유형에 대해서만 지원됩니다. 아니요
    labelMessage 사용자를 위한 도움말 도구 설명으로 작동하는 문자열입니다. 입력 제목 옆에 도구 설명 아이콘 i를 추가합니다. 아니요
    enum 입력 속성 선택 옵션을 표시하는 값의 어레이를 취합니다. 특정 입력 속성 유형에 대해서만 지원됩니다.

    사용자가 옵션을 선택하고 사용자 지정 작업에 대해 저장하면 inputProperty 값이 이 값에 해당하고 사용자 지정 작업 모델링에 표시됩니다.

    예를 들어 값이 2015입니다.

    • 2015
    • 2016
    • 2017
    • 2018
    • 2019
    • 2020
    아니요
    options optionKey optionValue을 사용하여 개체 어레이를 취합니다.
    • optionKey. 작업의 코드 섹션에 전파되는 값입니다.
    • optionValue. 사용자 인터페이스에 옵션을 표시하는 문자열입니다.

    특정 입력 속성 유형에 대해서만 지원됩니다.

    옵션:

    optionKey: key1. 사용자 지정 작업을 위해 선택하고 저장하면 이 inputProperty의 값이 코드 섹션의 key1에 해당합니다.

    optionValue: '1에 대한 레이블'. key1의 값이 사용자 인터페이스에 표시되고 사용자 인터페이스에 사용자 지정 작업의 다른 위치에는 표시되지 않습니다.

    optionKey: key2

    optionValue: '2에 대한 레이블'

    optionKey: key3

    optionValue: '3에 대한 레이블

    아니요
    minimum 이 입력 속성에 유효한 최소값으로 작동하는 숫자를 취합니다. 숫자 유형 입력 속성에 대해서만 지원됩니다. 아니요
    maximum 이 입력 속성에 유효한 최대값으로 작동하는 숫자를 취합니다. 숫자 유형 입력 속성에 대해서만 지원됩니다. 아니요
    표 3. 사용자 지정 스크립트에서 지원되는 데이터 유형 및 메타데이터
    지원되는 데이터 유형 입력으로 지원되는 메타데이터
    • String
    • Text
    • List: 임의 유형의 목록으로
    • Map: map[string]any로
    • Secure: 사용자 지정 작업을 저장할 때 암호화된 암호 텍스트 상자로 렌더링됨
    • Number
    • Boolean: 텍스트 상자로 나타남
    • URL: 문자열과 동일, 추가 검증 포함
    • 선택 항목, 라디오 버튼
    • type: String | Text 중 하나...
    • default: 기본값
    • options: 옵션 목록 또는 맵, 선택 항목 또는 라디오 버튼과 함께 사용됨
    • min: 최소값 또는 최소 크기
    • max: 최대값 또는 최대 크기
    • title: 텍스트 상자의 세부적인 이름
    • placeHolder: UI 자리 표시자
    • description: 툴팁이 됨
    예를 들면 다음과 같습니다.
    inputProperties:
            - name: message
              type: text
              title: Message
              placeHolder: Message for Slack Channel
              defaultValue: Hello Slack
              bindable: true
              labelInfo: true
              labelMessage: This message is posted to the Slack channel link provided in the code
    
  3. 스크립트에서 출력 속성을 선언합니다.
    스크립트는 출력에 대한 컨텍스트를 선언한 스크립트의 비즈니스 논리 code: 섹션에서 출력 속성을 캡처합니다.
    파이프라인이 실행될 때 작업 출력에 대한 응답 코드를 입력할 수 있습니다. 예를 들어 200을 입력할 수 있습니다.
    Code Stream이 각 outputProperty에 대해 지원하는 키.
    설명
    type 현재 label의 단일 값이 포함되어 있습니다.
    name 사용자 지정 통합 YAML의 코드 블록이 내보내는 키입니다.
    title outputProperty를 표시하는 사용자 인터페이스의 레이블입니다.
    예를 들면 다음과 같습니다.
    outputProperties:
      - name: statusCode
        type: label
        title: Status Code
  4. 사용자 지정 스크립트의 입력 및 출력과 상호 작용하기 위해 context를 사용하여 입력 속성을 가져오거나 출력 속성을 설정합니다.
    입력 속성의 경우: (context.getInput("key"))
    출력 속성의 경우: (context.setOutput("key", "value"))
    Node.js의 경우:
    var context = require("./context.js")
    var message = context.getInput("message");
    //Your Business logic
    context.setOutput("statusCode", 200);
    Python의 경우:
    from context import getInput, setOutput
    message = getInput('message')
    //Your Business logic
    setOutput('statusCode', '200')
    
    셸의 경우:
    # Input, Output properties are environment variables
    echo ${message} # Prints the input message
    //Your Business logic
    export statusCode=200 # Sets output property statusCode
    
  5. code: 섹션에서 사용자 지정 통합을 위한 모든 비즈니스 논리를 선언합니다.
    예를 들어 Node.js 런타임 환경에서 다음과 같이 합니다.
    code: |
        var https = require('https');
        var context = require("./context.js")
        
        //Get the entered message from task config page and assign it to message var
        var message = context.getInput("message");
        var slackPayload = JSON.stringify(
            {
                text: message
            });
    
        const options = {
            hostname: 'hooks.slack.com',
            port: 443,
            path: '/YOUR_SLACK_WEBHOOK_PATH',
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Content-Length': Buffer.byteLength(slackPayload)
            }
        };
        
        // Makes a https request and sets the output with statusCode which 
        // will be displayed in task result page after execution
        const req = https.request(options, (res) => {
            context.setOutput("statusCode", res.statusCode);
        });
    
        req.on('error', (e) => {
            console.error(e);
        });
        req.write(slackPayload);
        req.end();
    
  6. 사용자 지정 통합 스크립트에 버전을 적용하고 릴리스하기 전에 Python 또는 Node.js의 컨텍스트 파일을 다운로드하고 스크립트에 포함한 비즈니스 논리를 테스트합니다.
    1. 캔버스 맨 위에 포인터를 놓고 컨텍스트 파일 버튼을 클릭합니다. 예를 들어 Python 스크립트의 경우 CONTEXT.PY를 클릭합니다.
    2. 파일을 수정하고 저장합니다.
    3. 개발 시스템에서 컨텍스트 파일을 사용하여 사용자 지정 스크립트를 실행하고 테스트합니다.
  7. 사용자 지정 통합 스크립트에 버전을 적용합니다.
    1. 버전을 클릭합니다.
    2. 버전 정보를 입력합니다.
    3. 사용자 지정 작업에서 스크립트를 선택할 수 있도록 릴리스 버전을 클릭합니다.
    4. 버전을 생성하려면 생성을 클릭합니다.
      사용자 지정 통합 스크립트 버전을 지정하고 파이프라인의 사용자 지정 작업에서 버전을 선택합니다.
  8. (선택 사항) 사용자 지정 통합 스크립트의 릴리스된 버전을 최신으로 설정할 수 있습니다. 그러면 해당 버전이 파이프라인 캔버스에 최신 --> 레이블과 함께 표시됩니다.
    1. 캔버스 맨 위에 포인터를 놓고 버전 기록을 클릭합니다.
    2. 사용 가능한 작업을 보려면 원하는 버전의 가로 줄임표를 클릭하고 최신으로 설정을 선택합니다.
      참고: 릴리스된 버전만 최신으로 설정 작업에 나타납니다.
      사용자 지정 통합 스크립트의 버전을 지정하고 릴리스한 후 버전을 최신으로 설정할 수 있습니다. 그래야 사용자가 파이프라인에서 선택할 현재 버전을 알 수 있습니다.
    3. 버전 선택을 확인하려면 최신으로 설정을 클릭합니다.
    4. 버전 기록을 종료하고 스크립트 편집기 캔버스로 돌아가려면 뒤로 화살표를 클릭합니다.
  9. 스크립트를 저장하려면 저장을 클릭합니다.
    스크립트를 다른 Code Stream 인스턴스에서 사용할 YAML 파일로 내보내려면 사용자 지정 통합 카드에서 작업 > 내보내기를 클릭하고 내보낼 버전을 선택합니다.
  10. 파이프라인에서 업무 공간을 구성합니다.
    이 예에서는 Docker 업무 공간을 사용합니다.
    1. 업무 공간 탭을 클릭합니다.
    2. Docker 호스트 및 빌더 이미지 URL을 선택합니다.
      사용자 지정 통합을 생성할 때 호스트, 빌더 이미지 URL 및 이미지 레지스트리를 포함합니다.
  11. 파이프라인에 사용자 지정 작업을 추가하고 구성합니다.
    1. 모델 탭을 클릭합니다.
    2. 작업을 추가하고, 유형을 사용자 지정으로 선택하고, 적절한 이름을 입력합니다.
    3. 사용자 지정 통합 스크립트 및 버전을 선택합니다. 스크립트의 버전이 최신으로 설정되면 해당 버전은 버전 이름 앞에 최신 -->이 표시됩니다.
    4. Slack에 사용자 지정 메시지를 표시하려면 메시지 텍스트를 입력합니다.
      입력하는 텍스트는 사용자 지정 통합 스크립트의 defaultValue를 재정의합니다.
      사용자 지정 작업을 파이프라인에 추가할 때 사용자 지정 스크립트의 버전을 선택합니다.
  12. 파이프라인을 저장하고 사용하도록 설정합니다.
    1. 저장을 클릭합니다.
    2. 파이프라인 카드에서 작업 > 사용을 클릭합니다.
  13. 파이프라인을 실행합니다.
    1. 실행을 클릭합니다.
    2. 파이프라인 실행을 살펴봅니다.
    3. 출력에 예상한 상태 코드, 응답 코드, 상태 및 선언된 출력이 포함되어 있는지 확인합니다.
      출력 속성으로 statusCode를 정의했습니다. 예를 들어 statusCode 200은 Slack 게시가 성공했음을 나타낼 수 있으며 responseCode 0은 스크립트가 오류 없이 성공했음을 나타낼 수 있습니다.
    4. 실행 로그의 출력을 확인하려면 실행을 클릭하고, 파이프라인 링크를 클릭하고, 작업을 클릭한 다음, 로깅된 데이터를 살펴봅니다. 예를 들면 다음과 같습니다.
      파이프라인이 사용자 지정 작업을 실행한 후에는 파이프라인 실행에서 사용자 지정 통합에 대한 작업 출력을 볼 수 있습니다.
  14. 오류가 발생하면 문제를 해결한 후 파이프라인을 다시 실행합니다.
    예를 들어 기본 이미지에 파일 또는 모듈이 누락되어 있는 경우 누락된 파일이 포함된 다른 기본 이미지를 생성해야 합니다. 그런 다음 Docker 파일을 제공하고 파이프라인을 통해 이미지를 푸시합니다.

결과

축하합니다! Code Stream을 Slack 인스턴스에 연결하고 메시지를 Slack 채널에 게시하는 사용자 지정 통합 스크립트를 생성했습니다.

다음에 수행할 작업

소프트웨어 릴리스 수명 주기 자동화에서 Code Stream의 기능을 확장할 수 있도록 파이프라인에서 사용자 지정 작업 사용을 지원하는 사용자 지정 통합을 계속 생성합니다.