튜토리얼: CI/CD 단계 설정하기

이 튜토리얼은 파이프라인에서 단계를 만들고 사용하는 방법을 보여줍니다.

단계는 작업의 재사용 가능하고 결합 가능한 부분입니다. 각 단계는 다른 단계에서 사용할 수 있는 구조화된 입력과 출력을 정의합니다. 단계는 로컬 파일, GitLab.com 저장소 또는 다른 Git 소스에서 구성할 수 있습니다.

이 튜토리얼에서는 다음을 사용하여 GitLab CLI(glab)를 사용합니다.

  1. “hello world”를 출력하는 단계를 만듭니다.
  2. 파이프라인을 단계에 맞게 구성합니다.
  3. 작업에 여러 단계를 추가합니다.
  4. 모든 출력을 에코하는 원격 단계를 사용합니다.

시작하기 전에

  • GitLab CLI (glab)을 설치하고 로그인해야 합니다.
  • GitLab.com 및 GitLab 17.3 이상에서는 .gitlab-ci.yml 파일에 image: registry.gitlab.com/gitlab-org/step-runner:v0 러너 이미지를 포함해야 합니다.

단계 만들기

먼저 다음을 사용하여 단계를 만드세요.

  • exec 유형
  • 시스템의 executive API에 의해 시작되는 command
  1. 네임스페이스에서 zero-to-steps라는 GitLab 프로젝트를 만듭니다.

    glab project create zero-to-steps
    
  2. 프로젝트 저장소 루트로 이동합니다.

    cd zero-to-steps
    
  3. step.yml 파일을 만듭니다.

    touch step.yml
    
  4. 텍스트 편집기를 사용하여 step.yml에 명세를 추가합니다.

    spec:
      inputs:
        who:
          default: world
    
    • spec에는 who라는 하나의 입력이 있습니다.
    • 입력 who는 기본값이 있기 때문에 선택 사항입니다.
  5. step.yml에 구현을 추가하려면 spec 뒤에 두 번째 YAML 문서를 추가하고 exec 키를 사용합니다.

    spec:
      inputs:
        who:
          default: world
    ---
    exec:
      command:
        - bash
        - -c
        - "echo hello ${{ inputs.who }}"
    

삼중 엠 대시(---)는 파일을 두 개의 YAML 문서로 분리합니다.

  • 첫 번째 문서는 함수 시그니처와 유사한 명세입니다.
  • 두 번째 문서는 함수 본문과 유사한 구현입니다.

bash-c 인수는 Bash 셸을 시작하고 명령줄 인수에서 스크립트 입력을 가져옵니다. 쉘 스크립트 외에도 command를 사용하여 docker 또는 terraform와 같은 프로그램을 실행할 수 있습니다.

"echo hello ${{ input.name }}" 인수는 ${{}} 내부에 있는 표현식을 포함합니다. 표현식은 가능한 한 마지막 순간에 평가되며 현재 실행 컨텍스트에 액세스할 수 있습니다. 이 표현식은 inputs에 액세스하고 who의 값을 읽습니다.

  • 호출자가 who를 제공하는 경우 해당 값이 표현식에 대체됩니다.
  • who가 누락된 경우 대신 기본값으로 world가 표현식에 대체됩니다.

파이프라인에 단계 구성하기

  1. 저장소 루트에 .gitlab-ci.yml 파일을 만듭니다.

    touch .gitlab-ci.yml
    
  2. .gitlab-ci.yml에 다음 작업을 추가합니다.

     hello-world:
       variables:
         STEPS:
           expand: false
           value: |
             - name: hello_world
               step: .
       image: registry.gitlab.com/gitlab-org/step-runner:v0
       script:
         - /step-runner ci
    
    • 단계는 STEPS라는 환경 변수로 제공됩니다. STEPS는 단계 호출의 목록입니다.
      • 각 호출은 나중에 출력을 참조할 수 있도록 name이 지정됩니다.
      • 각 호출은 실행할 step을 지정합니다. 로컬 참조(.)는 저장소의 루트를 가리킵니다.
    • 작업 스크립트는 step-runner ci를 호출하며 이는 step-runner:v0 이미지에 있습니다.

    저장소에서 이 코드가 어떻게 보여야 하는지 예제를 보려면 이 예제를 참조하세요.

  3. 두 파일을 커밋하고 프로젝트 저장소를 푸시합니다. 이를 통해 작업이 실행되는 파이프라인이 트리거됩니다.

    git add .
    git commit -m 'Part 1 complete'
    git push --set-upstream origin master
    glab ci status
    
  4. “보기 로그”에서 작업을 선택하여 파이프라인이 완료될 때까지 확인합니다. 여기에 성공적인 작업의 예가 있습니다.

    $ /step-runner ci
    hello world
    trace written to step-results.json
    Cleaning up project directory and file based variables
    Job succeeded
    

참고: 환경 변수의 사용은 run 키워드가 구현되기 전까지 임시 해결책입니다. run 키워드 이픽을 참조하세요.

이제 첫 번째 단계를 만들고 사용했습니다!

작업에 여러 단계 추가하기

작업에는 하나 이상의 단계를 추가할 수 있습니다.

  1. .gitlab-ci.yml 파일에 작업에 hello_steps라는 다른 단계를 추가합니다.

    hello-world:
      variables:
        STEPS:
          expand: false
          value: |
            - name: hello_world
              step: .
            - name: hello_steps
              step: .
              inputs:
                who: gitlab steps
      image: registry.gitlab.com/gitlab-org/step-runner:v0
      script:
        - /step-runner ci
    

    hello_steps 단계는 gitlab steps의 비디폴트 입력 who를 제공합니다.

    저장소에서 이 코드가 어떻게 보여야 하는지 예제를 보려면 이 예제를 참조하세요.

  2. 변경 내용을 커밋하고 푸시합니다.

    git commit -a -m 'Added another step'
    git push
    glab ci status
    
  3. 터미널에서 “보기 로그”를 선택하고 파이프라인이 완료될 때까지 따릅니다. 다음은 성공적인 출력의 예입니다.

    $ /step-runner ci
    hello world
    hello gitlab steps
    trace written to step-results.json
    Cleaning up project directory and file based variables
    Job succeeded
    

단계 리팩터링

단계를 리팩터링하려면 .gitlab-ci.yml에서 해당 단계를 전용 파일로 이동합니다: CI 구성에서 단계를 전용 파일로 이동하여 단계를 리팩터링하십시오.

  1. 처음으로 생성한 단계를 hello라는 디렉터리로 이동하십시오:

    mkdir hello
    mv step.yml hello/
    
  2. 저장소의 루트에 새로운 단계를 만드십시오.

    touch step.yml
    
  3. step.yml에 다음 구성을 추가하십시오:

    spec: {}
    ---
    steps:
      - name: hello_world
        step: ./hello
      - name: hello_steps
        step: ./hello
        inputs:
          who: gitlab steps
    

    이 새로운 단계는 입력이 없으므로 spec이 비어 있습니다({}). 이는 .gitlab-ci.yml의 단계와 동일한 구문을 갖는 steps 유형입니다. 그러나 로컬 참조는 이제 hello 디렉터리의 단계를 가리킵니다.

  4. 새 단계를 사용하려면 .gitlab-ci.yml을 수정하십시오:

    hello-world:
      variables:
         STEPS:
           expand: false
           value: |
             - name: hello_everybody
               step: .
      image: registry.gitlab.com/gitlab-org/step-runner:v0
      script:
        - /step-runner ci
    

    이제 작업은 새로운 단계에만 입력 없이 호출됩니다. 작업의 세부 정보를 별도의 파일로 리팩터링했습니다.

    이 코드가 저장소에 나타날 모습의 예시는 여기를 참조하십시오.

  5. 변경 사항을 커밋하고 푸시하십시오:

    git add .
    git commit -m 'Refactored step config'
    git push
    glab ci status
    
  6. 터미널에서 로그 보기를 선택하십시오.
  7. 리팩터링된 단계가 처음에 생성한 단계와 동일한 기능을 수행하는지 검증하려면 로그 출력을 확인하십시오. 로그 출력은 이전에 생성한 단계의 출력과 일치해야 합니다. 다음은 예시입니다:

    $ /step-runner ci
    hello world
    hello gitlab steps
    추적이 step-results.json에 기록됨
    프로젝트 디렉터리 및 파일 기반 변수 정리 중
    작업이 성공함
    

단계에 출력 추가

hello 단계에 출력을 추가하십시오.

  1. hello/step.ymlspecoutputs 구조를 추가하십시오:

    spec:
      inputs:
        who:
          default: world
      outputs:
        greeting: {}
    ---
    exec:
      command:
        - bash
        - -c
        - "echo greeting=hello ${{ inputs.who }} | tee ${{ output_file }}"
    
    • spec에서 기본값이 없는 greeting 단일 출력을 정의했습니다. 기본값이 없기 때문에 출력 greeting이 필요합니다.
    • 출력은 ${{ output_file }} (런타임에서 제공됨) 파일에 key=value 형식으로 작성됩니다.
    • 이 단계는 echo greeting=hello ${{ inputs.who }}를 실행하고 출력을 로그와 출력 파일(tee ${{ output_file }})에 보냅니다.
  2. step.yml에 단계에 출력을 추가하십시오:

    spec:
      outputs:
        all_greetings: {}
    ---
    steps:
      - name: hello_world
        step: ./hello
      - name: hello_steps
        step: ./hello
        inputs:
          who: gitlab steps
    outputs:
      all_greetings: "${{ steps.hello_world.outputs.greeting }} and ${{ steps.hello_steps.outputs.greeting }}"
    

이제 all_greetings라는 출력을 이 단계에 추가했습니다.

이 출력은 ${{ steps.hello_world.outputs.greeting }}라는 새 표현 구문의 사용을 보여줍니다. 이 표현은 두 하위 단계인 hello_worldhello_stepsoutputs를 읽어 단일 문자열 출력으로 연결합니다.

원격 단계 사용

코드를 커밋하고 실행하기 전에 작업에 다른 단계를 추가하여 주요 step.yml의 최종 all_greetings 출력을 확인하십시오.

이 단계 호출은 echo-step이라는 원격 단계를 참조합니다. echo 단계는 단일 입력 echo를 가져와 로그에 출력하고 echo로 출력합니다.

  1. .gitlab-ci.yml을 수정하십시오:

    hello-world:
      variables:
        STEPS:
          expand: false
          value: |
            - name: hello_everybody
              step: .
            - name: all_my_greetings
              step: gitlab.com/gitlab-org/ci-cd/runner-tools/echo-step@master
              inputs:
                echo: "all my greetings say ${{ steps.hello_everybody.outputs.all_greetings }}"
      image: registry.gitlab.com/gitlab-org/step-runner:v0
      script:
        - /step-runner ci
    

    이 코드가 저장소에 나타날 모습의 예시는 여기를 참조하십시오.

  2. 변경 사항을 커밋하고 푸시하십시오:

    git commit -a -m 'Added outputs'
    git push
    glab ci status
    
  3. “로그 보기”에서 작업을 완료될 때까지 작업을 확인하십시오. 성공적인 출력 예시는 다음과 같습니다:

    $ /step-runner ci
    greeting=hello world
    greeting=hello gitlab steps
    echo=all my greetings say hello world and hello gitlab steps
    step-results.json에 추적이 작성됨
    프로젝트 디렉터리 및 파일 기반 변수 정리 중
    작업이 성공함
    

이것으로 모든 과정이 완료되었습니다! 이제 파이프라인에서 단계를 생성하고 구현했습니다. 단계 구문에 대한 자세한 정보는 CI/CD 단계를 참조하십시오.