튜토리얼: CI/CD 단계 설정하기
이 튜토리얼은 파이프라인에서 단계를 만들고 사용하는 방법을 보여줍니다.
단계는 작업의 재사용 가능하고 결합 가능한 부분입니다. 각 단계는 다른 단계에서 사용할 수 있는 구조화된 입력과 출력을 정의합니다. 단계는 로컬 파일, GitLab.com 저장소 또는 다른 Git 소스에서 구성할 수 있습니다.
이 튜토리얼에서는 다음을 사용하여 GitLab CLI(glab)를 사용합니다.
- “hello world”를 출력하는 단계를 만듭니다.
- 파이프라인을 단계에 맞게 구성합니다.
- 작업에 여러 단계를 추가합니다.
- 모든 출력을 에코하는 원격 단계를 사용합니다.
시작하기 전에
- GitLab CLI (glab)을 설치하고 로그인해야 합니다.
- GitLab.com 및 GitLab 17.3 이상에서는
.gitlab-ci.yml
파일에image: registry.gitlab.com/gitlab-org/step-runner:v0
러너 이미지를 포함해야 합니다.
단계 만들기
먼저 다음을 사용하여 단계를 만드세요.
-
exec
유형 - 시스템의 executive API에 의해 시작되는
command
-
네임스페이스에서
zero-to-steps
라는 GitLab 프로젝트를 만듭니다.glab project create zero-to-steps
-
프로젝트 저장소 루트로 이동합니다.
cd zero-to-steps
-
step.yml
파일을 만듭니다.touch step.yml
-
텍스트 편집기를 사용하여
step.yml
에 명세를 추가합니다.spec: inputs: who: default: world
-
spec
에는who
라는 하나의 입력이 있습니다. - 입력
who
는 기본값이 있기 때문에 선택 사항입니다.
-
-
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
가 표현식에 대체됩니다.
파이프라인에 단계 구성하기
-
저장소 루트에
.gitlab-ci.yml
파일을 만듭니다.touch .gitlab-ci.yml
-
.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
이미지에 있습니다.
저장소에서 이 코드가 어떻게 보여야 하는지 예제를 보려면 이 예제를 참조하세요.
- 단계는
-
두 파일을 커밋하고 프로젝트 저장소를 푸시합니다. 이를 통해 작업이 실행되는 파이프라인이 트리거됩니다.
git add . git commit -m 'Part 1 complete' git push --set-upstream origin master glab ci status
-
“보기 로그”에서 작업을 선택하여 파이프라인이 완료될 때까지 확인합니다. 여기에 성공적인 작업의 예가 있습니다.
$ /step-runner ci hello world trace written to step-results.json Cleaning up project directory and file based variables Job succeeded
참고:
환경 변수의 사용은 run
키워드가 구현되기 전까지 임시 해결책입니다.
run 키워드 이픽을 참조하세요.
이제 첫 번째 단계를 만들고 사용했습니다!
작업에 여러 단계 추가하기
작업에는 하나 이상의 단계를 추가할 수 있습니다.
-
.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
를 제공합니다.저장소에서 이 코드가 어떻게 보여야 하는지 예제를 보려면 이 예제를 참조하세요.
-
변경 내용을 커밋하고 푸시합니다.
git commit -a -m 'Added another step' git push glab ci status
-
터미널에서 “보기 로그”를 선택하고 파이프라인이 완료될 때까지 따릅니다. 다음은 성공적인 출력의 예입니다.
$ /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 구성에서 단계를 전용 파일로 이동하여 단계를 리팩터링하십시오.
-
처음으로 생성한 단계를
hello
라는 디렉터리로 이동하십시오:mkdir hello mv step.yml hello/
-
저장소의 루트에 새로운 단계를 만드십시오.
touch step.yml
-
새
step.yml
에 다음 구성을 추가하십시오:spec: {} --- steps: - name: hello_world step: ./hello - name: hello_steps step: ./hello inputs: who: gitlab steps
이 새로운 단계는 입력이 없으므로
spec
이 비어 있습니다({}
). 이는.gitlab-ci.yml
의 단계와 동일한 구문을 갖는steps
유형입니다. 그러나 로컬 참조는 이제hello
디렉터리의 단계를 가리킵니다. -
새 단계를 사용하려면
.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
이제 작업은 새로운 단계에만 입력 없이 호출됩니다. 작업의 세부 정보를 별도의 파일로 리팩터링했습니다.
이 코드가 저장소에 나타날 모습의 예시는 여기를 참조하십시오.
-
변경 사항을 커밋하고 푸시하십시오:
git add . git commit -m 'Refactored step config' git push glab ci status
- 터미널에서 로그 보기를 선택하십시오.
-
리팩터링된 단계가 처음에 생성한 단계와 동일한 기능을 수행하는지 검증하려면 로그 출력을 확인하십시오. 로그 출력은 이전에 생성한 단계의 출력과 일치해야 합니다. 다음은 예시입니다:
$ /step-runner ci hello world hello gitlab steps 추적이 step-results.json에 기록됨 프로젝트 디렉터리 및 파일 기반 변수 정리 중 작업이 성공함
단계에 출력 추가
hello
단계에 출력을 추가하십시오.
-
hello/step.yml
에spec
에outputs
구조를 추가하십시오: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 }}
)에 보냅니다.
- 이
-
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_world
와 hello_steps
의 outputs
를 읽어 단일 문자열 출력으로 연결합니다.
원격 단계 사용
코드를 커밋하고 실행하기 전에 작업에 다른 단계를 추가하여 주요 step.yml
의 최종 all_greetings
출력을 확인하십시오.
이 단계 호출은 echo-step
이라는 원격 단계를 참조합니다.
echo 단계는 단일 입력 echo
를 가져와 로그에 출력하고 echo
로 출력합니다.
-
.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
이 코드가 저장소에 나타날 모습의 예시는 여기를 참조하십시오.
-
변경 사항을 커밋하고 푸시하십시오:
git commit -a -m 'Added outputs' git push glab ci status
-
“로그 보기”에서 작업을 완료될 때까지 작업을 확인하십시오. 성공적인 출력 예시는 다음과 같습니다:
$ /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 단계를 참조하십시오.