Jenkins에서의 이주
Jenkins에서 GitLab CI/CD로 이주할 경우, Jenkins 워크플로우를 복제하고 향상시키는 CI/CD 파이프라인을 생성할 수 있습니다.
주요 유사성 및 차이점
GitLab CI/CD와 Jenkins는 몇 가지 유사성을 갖는 CI/CD 도구입니다. GitLab과 Jenkins는 둘 다:
- 작업의 컬렉션을 위한 단계를 사용합니다.
- 컨테이너 기반 빌드를 지원합니다.
또한 두 도구 간에 중요한 차이점이 있습니다:
- GitLab CI/CD 파이프라인은 모두 YAML 형식의 구성 파일로 구성됩니다. Jenkins는 그루비 형식의 구성 파일(선언적 파이프라인)이나 Jenkins DSL(스크립트 파이프라인)을 사용합니다.
- GitLab은 SaaS(클라우드) 또는 셀프 매니지드 배포 모두에서 실행할 수 있습니다. 반면 Jenkins 배포는 반드시 셀프 매니지드여야 합니다.
- GitLab은 소스 코드 관리(SCM)를 기본으로 제공합니다. Jenkins는 코드를 저장하기 위한 별도의 SCM 솔루션이 필요합니다.
- GitLab은 내장형 컨테이너 레지스트리를 제공합니다. Jenkins는 컨테이너 이미지를 저장하기 위한 별도의 솔루션이 필요합니다.
- GitLab은 코드 스캔을 위한 내장형 템플릿을 제공합니다. Jenkins는 코드 스캔을 위해 3rd 파티 플러그인이 필요합니다.
기능 및 개념의 비교
많은 Jenkins 기능과 개념은 동일한 기능을 제공하는 GitLab에서 동등한 항목이 있습니다.
구성 파일
Jenkins는 그루비 형식의 Jenkinsfile
로 구성될 수 있습니다. GitLab CI/CD는 기본적으로 .gitlab-ci.yml
파일을 사용합니다.
Jenkinsfile
의 예시:
pipeline {
agent any
stages {
stage('hello') {
steps {
echo "Hello World"
}
}
}
}
동등한 GitLab CI/CD .gitlab-ci.yml
파일은:
stages:
- hello
hello-job:
stage: hello
script:
- echo "Hello World"
Jenkins 파이프라인 구문
Jenkins 구성은 “섹션” 및 “지시문”으로 구성됩니다. GitLab CI/CD는 YAML 키워드로 구성되어 유사한 기능을 제공합니다.
섹션
Jenkins | GitLab | 설명 |
---|---|---|
agent
| image
| Jenkins 파이프라인은 에이전트에서 실행되며 agent 섹션은 파이프라인의 실행 방법과 사용할 도커 컨테이너를 정의합니다. GitLab 작업은 _러너_에서 실행되며 image 키워드는 사용할 컨테이너를 정의합니다. Kubernetes 또는 호스트에서 자체 러너를 구성할 수 있습니다.
|
post
|
after_script 또는 stage
| Jenkins의 post 섹션은 단계 또는 파이프라인의 끝에서 수행해야 할 작업을 정의합니다. GitLab은 after_script 을 사용하여 작업의 끝에서 실행할 명령을 정의하고, before_script 을 사용하여 다른 명령보다 먼저 실행할 작업을 정의합니다. stage 를 사용하여 작업이 실행될 정확한 단계를 선택합니다. GitLab은 항상 다른 모든 정의된 단계 이전 또는 이후에 항상 실행하는 .pre 및 .post 단계를 지원합니다.
|
stages
| stages
| Jenkins 단계는 작업의 그룹입니다. GitLab CI/CD도 단계를 사용하지만 더 유연합니다. 여러 독립적인 작업을 갖는 여러 단계를 가질 수 있습니다. 최상위에서 stages 를 사용하여 단계와 실행 순서를 정의하고, 작업 수준에서 작업을 위한 단계를 정의하는 데 stage 를 사용합니다.
|
steps
| script
| Jenkins의 steps 는 실행할 작업을 정의합니다. GitLab CI/CD는 유사한 script 섹션을 사용합니다. script 섹션은 순서대로 실행할 각 명령에 대한 별도의 항목을 가진 YAML 배열입니다.
|
지시문
Jenkins | GitLab | 설명 |
---|---|---|
environment
| variables
| Jenkins는 환경 변수에 environment 를 사용합니다. GitLab CI/CD는 작업 실행 중에 사용할 수 있는 CI/CD 변수를 정의하기 위해 variables 키워드를 사용하지만 더 동적인 파이프라인 구성을 위해서도 사용됩니다. 이러한 변수는 GitLab UI에서도 CI/CD 설정 아래에서 설정할 수 있습니다.
|
options
| 해당 없음 | Jenkins는 추가 구성을 위해 options 를 사용하며, 이에는 시간 초과 및 재시도 값을 포함합니다. GitLab은 옵션에 대한 별도의 섹션이 필요하지 않으며 모든 구성은 작업이나 파이프라인 수준에서 CI/CD 키워드로 추가됩니다. 예를 들어 timeout 또는 retry 를 사용합니다.
|
parameters
| 해당 없음 | Jenkins에서는 파이프라인을 트리거할 때 매개변수를 필요로 할 수 있습니다. GitLab에서는 CI/CD 변수로 매개변수를 처리하며 이는 프로젝트 설정 또는 UI, API를 통해 런타임 중에 정의할 수 있습니다. |
triggers
| rules
| Jenkins에서 triggers 는 파이프라인을 언제 다시 실행할지를 정의합니다. 예를 들어 cron 표기법을 통해 파이프라인을 다시 실행할 수 있습니다. GitLab CI/CD는 Git 변경 및 MR(Merge Request) 업데이트를 포함한 많은 이유로 파이프라인을 자동으로 실행할 수 있습니다. 어떤 이벤트에서 작업을 실행할지 제어하려면 rules 키워드를 사용합니다. 예약된 파이프라인은 프로젝트 설정에서 정의됩니다.
|
tools
| 해당 없음 | Jenkins에서 tools 는 환경에 추가 도구를 정의합니다. GitLab은 도구를 이미 포함하고 있는 컨테이너 이미지를 사용하는 것이 권장되며, 추천된 컨테이너 이미지에는 작업에 필요한 정확한 도구가 포함되어 있습니다. 이러한 이미지는 캐싱될 수 있으며 파이프라인에 필요한 도구를 이미 포함하도록 빌드될 수 있습니다. 작업이 추가 도구가 필요하다면 before_script 섹션에서 설치할 수 있습니다.
|
input
| 해당 없음 | Jenkins에서 input 은 사용자 입력을 추가합니다. parameters 와 유사하게 GitLab에서는 CI/CD 변수를 통해 입력이 처리됩니다.
|
when
| rules
| Jenkins에서 when 은 단계가 실행되어야 하는 시기를 정의합니다. GitLab에서는 동일한 기능을 제공하는 when 키워드가 있으며, 예를 들어 작업이 통과했는지 실패했는지에 따라 작업을 시작할지 여부를 정의합니다. 특정 파이프라인에 작업을 추가할지를 제어하려면 rules 를 사용합니다.
|
공통 구성
이 섹션은 Jenkins에서 GitLab CI/CD로 변환할 수 있는 일반적으로 사용되는 CI/CD 구성을 설명합니다.
Jenkins 파이프라인은 새로운 커밋을 푸시하는 등의 이벤트가 발생할 때 트리거되는 자동화된 CI/CD 작업을 생성합니다. Jenkins 파이프라인은 Jenkinsfile
에서 정의됩니다. GitLab과 동일한 기능을 제공하는 것은 .gitlab-ci.yml
구성 파일입니다.
Jenkins는 소스 코드를 저장할 곳을 제공하지 않기 때문에 Jenkinsfile
은 별도의 소스 제어 저장소에 저장해야 합니다.
작업
작업은 특정 결과를 얻기 위해 일련의 명령을 순차적으로 실행하는 것입니다.
예를 들어, Jenkinsfile
에서 컨테이너를 빌드한 다음 프로덕션 환경에 배포합니다.
pipeline {
agent any
stages {
stage('build') {
agent { docker 'golang:alpine' }
steps {
apk update
go build -o bin/hello
}
post {
always {
archiveArtifacts artifacts: 'bin/hello'
onlyIfSuccessful: true
}
}
}
stage('deploy') {
agent { docker 'golang:alpine' }
when {
branch 'staging'
}
steps {
echo "Deploying to staging"
scp bin/hello remoteuser@remotehost:/remote/directory
}
}
}
}
이 예시는 다음과 같습니다:
- golang:alpine
컨테이너 이미지를 사용합니다.
- 코드를 빌드하는 작업을 실행합니다.
- 생성된 실행 파일을 artifact로 저장합니다.
- staging
으로 배포하는 두 번째 작업을 추가합니다. 이 작업은 다음과 같습니다:
- 커밋이 staging
브랜치를 대상으로하는 경우에만 존재합니다.
- 빌드 단계가 성공한 후 시작됩니다.
- 앞선 작업에서 생성된 실행 파일 artifact를 사용합니다.
동일한 GitLab CI/CD .gitlab-ci.yml
파일은 다음과 같을 것입니다.
기본:
이미지: golang:alpine
단계:
- 빌드
- 배포
build-job:
stage: build
script:
- apk update
- go build -o bin/hello
artifacts:
paths:
- bin/hello
expire_in: 1 week
deploy-job:
stage: deploy
script:
- echo "스테이징으로 배포 중"
- scp bin/hello remoteuser@remotehost:/remote/directory
rules:
- if: $CI_COMMIT_BRANCH == 'staging'
artifacts:
paths:
- bin/hello
병렬
Jenkins에서, 이전 작업에 의존하지 않는 작업은 parallel
섹션에 추가될 때 병렬로 실행될 수 있습니다.
예를 들어, Jenkinsfile
에서:
pipeline {
agent any
stages {
stage('Parallel') {
parallel {
stage('Python') {
agent { docker 'python:latest' }
steps {
sh "python --version"
}
}
stage('Java') {
agent { docker 'openjdk:latest' }
when {
branch 'staging'
}
steps {
sh "java -version"
}
}
}
}
}
}
이 예시는 Python과 Java 작업을 병렬로 실행하며, 각기 다른 컨테이너 이미지를 사용합니다. Java 작업은 staging
브랜치가 변경된 경우에만 실행됩니다.
동일한 GitLab CI/CD .gitlab-ci.yml
파일은 다음과 같을 것입니다.
python-version:
이미지: python:latest
script:
- python --version
java-version:
이미지: openjdk:latest
rules:
- if: $CI_COMMIT_BRANCH == 'staging'
script:
- java -version
이 경우, 작업을 병렬로 실행하도록 추가 구성이 필요하지 않습니다. 작업은 기본적으로 병렬로 실행되며, 충분한 실행기가있는 경우 각각 다른 실행기에서 실행됩니다. Java 작업은 staging
브랜치가 변경된 경우에만 실행되도록 설정됩니다.
행렬
GitLab에서, 여러 변수 값을 사용하여 단일 파이프라인에서 작업을 여러 번 병렬로 실행할 수도 있습니다. Jenkins는 행렬을 순차적으로 실행합니다.
예를 들어, Jenkinsfile
에서:
matrix {
axes {
axis {
name 'PLATFORM'
values 'linux', 'mac', 'windows'
}
axis {
name 'ARCH'
values 'x64', 'x86'
}
}
stages {
stage('build') {
echo "$PLATFORM for $ARCH 빌드 중"
}
stage('test') {
echo "$PLATFORM for $ARCH 테스트 중"
}
stage('deploy') {
echo "$PLATFORM for $ARCH 배포 중"
}
}
}
동일한 GitLab CI/CD .gitlab-ci.yml
파일은 다음과 같을 것입니다.
단계:
- 빌드
- 테스트
- 배포
.parallel-hidden-job:
parallel:
matrix:
- PLATFORM: [linux, mac, windows]
ARCH: [x64, x86]
build-job:
extends: .parallel-hidden-job
stage: build
script:
- echo "$PLATFORM for $ARCH 빌드 중"
test-job:
extends: .parallel-hidden-job
stage: test
script:
- echo "$PLATFORM for $ARCH 테스트 중"
deploy-job:
extends: .parallel-hidden-job
stage: deploy
script:
- echo "$PLATFORM for $ARCH 배포 중"
컨테이너 이미지
GitLab에서는 Docker 이미지를 사용하여 CI/CD 작업을 별도로 격리된 도커 컨테이너에서 실행할 수 있습니다.
예를 들어, Jenkinsfile
에서:
stage('Version') {
agent { docker 'python:latest' }
steps {
echo 'Hello Python'
sh 'python --version'
}
}
이 예시는 python:latest
컨테이너에서 명령이 실행되는 것을 보여줍니다.
동일한 GitLab CI/CD .gitlab-ci.yml
파일은 다음과 같을 것입니다.
version-job:
image: python:latest
script:
- echo "Hello Python"
- python --version
변수
GitLab에서는 CI/CD 변수를 정의하기 위해 variables
키워드를 사용합니다. 이를 사용하여 구성 데이터를 재사용하거나 더 동적인 구성을 만들거나 중요한 값들을 저장할 수 있습니다. 변수는 전역적으로 또는 작업별로 정의할 수 있습니다.
예를 들어, Jenkinsfile
에서:
pipeline {
agent any
environment {
NAME = 'Fern'
}
stages {
stage('English') {
environment {
GREETING = 'Hello'
}
steps {
sh 'echo "$GREETING $NAME"'
}
}
stage('Spanish') {
environment {
GREETING = 'Hola'
}
steps {
sh 'echo "$GREETING $NAME"'
}
}
}
}
동일한 GitLab CI/CD .gitlab-ci.yml
파일은 다음과 같을 것입니다.
기본:
이미지: alpine:latest
단계:
- 인사
variables:
NAME: "Fern"
english:
stage: 인사
variables:
GREETING: "Hello"
script:
- echo "$GREETING $NAME"
spanish:
stage: 인사
variables:
GREETING: "Hola"
script:
- echo "$GREETING $NAME"
변수는 GitLab UI에서 정의할 수도 있습니다. 어떤 경우에는 비공개 변수와 비밀 변수를 사용할 수도 있습니다. 이러한 변수는 구성 파일에 정의된 변수와 마찬가지로 파이프라인 작업에서 액세스할 수 있습니다.
표현식과 조건문
새로운 파이프라인이 시작될 때 GitLab은 해당 파이프라인에서 실행해야 할 작업을 확인합니다. 변수의 상태나 파이프라인 유형과 같은 요소에 따라 작업을 구성할 수 있습니다.
예를 들어, Jenkinsfile
에서:
stage('deploy_staging') {
agent { docker 'alpine:latest' }
when {
branch 'staging'
}
steps {
echo "스테이징에 배포 중"
}
}
이 예제에서 해당 작업은 커밋한 브랜치가 staging
으로 명명된 경우에만 실행됩니다.
해당하는 GitLab CI/CD .gitlab-ci.yml
파일은 다음과 같습니다:
deploy_staging:
stage: deploy
script:
- echo "스테이징 서버로 배포"
rules:
- if: '$CI_COMMIT_BRANCH == staging'
Runners
Jenkins 에이전트와 마찬가지로, GitLab 러너는 작업을 실행하는 호스트입니다. GitLab.com을 사용하는 경우 인스턴스 러너 플리트를 사용하여 별도의 러너를 프로비저닝하지 않고 작업을 실행할 수 있습니다.
GitLab CI/CD와 함께 사용하기 위해 Jenkins 에이전트를 전환하려면 에이전트를 제거한 다음 러너를 설치하고 등록하면 됩니다. 러너는 많은 오버헤드가 필요하지 않으므로 사용 중인 Jenkins 에이전트와 유사한 프로비저닝을 사용할 수 있습니다.
러너에 관한 몇 가지 중요한 세부 정보는 다음과 같습니다:
- 러너는 인스턴스 전체, 그룹 또는 단일 프로젝트에 대해 구성할 수 있습니다.
- 보다 정교한 제어를 위해
tags
키워드를 사용할 수 있으며, 특정 작업에 러너를 연결할 수 있습니다. 예를 들어, 전용, 강력하거나 특정 하드웨어가 필요한 작업에 태그를 사용할 수 있습니다. - GitLab은 러너에 대한 자동 스케일링을 제공합니다. 필요할 때만 러너를 프로비저닝하고 필요하지 않을 때는 축소하는 데 자동 스케일링을 사용할 수 있습니다.
예를 들어, Jenkinsfile
에서:
pipeline {
agent none
stages {
stage('Linux') {
agent {
label 'linux'
}
steps {
echo "안녕하세요, $USER"
}
}
stage('Windows') {
agent {
label 'windows'
}
steps {
echo "안녕하세요, %USERNAME%"
}
}
}
}
해당하는 GitLab CI/CD .gitlab-ci.yml
파일은 다음과 같습니다:
linux_job:
stage: build
tags:
- linux
script:
- echo "안녕하세요, $USER"
windows_job:
stage: build
tags:
- windows
script:
- echo "안녕하세요, %USERNAME%"
아티팩트
GitLab에서는 모든 작업이 완료될 때 artifacts
키워드를 사용하여 저장할 아티팩트 세트를 정의할 수 있습니다.
아티팩트는 나중의 작업에서 사용할 수 있는 파일로, 예를 들어 테스트 또는 배포에 사용할 수 있습니다.
예를 들어, Jenkinsfile
에서:
stages {
stage('Generate Cat') {
steps {
sh 'touch cat.txt'
sh 'echo "meow" > cat.txt'
}
post {
always {
archiveArtifacts artifacts: 'cat.txt'
onlyIfSuccessful: true
}
}
}
stage('Use Cat') {
steps {
sh 'cat cat.txt'
}
}
}
해당하는 GitLab CI/CD .gitlab-ci.yml
파일은 다음과 같습니다:
stages:
- generate
- use
generate_cat:
stage: generate
script:
- touch cat.txt
- echo "meow" > cat.txt
artifacts:
paths:
- cat.txt
expire_in: 1 week
use_cat:
stage: use
script:
- cat cat.txt
artifacts:
paths:
- cat.txt
캐싱
작업이 하나 이상의 파일을 다운로드하고 나중을 위해 더 빠른 액세스를 위해 저장할 때 캐시가 생성됩니다. 동일한 캐시를 사용하는 후속 작업은 파일을 다시 다운로드할 필요가 없으므로 더 빨리 실행됩니다. 캐시는 러너에 저장되며, 분산 캐시가 활성화된 경우 S3에 업로드됩니다. Jenkins 코어는 캐싱을 제공하지 않습니다.
예를 들어, .gitlab-ci.yml
파일에서:
cache-job:
script:
- echo "이 작업은 캐시를 사용합니다."
cache:
key: binaries-cache-$CI_COMMIT_REF_SLUG
paths:
- binaries/
Jenkins 플러그인
Jenkins에서 플러그인을 통해 활성화되는 일부 기능은 GitLab에서 유사한 기능을 제공하는 키워드와 기능을 통해 네이티브로 지원됩니다. 예를 들어:
보안 스캐닝 기능
이전에 Jenkins에서 코드 품질, 보안 또는 정적 애플리케이션 스캐닝과 같은 것에 대한 플러그인을 사용한 적이 있을 것입니다.
GitLab은 SDLC의 모든 부분에서 취약점을 검출하기 위해 기본 제공 보안 스캐너를 제공합니다. 이러한 플러그인을 GitLab에 추가하려면 템플릿을 사용할 수 있습니다. 예를 들어, SAST 스캐닝을 파이프라인에 추가하려면 다음을 .gitlab-ci.yml
에 추가하십시오.
include:
- template: Jobs/SAST.gitlab-ci.yml
또한 SAST 스캐너를 사용하여 CI/CD 변수를 사용하여 보안 스캐너의 동작을 사용자 정의할 수 있습니다.
보안 관리
특권 정보 또는 “비밀”이라고도하는 민감한 정보는 CI/CD 워크플로우에서 필요한 자격 증명 또는 정보입니다. 보호된 리소스를 잠금 해제하거나 도구, 애플리케이션, 컨테이너 및 클라우드 원천 환경에서 민감한 정보를 해제하는 데 비밀을 사용할 수 있습니다.
보안 관리는 Jenkins에서 일반적으로 ‘비밀’ 유형 필드나 자격 증명 플러그인을 사용하여 처리됩니다. Jenkins 설정에 저장된 자격 증명은 자격 증명 유형 필드 또는 자격 증명 바인딩 플러그인을 사용하여 작업에 환경 변수로 노출될 수 있습니다.
GitLab의 보안 관리를 위해 외부 서비스의 지원되는 통합 중 하나를 사용할 수 있습니다. 그러나 해당 서비스의 구독이 필요합니다. 이러한 서비스는 GitLab 프로젝트 외부에 비밀을 안전하게 저장합니다.
또한 GitLab은 OIDC를 지원하여 OIDC를 지원하는 다른 타사 서비스에 대한 OIDC 인증도 지원합니다.
또한, 단순 텍스트로 저장된 비밀은 우발적 노출에 취약하므로 작업에서 비밀을 사용할 수 있습니다. 민감한 정보를 마스킹 및 보호 변수에 항상 저장해야 합니다.
또한, 프로젝트 .gitlab-ci.yml
파일에 비밀을 변수로 저장하면 프로젝트에 액세스 권한이 있는 모든 사용자에게 공개되므로 절대로 비밀을 변수로 저장해서는 안됩니다. 변수에 민감한 정보를 저장하는 것은 프로젝트, 그룹 또는 인스턴스 설정에서만 수행해야 합니다.
CI/CD 변수의 안전성을 향상하려면 보안 가이드라인을 검토하십시오.
마이그레이션 계획 수립 및 수행
다음은이 마이그레이션을 신속하게 완료할 수있었던 조직을 관찰한 후 만든 권장 단계 목록입니다.
마이그레이션 계획 수립
마이그레이션을 시작하기 전에 마이그레이션을 위해 마이그레이션 계획을 수립해야합니다. Jenkins에서 마이그레이션하는 경우 준비를 위해 다음 질문에 대답하십시오.
- 현재 Jenkins 작업에서 사용 중인 플러그인은 무엇입니까?
- 이러한 플러그인이 정확히 무엇을 하는지 알고 있습니까?
- 어떤 플러그인이 Maven, Gradle 또는 NPM과 같은 일반적인 빌드 도구를 둘러싼지 확인하십니까?
- Jenkins 에이전트에 설치된 것이 무엇인가요?
- 사용 중인 공유 라이브러리가 있습니까?
- Jenkins에서 어떻게 인증하고 있습니까? SSH 키, API 토큰 또는 다른 비밀을 사용하고 있습니까?
- 파이프라인에서 액세스해야하는 다른 프로젝트가 있습니까?
- Jenkins에 외부 서비스 액세스를위한 자격 증명이 있습니까? 예를 들어 Ansible Tower, Artifactory 또는 다른 클라우드 제공 업체 또는 배포 대상 등.
전제 조건
마이그레이션 작업을 시작하기 전에 먼저 해야 할 일은:
- GitLab에 익숙해지기
- 주요 GitLab CI/CD 기능에 대해 읽기
- 정적 사이트를 빌드, 테스트 및 배포하는 첫 번째 GitLab 파이프라인 및 보다 복잡한 파이프라인 만들기 등의 자습서 따르기
- CI/CD YAML 구문 참조 검토
- GitLab 설치 및 구성
- GitLab 인스턴스를 테스트하십시오.
- 공유 GitLab.com 실행자 또는 새 실행자를 설치하여 실행자가 사용 가능한지 확인하십시오.
마이그레이션 단계
- 프로젝트를 SCM 솔루션에서 GitLab으로 마이그레이션합니다.
- (권장) 사용 가능한 importers를 사용하여 외부 SCM 제공 업체에서 자동으로 대규모로 가져올 수 있습니다.
- URL별로 저장소 가져오기를 사용할 수 있습니다.
- 각 프로젝트에
.gitlab-ci.yml
파일을 만듭니다. - Jenkins 구성을 GitLab CI/CD 작업으로 마이그레이션하고 결과를 병합 요청에서 직접 표시하도록 구성합니다.
- 클라우드 배포 템플릿, 환경 및 Kubernetes용 GitLab 에이전트를 사용하여 배포 작업을 마이그레이션합니다.
- 다른 프로젝트 간에 재사용할 수있는 CI/CD 구성이 있는지 확인한 후 CI/CD 템플릿을 만들고 공유합니다.
- GitLab CI/CD 파이프라인을 더 빠르고 효율적으로 만드는 방법을 알아보기 위해 파이프라인 효율성 문서를 확인하십시오.
추가 리소스
-
완전한 Jenkins 인스턴스 및 플러그인을 사용하여 GitLab CI/CD 작업 내에서 Jenkins를 실행할 수있는 JenkinsFile Wrapper를 사용할 수 있습니다. 보다 적극적인 파이프라인으로의 전환을 돕기 위해 이 도구를 사용할 수 있습니다.
참고: JenkinsFile Wrapper는 GitLab에 패키지되어 있지 않으며 지원 범위를 벗어납니다. 자세한 정보는 지원 성명을 참조하십시오.
여기에 없는 질문이 있다면 GitLab 커뮤니티 포럼을 참조할 수 있습니다.