最近,我开始研究几个高利的微服务。我决定尝试Gitlab的缓存并将作业拆分为多个步骤,以便在UI中更好地反馈。

自从我之前的文章[1][2一定的问题CI / CD,很多改变了。我开始使用Helm进行包装应用程序,并在Gitlab-Runner中使用Docker-in-Docker停止。

这里有一些主要的变化,我的.gitlab-ci.yaml自我上一篇文章以来的文件:

建筑Golang形象

由于戈兰对项目的位置非常严格,因此我们需要进行一些调整CI工作.这是在的before_script块。只需创建所需的目录并在其中链接源代码。假设项目的正式存储库是gitlab.example.com/librerio/libr_files它应该是这样的。

/go/src/gitlab.example.com/librerio/libr_files before_script: - mkdir -p /go/src/gitlab.example.com/librerio/ - ln -s $PWD ${APP_PATH} - mkdir -p ${APP_PATH}/vendor - cd ${APP_PATH}

这样,我们就可以安装依赖项并构建二进制文件。为了避免在每次构建时下载所有包,我们需要配置缓存。由于GitLab的奇怪缓存规则,我们需要将供应商目录添加到缓存和工件中。缓存将使我们能够在构建作业之间使用它,而工件将允许我们在同一个作业中使用它。

缓存:Untracked:True键:“$ CI_Build_ref_name”路径: - 供应商/设置:舞台:设置图片:Lwolf / Golang-Glide:0.12.3脚本: -  Glide安装-V工件:路径: - 供应商/

构建步骤没有改变,它仍然是关于构建二进制。我将二进制文件添加到伪影。

build: stage: build image: lwolf/golang-glide:0.12.3 script: - cd ${APP_PATH} - GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o release/app -ldflags '-w -s' - cd release artifacts: paths: - release/

测试阶段

使用覆盖报告运行golang测试我正在使用的变化这个shell脚本.它运行项目子目录中的所有测试,并创建覆盖率报告。我稍微改了一下,然后就说了要点。我从测试中排除了供应商目录。

部署阶段

我不使用本地GitLab与Kubernetes的集成。

首先,我考虑了创建Kubernetes秘密并将其安装到Gitlab-Runner Pod。但这非常复杂。您需要每次要添加新群集配置时升级部署。因此,我正在使用Gitlab的CI / CD变量与Base64编码的Kubernetes Config。每个项目都可以包含任何配置。该过程易于 - 从配置中创建Base64字符串并将其复制到剪贴板。在此之后,将其放入kube_config变量(随便你怎么命名)。

猫~ /。Kube /config | base64 | pbcopy

如果您不拥有完整的Gitlab安装,请考虑使用受限权限创建Kubernetes用户。

然后在部署阶段,我们可以将这个变量解码回文件中,并与kubectl一起使用它。

/etc/deploy/config deploy:…before_script: - mkdir - p /etc/deploy echo $ {kube_config} | base64 - d > $ {KUBECONFIG} - kubectl配置使用环境homekube -舵init -仅客户端的执掌回购添加稳定回购增加孵化器https://kubernetes-charts-incubator.storage.googleapis.com/ https://kubernetes-charts.storage.googleapis.com/舵舵回购更新

部署阶段还包括具有相同应用程序的多个版本的情况。

例如,您有两个API版本:v1.0和v1.1。你需要做的就是设置AppVersion.在Chart.yaml文件中。构建系统将检查API版本并部署或升级所需的版本。

- 导出api_version =“$(grep”appversion“chart.yaml | cut -d”-f2)“ - 导出refile_name =”lib-files-v $ {api_version /./-}“ - 导出部署= $(helmls | grep $ default_name | wc -l) - 如果[$ {部署} -eq 0];然后helm install --name = $ {safele_name}。-  inmespace = $ {staging_namespace};else helm升级$ {redure_name}。-  inmespace = $ {staging_namespace};FI.

TL;博士

这里是完整的`.gitlab-ci.yaml`文件供参考。缓存:未经触发:true键:“$ ci_build_ref_name”路径: - 供应商/ prefer_script: -  mkdir -p / go/src/gitlab.example.com/librerio/  -  ln -s $ pwd $ {app_path}  -  mkdir -p ${app_path} / vendor  -  cd $ {app_path}阶段: -  setup  -  test  -  build  - 发布 - 部署变量:container_image:$ {ci_registry_path}:$ {ci_build_ref_name} _ $ {ci_build_ref} container_image_latest:$ {ci_registry} / $ {ci_project_path}:repletay2 kubeconfig:/ etc / deploy / config staging_namespace:app-stage production_name新利18骗space:/go/src/gitlab.example.com/librerio/libr_files postgres_user:gorma postgres_db:test  -  $ {ci_build_ref} postgres_password:gorma设置:stage:设置图片:lwolf / golang-glide:0.12.3脚本: - 滑行安装-v工件:路径: - 供应商/构建:舞台:Build图片:Lwolf / Golang-Glide:0.12.3脚本: -  CD $ {app_path}  -  goos = linux goarch = amd64 cgo_enabled = 0 go build -o Release / app -LDFlags' -W -S' -  CD发布工件:路径: - 发布/发布:舞台:发布图片:Docker:最新脚本: -  CD $ {app_path} / reasel  -  docker登录-u gitlab-ci-token -p $ {ci_build_token} $ {ci_build_token} $ {ci_build_token} $ {ci_registry}  -  docker build -t $ {contain_image}。-  Docker标签$ {caltor_image} $ {container_image_latest}  -  docker推送$ {container_image}  -  docker推送$ {container_image_latest}测试:舞台:测试图片:lwolf / golang-glide:0.12.3服务: -  postgres:9.6脚本: -CD $ {app_path}  -  curl -o coverage.sh https://gist.githubusercontent.com/lwolf/3764A3B6CD08387A3B6CD08387A3B6CD08387A3B6CD08387A3B6CD08387A3B6CD08387A3B6CD08387A3B6CD08387A3B6CD08387A3B6CD08387A3B6CD08387A3B6CD08387B8A/RAW  -  SH Coverage.sh Deploy_staging:阶段:部署图片:Lwolf / Helm-Kubectl-Docker:v152_213 Bregire_script:-  mkdir -p / etc / deploy  -  echo $ {kube_config} |base64 -d> $ {kubeconfig}  -  kubectl config use-context主页kube  -  helm init  -  client-ellient  -  helm repo添加稳定https://kubernetes-charts.storage.goopis.com/  -  Helm Repo添加孵化器HTTPS://kubernetes-charts-incubator.storage.googleapis.com/  -  Helm Repo更新脚本: -  CD Deploy / Libr-Files  -  Helm Dep Build  -  Export API_Version =“$(Grep”AppVersion“Chart.yaml | Cut -d”“-f2)“ - 导出refile_name =”lib-files-v $ {api_version /./-}“ - 导出部署= $(helm ls | grep $ default_name | wc -l) - 如果[$ {部署} -eq 0 ]; then helm install --name=${RELEASE_NAME} . --namespace=${STAGING_NAMESPACE}; else helm upgrade ${RELEASE_NAME} . --namespace=${STAGING_NAMESPACE}; fi environment: name: staging url: https://librerio.example.com only: - master

如何创建一个CI/CD管道与自动部署Kubernetes使用GitLab和Helm最初发表在狼人博客上。新利18官方网站

照片由C查普曼uns

尝试所有GitLab功能——30天免费

GitLab不仅仅是源代码管理或CI/CD。它是一个完整的软件开发生命周期和DevOps工具在一个单一的应用程序。

尝试GitLab免费
18新利赢钱

试一试18luck mx 无风险30天。

不需要信用卡。有问题吗?与我们联系。

Gitlab x图标svg