入门
GitLab CI / CD由.gitlab-ci.yml文件配置,该文件位于项目库根目录。.gitlab-ci.yml文件创建一个流水线(pipeline)以更改存储库中的代码。流水线由一个或多个顺序运行的阶段(stages)组成,每个阶段可以包含一个或多个并行运行的作业(jobs)。
在项目根目录下创建一个.gitlab-ci.yml文件,该文件定义了CI/CD作业,将含有该文件的项目提交后,作业将会被执行并将结果显示在流水线中,CI/CD > Pipeline可显示详细信息。
快速开始
创建.gitlab-ci.yml文件
在项目主页选择分支,创建.gitlab-ci.yml文件。GitLab提供了针对不同语言的.gitlab-ci.yml模板文件。
以一个Java项目为例,.gitlab-ci.yml内容为
stages:
- test
- build
- deploy
test:
stage: test
script:
- mvn clean test
build:
stage: build
artifacts:
paths:
- target/
script:
- mvn package -Dmaven.test.skip=true
deploy-to-prod:
stage: deploy
script:
- mvn deploy -Dmaven.test.skip=true
通常流水线可能包含三个阶段,按以下顺序执行:
test阶段,作业名称为test,通常用于运行测试用例。
build阶段,作业名称为build,通常用于项目编译。
deploy阶段,作业名称为deploy-to-prod,通常用于部署到线上环境。
示例中deploy阶段向Artifactory上传jar包,需要配置自定义环境变量MAVEN_REPO_USER和MAVEN_REPO_PASS,配置方法参考下面的“自定义环境变量”章节。其中MAVEN_REPO_USER为你的用户名,MAVEN_REPO_PASS为你的密码。
验证.gitlab-ci.yml文件
要验证.gitlab-ci.yml文件,请使用CI Lint工具。
查看流水线和作业状态
CI/CD > Pipeline
点击流水线ID可显示流水线详情
点击作业名称可显示作业详情
环境变量
预定义环境变量
GitLab CI/CD有一组默认的环境变量,在脚本中直接调用即可。
自定义环境变量
自定义环境变量可在Settings > CI/CD > Variables手动添加
也可在.gitlab-ci.yml中设置。
variables:
CI_REGISTRY: cr.d.demo.net
CI_REGISTRY_IMAGE: cr.d.demo.net/gitlab-cicd/helloworld
anchors
YAML具有“锚点”功能,可用于在整个文档中复制内容。使用&定义锚点的名称,以.开头定义作业为隐藏作业,GitLab CI / CD将不会对此处进行处理。
Stages
stages的顺序决定了jobs执行的顺序,每个阶段可以包含一个或多个作业,作业由一系列关键字定义。同一阶段的作业并行执行,不同阶段的作业按阶段顺序执行。当有任何一作业失败,流水线标记为failed,后续阶段不会被执行。
示例.gitlab-ci.yml文件包含了8个阶段,当上一阶段所有作业都执行成功后才会进入下一阶段。(示例仅供参考,stages顺序可根据项目实际情况定义。)
stages:
- test
- build
- scan
- report
- archive
- dist
- staging
- deploy
test测试阶段,通常用于项目的测试。(若测试阶段需要用到编译后的二进制文件,可将test阶段放于build阶段后,从artifacts中获取二进制文件。)
build构建阶段,通常用于构建或打包项目,并将结果传入artifacts用于其他阶段。
scan 扫描阶段,通常用于代码审查并生成分析报告。
report报告阶段,通常用于将分析报告以评论的方式添加到合并请求的页面中。
archive 存档阶段,通常用于将指定文件上传作为存档。
dist 构建阶段,通常用于构建镜像用于后续部署。
staging 预发布环境部署阶段,通常用于部署到预发布环境。
deploy 线上环境部署阶段,通常用于部署到线上环境。
Test
测试阶段
test:
stage: test
only:
- master
- dev
- merge_requests
artifacts:
paths:
- target/
reports:
junit:
- target/surefire-reports/TEST-*.xml
- target/failsafe-reports/TEST-*.xml
script:
- mvn clean test verify
- cat target/site/jacoco/index.html
stage定义了作业的阶段。
only限制了作业创建的条件。示例中表示作业仅在master,dev分支和提合并请求时被创建。
artifacts附加到作业的文件和目录列表,用于在不同运行阶段间传递结果。
artifacts:paths路径相对于项目目录($CI_PROJECT_DIR),不能直接链接到其外部。
artifacts:reports:junit 用于收集JUnit XML文件。
script程序执行的Shell脚本。
Build
构建阶段
build:
stage: build
only:
- master
- dev
- merge_requests
artifacts:
paths:
- target/
script:
- mvn package -Dmaven.test.skip=true
生成的文件传入artifacts
Scan
扫描阶段
sonar_scan:
stage: scan
only:
- master
- dev
- merge_requests
artifacts:
paths:
- report/
script:
- sonar scan --sources src/main --tests src/test --report -- -Dsonar.java.binaries=target/classes
基于SonarQube对代码进行扫描,并生成分析报告。
生成分析报告并以工件传递
Archive
存档阶段
upload_fds:
stage: archive
only:
- master
- dev
- merge_requests
script:
- copy `ls target/*.jar` ${CD_BUCKET}/${CI_COMMIT_SHORT_SHA}.jar
将生成的jar包上传,其中${CI_COMMIT_SHORT_SHA}为预定义环境变量。
Dist
构建阶段
build_image:
stage: dist
dependencies:
- build
image:
name: cr.d.demo.net/containercloud/kaniko-executor-demo:release
entrypoint: [""]
only:
- master
- dev
- merge_requests
script:
- IMAGE=${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHORT_SHA}
- echo "{\"auths\":{\"${CI_REGISTRY}\":{\"username\":\"${CI_REGISTRY_USER}\",\"password\":\"${CI_REGISTRY_PASSWORD}\"}}}" > /kaniko/.docker/config.json
- /kaniko/executor --context ${CI_PROJECT_DIR} --dockerfile ${CI_PROJECT_DIR}/Dockerfile --destination ${IMAGE} --validate-image
image使用Docker映像kaniko-executor-demo:release。
name 镜像名称。
entrypoint 推荐为空,语法类似于Dockerfile’s ENTRYPOINT
使用kaniko构建镜像。其中${CI_REGISTRY} , ${CI_REGISTRY_IMAGE},{CI_COMMIT_SHORT_SHA},{CI_PROJECT_DIR}为预定义环境变量。{CI_REGISTRY_USER}和{CI_REGISTRY_PASSWORD}在Settings > CI/CD > Variables中配置。
Staging
预发布环境部署阶段
staging:
stage: staging
variables:
CD_CLUSTER: "staging"
environment:
name: staging
url: http://cicd-helloworld-cl.staging.demo.net
only:
- master
- dev
- merge_requests
environment在指定环境中进行部署。
name名称。
url业务链接。
Operations > Environments
Deploy
线上环境部署阶段
production:
stage: deploy
variables:
CD_CLUSTER: "c"
environment:
name: production
url: http://cicd-helloworld.demo.net
only:
refs:
- master
pages:
stage: deploy
dependencies:
- build
only:
refs:
- master
artifacts:
paths:
- public
script:
- mkdir -p public/
- cp -r target/generated-docs/* public/
pages用于将静态内容上传到GitLab。需满足两点条件:
所有静态内容放置于public/文件夹下。
包含public/文件夹路径的artifacts必须被定义。
Operations > Environments