共计 3677 个字符,预计需要花费 10 分钟才能阅读完成。
感激极狐团队为 GitLab(SaaS)本地化的致力,同时也感激小马哥提供的内测资格。
最近忽然想到了个点子,须要应用一个公有的镜像仓库。极狐 GitLab 有提供容器镜像库,正好和 CICD 一起做个轻度体验。
容器镜像库 Container Registry
文档介绍在这里,目前还是英文。(应该本地化的工作量很大,文档还没翻译。)
容器镜像库能够作为独立镜像仓库应用(为什么要这么用,卖个关子下篇文章见),就是应用 docker 命令将构建好的镜像推送到 容器镜像库。
当然也能够同 CICD 流水线联合应用,后文也会介绍。
独立应用
本地登录 Container Registry 有两种验证形式:
- 应用用户名和明码
- 开启了双重身份验证,能够应用拜访集体拜访令牌
其实,不论是否开始双重验证,都倡议应用拜访令牌。
docker login registry.gitlab.cn
#依据提醒输出用户名和明码或者令牌
image 的名字最多有三层,即 registry.example.com/[namespace]
之后的内容最多有 3 层。比方上面的 image 名字 myproject/my/image
registry.example.com/mynamespace/myproject/my/image:rc1
其次 image 名字的第一层必须是镜像名,如下面的 myproject
。
尝试将 tekton 的镜像推送下来:
docker tag gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/controller:v0.28.1 registry.gitlab.cn/addozhang/registry-mirror/tekton-pipeline/controller:v0.28.1
docker push registry.gitlab.cn/addozhang/registry-mirror/tekton-pipeline/controller:v0.28.1
请疏忽公布工夫,原镜像的 Created
字段就有问题。
同样能够应用 REST API 进行拜访:
curl --location --request GET 'https://gitlab.cn/api/v4/projects/addozhang%2Fregistry-mirror/registry/repositories/155/tags' \
--header 'PRIVATE-TOKEN: TOKEN_HERE'
[{"name":"v0.28.1","path":"addozhang/registry-mirror/tekton-pipeline/controller:v0.28.1","location":"registry.gitlab.cn/addozhang/registry-mirror/tekton-pipeline/controller:v0.28.1"}]
应用 CICD 构建和推送
见下文。
CICD
我将之前 github 的应用的测试 tekton 的我的项目镜像到了这里,并增加了一个 .gitlab-ci.yml
的流水线定义文件。
有了官网的文档,以及参考官网提供各种的模板,流水线的定义上手很快。
整个流水线蕴含了两个 stage:Java 代码的编译打包和镜像的构建。
如上图,最新的一次应用了 cache
性能将 .m2/repository
缓存;而前两次应用了缓存(这里的构建耗时差别很大,不晓得是不是因为早晨资源比拟少?)。Java 我的项目会将依赖包保留在本地库中,应用 cache
性能能够晋升构建的效率。
流水线 DAG
应用 needs
能够管制同 stage 下作业的构建程序,否则同 stage 下作业的执行是并行的。同时有了 needs
还能够构建出 DAG,前提是起码须要 3 个作业,因而我又加了一个作业。
cache:
paths:
- .m2/repository
variables:
MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
stages:
- build
- image
- post-build
maven-build:
image: maven:3-jdk-8
stage: build
artifacts:
paths:
- target/*.jar
script:
- mvn install -DskipTests
docker-build:
image: docker:19.03.12
stage: image
needs:
- maven-build
dependencies:
- maven-build
services:
- docker:19.03.12-dind
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:latest
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $IMAGE_TAG .
- docker push $IMAGE_TAG
done:
image: busybox:latest
stage: post-build
needs:
- docker-build
script:
- echo "All Done!"
感觉图有点简陋,前期应该会优化。
作业依赖
后面的流水线定义中,为了传递 maven 构建的 jar,应用了 artifacts
和 dependencies
进行了传递。
难道是我了解错了?鼠标悬停并没有显示做依赖的作业。
流水线触发
除了 push 代码触发,还能够创立触发器通过 Web API 进行触发。
curl -X POST \
-F token=TOKEN_HERE \
-F ref=main \
https://gitlab.cn/api/v4/projects/9766/trigger/pipeline
{"id":19252,"project_id":9766,"sha":"5dde144d584b76fe6d3b63a4a9beb789762d1a2d","ref":"main","status":"created","created_at":"2021-10-01T07:37:42.806+08:00","updated_at":"2021-10-01T07:37:42.806+08:00","web_url":"https://gitlab.cn/addozhang/tekton-test/-/pipelines/19252","before_sha":"0000000000000000000000000000000000000000","tag":false,"yaml_errors":null,"user":{"id":432,"name":"addozhang","username":"addozhang","state":"active","avatar_url":null,"web_url":"https://gitlab.cn/addozhang"},"started_at":null,"finished_at":null,"committed_at":null,"duration":null,"queued_duration":null,"coverage":null,"detailed_status":{"icon":"status_created","text":"created","label":"created","group":"created","tooltip":"created","has_details":true,"details_path":"/addozhang/tekton-test/-/pipelines/19252","illustration":null,"favicon":"/assets/ci_favicons/favicon_status_created-4b975aa976d24e5a3ea7cd9a5713e6ce2cd9afd08b910415e96675de35f64955.png"}}
总结
因为之前任职的公司外部也有用 Gitlab,也有过 Github Action 和 Tektoncd 的应用教训,所以体验下来并还没有任何妨碍。这也得益于文档的欠缺,以及极狐团队的致力,心愿极狐能够做得更好。
文中应用 registry-mirror
做了仓库名,大家也能猜到点什么,敬请关注一下篇。
文章对立公布在公众号
云原生指北