CI/CD 구성요소 예시

컴포넌트 테스트

컴포넌트의 기능에 따라 컴포넌트를 테스트하는 것은 리포지터리에 추가 파일이 필요할 수 있습니다. 예를 들어, 특정 프로그래밍 언어로 소프트웨어를 린트하고 빌드하며 테스트하는 컴포넌트는 실제 소스 코드 샘플을 필요로 합니다. 동일한 리포지터리에 소스 코드 예시, 구성 파일 등이 들어갈 수 있습니다.

예를 들어, Code Quality CI/CD 컴포넌트는 테스트용 코드 샘플을 가지고 있습니다.

예시: Rust 언어 CI/CD 컴포넌트 테스트

컴포넌트의 기능에 따라 컴포넌트를 테스트하는 것은 리포지터리에 추가 파일이 필요할 수 있습니다.

다음은 Rust 프로그래밍 언어를 사용한 “Hello, world” 예시로써 단순화를 위해 cargo 도구 체인을 사용합니다:

  1. CI/CD 컴포넌트 루트 디렉터리로 이동합니다.
  2. cargo init 명령을 사용하여 새로운 Rust 프로젝트를 초기화합니다.

    cargo init
    

    해당 명령은 src/main.rs와 같은 필수 프로젝트 파일들을 생성합니다. 이 단계는 cargo build와 함께 컴포넌트 작업에서 Rust 소스 코드를 빌드하는 데 충분합니다.

    tree
    .
    ├── Cargo.toml
    ├── LICENSE.md
    ├── README.md
    ├── src
    │   └── main.rs
    └── templates
        └── build.yml
    
  3. 컴포넌트에 Rust 소스 코드를 빌드하는 작업이 있는지 확인합니다. 예를 들어, templates/build.yml에 다음과 같이 작성합니다:

    spec:
      inputs:
        stage:
          default: build
          description: '빌드 단계 정의'
        rust_version:
          default: latest
          description: 'Rust 버전 지정, https://hub.docker.com/_/rust/tags의  사용, 기본값은 latest'
    ---
       
    "build-$[[ inputs.rust_version ]]":
      stage: $[[ inputs.stage ]]
      image: rust:$[[ inputs.rust_version ]]
      script:
        - cargo build --verbose
    

    이 예시에서:

    • stagerust_version 입력 값을 기본 값에서 수정할 수 있습니다. CI/CD 작업은 rust_version 입력을 기반으로 동적으로 이름을 생성하는 build- 접두사로 시작합니다. cargo build --verbose 명령은 Rust 소스 코드를 컴파일합니다.
  4. 프로젝트의 .gitlab-ci.yml 구성 파일에 컴포넌트의 build 템플릿을 테스트합니다.

    include:
      # 현재 SHA에서 현재 프로젝트에 위치한 컴포넌트를 포함합니다
      - component: gitlab.com/$CI_PROJECT_PATH/build@$CI_COMMIT_SHA
        inputs:
          stage: build
       
    stages: [build, test, release]
    
  5. 테스트 실행 및 추가 기능 및 테스트를 위해 Rust 코드에 새로운 기능과 테스트를 추가하고, templates/test.yml에서 cargo test를 실행하는 컴포넌트 템플릿과 작업을 추가합니다.

    spec:
      inputs:
        stage:
          default: test
          description: '테스트 단계 정의'
        rust_version:
          default: latest
          description: 'Rust 버전 지정, https://hub.docker.com/_/rust/tags의  사용, 기본값은 latest'
    ---
       
    "test-$[[ inputs.rust_version ]]":
      stage: $[[ inputs.stage ]]
      image: rust:$[[ inputs.rust_version ]]
      script:
        - cargo test --verbose
    
  6. 파이프라인에서 추가 작업을 테스트하기 위해 test 컴포넌트 템플릿을 포함합니다.

    include:
      # 현재 SHA에서 현재 프로젝트에 위치한 컴포넌트를 포함합니다
      - component: gitlab.com/$CI_PROJECT_PATH/build@$CI_COMMIT_SHA
        inputs:
          stage: build
      - component: gitlab.com/$CI_PROJECT_PATH/test@$CI_COMMIT_SHA
        inputs:
          stage: test
       
    stages: [build, test, release]
    

CI/CD 컴포넌트 마이그레이션 예시

이 섹션에서는 CI/CD 템플릿 및 파이프라인 구성을 재사용 가능한 CI/CD 컴포넌트로 마이그레이션하는 실제 예시를 보여줍니다.

CI/CD 컴포넌트 마이그레이션 예시: Go

여러 작업과 단계를 가진 소프트웨어 개발 수명주기 전체를 포함하는 완전한 파이프라인을 구성할 수 있습니다. 프로그래밍 언어용 CI/CD 템플릿은 하나의 템플릿 파일에 여러 작업을 제공할 수 있습니다. 다음은 Go CI/CD 템플릿을 마이그레이션하는 예시입니다.

image: golang:latest

stages:
  - test
  - build
  - deploy

format:
  stage: test
  script:
    - go fmt $(go list ./... | grep -v /vendor/)
    - go vet $(go list ./... | grep -v /vendor/)
    - go test -race $(go list ./... | grep -v /vendor/)

compile:
  stage: build
  script:
    - mkdir -p mybinaries
    - go build -o mybinaries ./...
  artifacts:
    paths:
      - mybinaries
note
모든 작업을 마이그레이션하는 대신 첫 번째 반복에서는 build CI/CD 작업만 마이그레이션할 수도 있습니다. CI/CD 템플릿 마이그레이션은 다음 단계로 진행됩니다.
  1. CI/CD 작업 및 의존성을 분석하고 마이그레이션 조치를 정의합니다.
    • image 구성은 전역이며, 작업 정의로 이동해야 합니다.
    • format 작업은 여러 go 명령을 하나의 작업에서 실행합니다. go test 명령은 파이프라인 효율성을 높이기 위해 별도의 작업으로 이동해야 합니다.
    • compile 작업은 go build를 실행하며 build로 이름을 변경해야 합니다.
  2. 더 나은 파이프라인 효율성을 위한 최적화 전략을 정의합니다.
    • stage 작업 속성은 다양한 CI/CD 파이프라인 소비자를 허용할 수 있도록 구성 가능해야 합니다.
    • image 키는 하드코딩된 이미지 태그 latest를 사용합니다. 보다 유연하고 재사용 가능한 파이프라인을 위해 golang_version입력으로 추가하고 기본값을 latest로 설정해야 합니다. 입력은 Docker Hub 이미지 태그 값을 준수해야 합니다.
    • compile 작업은 하드 코딩된 대상 디렉터리 mybinaries에 바이너리를 빌드하는데, 동적 입력과 기본값 mybinaries로 개선할 수 있습니다.
  3. 새로운 컴포넌트를 위한 디렉터리 구조를 생성합니다.
    • 템플릿의 이름은 예를 들어 format.yml, build.yml, test.yml과 같이 go 명령을 따라야 합니다.
    • 새 프로젝트를 생성하고 Git 리포지터리를 초기화하고 모든 변경 사항을 추가 및 커밋한 후 원격 리포지터리를 설정하고 푸시합니다. URL은 본인의 CI/CD 컴포넌트 프로젝트 경로에 맞게 수정합니다.
    • 좋은 예로 부터 추가 파일을 생성합니다: README.md, LICENSE.md, .gitlab-ci.yml, .gitignore. 다음 쉘 명령어는 Go 컴포넌트 구조를 초기화합니다:
    git init
       
    mkdir templates
    touch templates/{format,build,test}.yml
       
    touch README.md LICENSE.md .gitlab-ci.yml .gitignore
       
    git add -A
    git commit -avm "Initial component structure"
       
    git remote add origin https://gitlab.example.com/components/golang.git
       
    git push
    
  4. 템플릿의 CI/CD 작업을 생성합니다. 먼저 build 작업부터 시작합니다.
    • spec 섹션에서 다음과 같은 입력을 정의합니다: stage, golang_version, binary_directory.
    • inputs.golang_version에 접근하여 동적 작업 이름 정의를 추가합니다.
    • 유사한 패턴을 사용하여 동적 Go 이미지 버전을 위해 inputs.golang_version에 접근합니다.
    • 스테이지를 inputs.stage 값에 할당합니다.
    • inputs.binary_directory에서 바이너리 디렉터리를 생성하고 go build에 매개변수로 추가합니다.
    • 아티팩트 경로를 inputs.binary_directory로 정의합니다.

      spec:
        inputs:
          stage:
            default: 'build'
            description: '빌드 단계 정의'
          golang_version:
            default: 'latest'
            description: 'Go 이미지 버전 태그'
          binary_directory:
            default: 'mybinaries'
            description: '생성된 이진 아티팩트를 위한 출력 디렉터리'
      ---
           
      "build-$[[ inputs.golang_version ]]":
        image: golang:$[[ inputs.golang_version ]]
        stage: $[[ inputs.stage ]]
        script:
          - mkdir -p $[[ inputs.binary_directory ]]
          - go build -o $[[ inputs.binary_directory ]] ./...
        artifacts:
          paths:
            - $[[ inputs.binary_directory ]]
      
    • format 작업 템플릿은 동일한 패턴을 따르지만 stage, golang_version 입력만 필요합니다.

      spec:
        inputs:
          stage:
            default: 'format'
            description: '포맷 단계 정의'
          golang_version:
            default: 'latest'
            description: 'Golang 이미지 버전 태그'
      ---
           
      "format-$[[ inputs.golang_version ]]":
        image: golang:$[[ inputs.golang_version ]]
        stage: $[[ inputs.stage ]]
        script:
          - go fmt $(go list ./... | grep -v /vendor/)
          - go vet $(go list ./... | grep -v /vendor/)
      
    • test 작업 템플릿도 동일한 패턴을 따라가지만 stage, golang_version 입력만 필요합니다.

      spec:
        inputs:
          stage:
            default: 'test'
            description: '테스트 단계 정의'
          golang_version:
            default: 'latest'
            description: 'Golang 이미지 버전 태그'
      ---
           
      "test-$[[ inputs.golang_version ]]":
        image: golang:$[[ inputs.golang_version ]]
        stage: $[[ inputs.stage ]]
        script:
          - go test -race $(go list ./... | grep -v /vendor/)
      
  5. 컴포넌트를 테스트하기 위해 .gitlab-ci.yml 구성 파일을 수정하고 테스트를 추가합니다.

    • golang_version 입력을 build 작업에 대한 다른 값으로 지정합니다.
    • 본인의 CI/CD 컴포넌트 경로를 수정합니다.

      stages: [format, build, test]
           
      include:
        - component: example.gitlab.com/$CI_PROJECT_PATH/format@$CI_COMMIT_SHA
        - component: example.gitlab.com/$CI_PROJECT_PATH/build@$CI_COMMIT_SHA
        - component: example.gitlab.com/$CI_PROJECT_PATH/build@$CI_COMMIT_SHA
          inputs:
            golang_version: "1.21"
        - component: example.gitlab.com/$CI_PROJECT_PATH/test@$CI_COMMIT_SHA
          inputs:
            golang_version: latest
      
  6. CI/CD 컴포넌트 테스트를 위해 Go 소스 코드를 추가합니다. go 명령은 루트 디렉터리에 go.modmain.go를 예상합니다.

    • Go 모듈을 초기화합니다. 본인의 CI/CD 컴포넌트 경로를 수정합니다.

      go mod init example.gitlab.com/components/golang
      
    • main.go 파일을 생성하고, main 함수에서 예를 들어 Hello, CI/CD 컴포넌트를 출력하는 내용을 추가합니다. 팁: GitLab Duo Code Suggestions를 사용하여 Go 코드를 생성할 때 코드 주석을 사용하세요.

      // 패키지 지정, 필요한 패키지 가져오기
      // main 함수 생성
      // main 함수 내에서 "Hello, CI/CD Component" 출력
           
      package main
           
      import "fmt"
           
      func main() {
        fmt.Println("Hello, CI/CD Component")
      }
      
    • 다음과 같은 디렉터리 구조를 가지게 될 것입니다:

      tree
      .
      ├── LICENSE.md
      ├── README.md
      ├── go.mod
      ├── main.go
      └── templates
          ├── build.yml
          ├── format.yml
          └── test.yml
      

나머지 단계는 CI/CD 템플릿을 컴포넌트로 변환하는 섹션을 따라가며 마이그레이션을 완료하세요:

  1. 변경 사항을 커밋하고 푸시하고 CI/CD 파이프라인 결과를 확인합니다.
  2. 문서화 최상의 예시를 따라 README.mdLICENSE.md 파일을 업데이트합니다.
  3. 컴포넌트를 배포하고 CI/CD 카탈로그에서 확인합니다.
  4. CI/CD 컴포넌트를 스테이징/프로덕션 환경에 추가합니다.

GitLab에서 유지보수하는 Go 컴포넌트는 Go CI/CD 템플릿을 성공적으로 마이그레이션한 예시를 제공하며 입력과 컴포넌트 최상의 예시로 개선되었습니다. 자세한 내용은 Git 리포지터리 히스토리를