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 작업은rust_version입력을 기반으로 동적으로 이름을 생성하여build-접두사로 시작합니다.cargo build --verbose명령은 Rust 소스 코드를 컴파일합니다.
-
-
프로젝트의
.gitlab-ci.yml구성 파일에서 구성 요소의build템플릿을 테스트합니다.include: # 현재 SHA 및 프로젝트 내에 있는 구성 요소를 포함합니다. - component: $CI_SERVER_FQDN/$CI_PROJECT_PATH/build@$CI_COMMIT_SHA inputs: stage: build stages: [build, test, release] -
추가 테스트 및 기타 작업에 대한 테스트를 실행하려면 Rust 코드에 추가 함수와 테스트를 추가하고
test.yml에서cargo test를 실행하는 구성 요소 템플릿 및 작업을 추가합니다.spec: inputs: stage: default: test description: '테스트 단계를 정의합니다.' rust_version: default: latest description: 'Rust 버전을 지정합니다. https://hub.docker.com/_/rust/tags의 값을 사용합니다. 기본값은 최신 버전입니다.' --- "test-$[[ inputs.rust_version ]]": stage: $[[ inputs.stage ]] image: rust:$[[ inputs.rust_version ]] script: - cargo test --verbose -
파이프라인의 추가 작업을 테스트하기 위해
test구성 요소 템플릿을 포함합니다.include: # 현재 SHA 및 프로젝트 내에 있는 구성 요소를 포함합니다. - component: $CI_SERVER_FQDN/$CI_PROJECT_PATH/build@$CI_COMMIT_SHA inputs: stage: build - component: $CI_SERVER_FQDN/$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
참고:
모든 작업이 아닌 한 작업부터 시작할 수도 있습니다. 첫 번째 반복에서는 build CI/CD 작업만 마이그레이션합니다.
CI/CD 템플릿 마이그레이션에는 다음 단계가 포함됩니다:
- CI/CD 작업 및 종속성을 분석하고 마이그레이션 작업을 정의합니다.
-
image구성은 전역이며, 작업 정의로 이동해야 합니다. -
format작업은 단일 작업에서 여러go명령을 실행합니다.go test명령은 파이프라인 효율성을 높이기 위해 별도의 작업으로 이동해야 합니다. -
compile작업은go build를 실행하며build로 이름을 변경해야 합니다.
-
- 파이프라인 효율성을 높이기 위한 최적화 전략을 정의합니다.
-
stage작업 속성은 다른 CI/CD 파이프라인 사용자에게 유연성을 제공하기 위해 구성할 수 있어야 합니다. -
image키는 하드코딩된 이미지 태그latest를 사용합니다. 더 유연하고 재사용 가능한 파이프라인을 위해latest를 기본값으로 하는golang_version입력을 추가합니다. 입력은 Docker Hub 이미지 태그 값과 일치해야 합니다. -
compile작업은 하드코딩된 대상 디렉토리mybinaries를 구축합니다. 이러한 디렉토리를 동적 입력과 기본값인mybinaries로 강화할 수 있습니다.
-
- 새 구성 요소에 대한 디렉토리 구조를 정의합니다.
- 템플릿마다 하나의 템플릿을 따라야 합니다. 예를 들어
format.yml,build.yml,test.yml등입니다. - 새 프로젝트를 만들고 Git 저장소를 초기화하고 모든 변경 사항을 추가/커밋한 후 원격 원본을 설정하고 푸시합니다. CI/CD 구성 요소 프로젝트 경로를 수정합니다.
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 - 템플릿마다 하나의 템플릿을 따라야 합니다. 예를 들어
- 템플릿으로 CI/CD 작업을 만듭니다. 첫 번째로
build작업을 시작합니다.-
spec섹션에서 다음 입력을 정의합니다:stage,golang_version,binary_directory. -
inputs.golang_version에 액세스하는 동적 작업 이름을 정의합니다. -
inputs.golang_version에 액세스하는 동적 Go 이미지 버전을 위한 유사한 패턴을 사용합니다. -
stage를inputs.stage값으로 할당합니다. -
inputs.binary_directory에서 바이너리 디렉토리를 만들고go build에 해당하는 매개변수를 추가합니다. -
artifacts경로를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/)
-
- 구성 요소를 테스트하려면
.gitlab-ci.yml구성 파일을 수정하고 테스트를 추가합니다.-
golang_version에 대한build작업의 입력으로 다른 값으로 지정합니다. -
CI/CD 구성 요소 경로를 수정합니다.
stages: [format, build, test] include: - component: $CI_SERVER_FQDN/$CI_PROJECT_PATH/format@$CI_COMMIT_SHA - component: $CI_SERVER_FQDN/$CI_PROJECT_PATH/build@$CI_COMMIT_SHA - component: $CI_SERVER_FQDN/$CI_PROJECT_PATH/build@$CI_COMMIT_SHA inputs: golang_version: "1.21" - component: $CI_SERVER_FQDN/$CI_PROJECT_PATH/test@$CI_COMMIT_SHA inputs: golang_version: latest
-
- CI/CD 구성 요소에 Go 소스 코드를 추가합니다.
go명령은 루트 디렉토리에go.mod와main.go를 예상합니다.-
Go 모듈을 초기화합니다. CI/CD 구성 요소 경로를 수정합니다.
go mod init example.gitlab.com/components/golang -
main.go파일에main함수를 사용하여 “Hello, CI/CD Component”를 출력하는 예제를 만듭니다. 팁: 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 템플릿을 구성 요소로 변환하는 섹션에서 완료하세요:
- 변경 사항을 커밋하고 푸시하고 CI/CD 파이프라인 결과를 확인하세요.
-
구성 요소 작성 지침을 따라
README.md및LICENSE.md파일을 업데이트하세요. - 구성 요소 발행 및 CI/CD 카탈로그에서 확인하세요.
- CI/CD 구성 요소를 스테이징/프로덕션 환경에 추가하세요.
GitLab이 유지 관리하는 Go 구성 요소는 Go CI/CD 템플릿에서 성공적으로 마이그레이션한 예시를 제공합니다. 입력 및 구성 요소 모베스트 프랙티스가 개선되었습니다. 더 많은 정보를 얻으려면 Git 이력을 확인하세요.
도움말