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

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

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

파이프라인에서 사용자 지정 작업의 스크립트 버전을 실행합니다. 생성한 스크립트는 Code Stream 인스턴스에 상주합니다.

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

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

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

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

사용자 지정 작업:

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

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

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

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

파이프라인이 실행되면 사용자 지정 작업이 지정된 스크립트를 호출하고 스크립트 내의 비즈니스 논리를 실행합니다. 그러면 구축, 테스트 및 배포 도구가 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 렌더링할 입력 유형:
    • 텍스트
    • 텍스트 영역
    • 숫자
    • 확인란
    • 암호
    • 선택
    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 이 입력 속성에 유효한 최대값으로 작동하는 숫자를 취합니다. 숫자 유형 입력 속성에 대해서만 지원됩니다. 아니요
    표 2. 사용자 지정 스크립트에서 지원되는 데이터 유형 및 메타데이터
    지원되는 데이터 유형 입력으로 지원되는 메타데이터
    • 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. 스크립트를 저장하려면 저장을 클릭합니다.
  9. 파이프라인에서 업무 공간을 구성합니다.
    1. 업무 공간 탭을 클릭합니다.
    2. Docker 호스트 및 빌더 이미지 URL을 선택합니다.
      사용자 지정 통합 생성.
  10. 파이프라인에 사용자 지정 작업을 추가하고 구성합니다.
    1. 모델 탭을 클릭합니다.
    2. 작업을 추가하고, 유형을 사용자 지정으로 선택하고, 적절한 이름을 입력합니다.
    3. 사용자 지정 통합 스크립트 및 버전을 선택합니다.
    4. Slack에 사용자 지정 메시지를 표시하려면 메시지 텍스트를 입력합니다.
      입력하는 텍스트는 사용자 지정 통합 스크립트의 defaultValue를 재정의합니다. 예를 들면 다음과 같습니다.
      파이프라인에서 사용자 지정 작업 추가 및 구성.
  11. 파이프라인을 저장하고 사용하도록 설정합니다.
    1. 저장을 클릭합니다.
    2. [파이프라인] 탭에서 파이프라인 사용을 클릭하여 원을 오른쪽으로 이동합니다.
  12. 파이프라인을 실행합니다.
    1. 실행을 클릭합니다.
    2. 파이프라인 실행을 살펴봅니다.
    3. 출력에 예상한 상태 코드, 응답 코드, 상태 및 선언된 출력이 포함되어 있는지 확인합니다.
      출력 속성으로 statusCode를 정의했습니다. 예를 들어 statusCode 200은 Slack 게시가 성공했음을 나타낼 수 있으며 responseCode 0은 스크립트가 오류 없이 성공했음을 나타낼 수 있습니다.
    4. 실행 로그의 출력을 확인하려면 실행을 클릭하고, 파이프라인 링크를 클릭하고, 작업을 클릭한 다음, 로깅된 데이터를 살펴봅니다. 예를 들면 다음과 같습니다.
      사용자 지정 통합의 작업 출력 보기.
  13. 오류가 발생하면 문제를 해결한 후 파이프라인을 다시 실행합니다.
    예를 들어 기본 이미지에 파일 또는 모듈이 누락되어 있는 경우 누락된 파일이 포함된 다른 기본 이미지를 생성해야 합니다. 그런 다음 Docker 파일을 제공하고 파이프라인을 통해 이미지를 푸시합니다.

결과

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

다음에 수행할 작업

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