CI/CD 컴포넌트 예시
컴포넌트 테스트
컴포넌트의 기능에 따라 컴포넌트 테스트에는 리포지터리에 추가적인 파일이 필요할 수 있습니다. 예를 들어, 특정 프로그래밍 언어로 소프트웨어를 린트, 빌드 및 테스트하는 컴포넌트는 실제 소스 코드 샘플을 필요로 합니다. 동일한 리포지터리에 소스 코드 예시, 구성 파일 등이 함께 들어 있을 수 있습니다.
예를 들어, 코드 품질 CI/CD 컴포넌트에는 테스트용 코드 샘플이 있습니다.
예시: Rust 언어 CI/CD 컴포넌트 테스트
컴포넌트의 기능에 따라 컴포넌트 테스트에는 리포지터리에 추가적인 파일이 필요할 수 있습니다.
Rust 프로그래밍 언어의 “Hello, World” 예시는 간단하게 cargo
도구 체인을 사용합니다.
- CI/CD 컴포넌트 루트 디렉터리로 이동합니다.
-
cargo init
명령어를 사용하여 새로운 Rust 프로젝트를 초기화합니다.cargo init
이 명령은
src/main.rs
와 같은 필요한 프로젝트 파일을 모두 생성합니다. 이 단계는cargo build
로 Rust 소스 코드를 빌드하는 구성 작업에 충분합니다.tree . ├── Cargo.toml ├── LICENSE.md ├── README.md ├── src │ └── main.rs └── templates └── build.yml
-
컴포넌트가 Rust 소스 코드를 빌드하는 작업이 있는지 확인합니다. 예를 들어,
templates/build.yml
에:spec: inputs: stage: default: build description: '빌드 스테이지 정의' rust_version: default: latest description: 'Rust 버전 지정, https://hub.docker.com/_/rust/tags의 값 사용, 기본값은 최신' --- "build-$[[ inputs.rust_version ]]": stage: $[[ inputs.stage ]] image: rust:$[[ inputs.rust_version ]] script: - cargo build --verbose
이 예시에서:
-
stage
와rust_version
입력값은 기본값에서 수정할 수 있습니다. CI/CD 작업은build-
접두사로 시작하며,rust_version
입력값에 기반하여 동적으로 이름을 생성합니다. 명령어cargo build --verbose
는 Rust 소스 코드를 컴파일합니다.
-
-
프로젝트의
.gitlab-ci.yml
구성 파일에서 컴포넌트의build
템플릿을 테스트합니다.include: # 현재 SHA에서 현재 프로젝트에 있는 컴포넌트를 포함합니다. - component: gitlab.com/$CI_PROJECT_PATH/build@$CI_COMMIT_SHA inputs: stage: build 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
build
CI/CD 작업만 이전합니다.CI/CD 템플릿 이전은 다음 단계를 포함합니다:
- CI/CD 작업 및 의존성을 분석하고 이전 조치를 정의합니다:
-
image
구성은 전역적으로 사용되고 있으며, 작업 정의로 이동해야 합니다. -
format
작업은 여러go
명령어를 한 작업에서 실행합니다.go test
명령어는 파이프라인 효율성을 높이기 위해 별도의 작업으로 이동해야 합니다. -
compile
작업은go build
를 실행하며,build
로 이름을 변경해야 합니다.
-
- 더 나은 파이프라인 효율성을 위한 최적화 전략을 정의합니다.
-
stage
작업 속성은 다양한 CI/CD 파이프라인 사용자를 허용하도록 설정 가능해야 합니다. -
image
키는 하드코딩된 이미지 태그latest
를 사용합니다. 유연하고 재사용 가능한 파이프라인을 위해golang_version
입력을 추가하고 기본값을latest
로 설정해야 합니다. 입력은 Docker Hub 이미지 태그 값과 일치해야 합니다. -
compile
작업은 하드코딩된 대상 디렉터리mybinaries
에 바이너리를 빌드합니다. 이는 동적 입력과 기본값mybinaries
로 개선됩니다.
-
-
디렉터리 구조에 기반한 새 컴포넌트를 위한 템플릿을 만듭니다.
- 템플릿의 이름은
go
명령어를 따라야 합니다. 예를 들어,format.yml
,build.yml
,test.yml
과 같이 작성합니다. - 새 프로젝트를 만들고 Git 리포지터리를 초기화하고, 모든 변경 사항을 추가/커밋한 뒤 리모트 원본을 설정하고 푸시합니다. 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
- 템플릿의 이름은
- 템플릿 작업을 생성합니다.
build
작업부터 시작합니다.-
spec
섹션에서 다음 입력을 정의합니다:stage
,golang_version
,binary_directory
. -
inputs.golang_version
에 액세스하는 동적 작업 이름 정의합니다. - 동적 Go 이미지 버전을
inputs.golang_version
에 액세스하는 유사한 패턴을 사용합니다. - 작업을
inputs.stage
값에 할당합니다. -
inputs.binary_directory
에서 바이너리 디렉터리를 만들고go build
에 매개변수로 추가합니다. -
Artifact 경로를
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: 'Go 이미지 버전 태그' --- "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: 'Go 이미지 버전 태그' --- "test-$[[ inputs.golang_version ]]": image: golang:$[[ inputs.golang_version ]] stage: $[[ inputs.stage ]] script: - go test -race $(go list ./... | grep -v /vendor/)
-
- 컴포넌트를 테스트하려면
.gitlab-ci.yml
구성 파일을 수정하여 테스트를 추가합니다.-
build
작업에 대한golang_version
입력에 다른 값을 지정합니다. -
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
-
- CI/CD 컴포넌트를 테스트하기 위해 Go 소스 코드를 추가합니다.
go
명령어에서는 루트 디렉터리에go.mod
와main.go
를 가진 Go 프로젝트가 필요합니다.-
Go 모듈을 초기화합니다. CI/CD 컴포넌트 경로를 수정합니다.
go mod init example.gitlab.com/components/golang
-
main.go
파일을 만들고, 예를 들어,Hello, CI/CD 컴포넌트
를 출력하는main
함수를 작성합니다. 팁: GitLab Duo Code Suggestions을 사용하여 Go 코드를 생성하는 데 코드 주석을 사용합니다.// 패키지 지정, 필요한 패키지 가져오기 // main 함수 생성 // main 함수 내에서 "Hello, CI/CD 컴포넌트" 출력 package main import "fmt" func main() { fmt.Println("Hello, CI/CD 컴포넌트") }
-
디렉터리 트리는 다음과 같아야 합니다:
tree . ├── LICENSE.md ├── README.md ├── go.mod ├── main.go └── templates ├── build.yml ├── format.yml └── test.yml
-
이후의 단계는 CI/CD 템플릿을 컴포넌트로 변환하는 섹션을 따라 마저 완성하세요.
- 변경 사항을 커밋하고 푸시한 후, CI/CD 파이프라인 결과를 확인합니다.
-
문서 최상의 실천 방법을 따라
README.md
및LICENSE.md
파일을 업데이트합니다. - 컴포넌트를 릴리스하고 CI/CD 카탈로그에서 확인합니다.
- CI/CD 컴포넌트를 스테이징/프로덕션 환경에 추가하세요.
GitLab에서 유지하는 Go 컴포넌트는 Go CI/CD 템플릿에서 성공적으로 이전한 예시로, 입력 및 컴포넌트 최상의 실천 방법이 포함되어 있습니다. 자세한 내용은 Git 히스토리를 확인하여 알아보세요.