CICD联动阿里云容器服务Kubernetes实践之GitLab CI篇(一)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文主要演示如何在阿里云Kubernetes容器服务中安装、注册GitLab Runner并添加kubernetes类型的executor来执行构建,并以此为基础完成一个java源码示例项目从编译构建、镜像打包到应用部署的CICD过程。

本文档以构建一个 Java 软件项目并部署到 阿里云容器服务的Kubernetes集群 为例说明如何使用 GitLab CI在阿里云Kubernetes服务上运行GitLab-Runner、配置kubernetes类型的executor并执行Pipeline。

1. 创建GitLab源码项目并上传示例代码

1.1 创建GitLab源码项目

本示例中创建的GitLab源码项目地址为:

http://xx.xx.xx.xx/demo/gitlab-java-demo.git

1.2 获取示例代码并上传至GitLab

$ git clone https://code.aliyun.com/CodePipeline/gitlabci-java-demo.git
$ git remote add gitlab http://xx.xx.xx.xx/demo/gitlab-java-demo.git
$ git push gitlab master

2. 在Kubernetes集群中安装GitLab-Runner

2.1 获取GitLab Runner的注册信息

2.1.1 项目专用Runner

Project --> Settings --> CI/CD --> Runners, 获取URL和registration token信息,如图:

image

image

2.1.2 Group Runners

Group --> Settings --> CI/CD --> Runners, 获取URL和registration token信息,如图:

image

2.1.3 Shared Runners

只能管理员创建, 进入admin/runners 页面获取url和token

image

2.2 获取并修改GitLab Runner的Helm Chart

$ git clone https://github.com/haoshuwei/ack-gitlab-runner.git

修改values.yaml文件, 示例如下:

## GitLab Runner Image
##
image: gitlab/gitlab-runner:alpine-v12.1.0

## Specify a imagePullPolicy
##
imagePullPolicy: IfNotPresent

## Default container image to use for initcontainer
init:
  image: busybox
  tag: latest

## The GitLab Server URL (with protocol) that want to register the runner against
##
gitlabUrl: http://xx.xx.xx.xx/

## The Registration Token for adding new Runners to the GitLab Server. This must
## be retreived from your GitLab Instance.
##
runnerRegistrationToken: "AMvEWrBTBu-d8czEYyfY"
## Unregister all runners before termination
##
unregisterRunners: true
  
## Configure the maximum number of concurrent jobs
##
concurrent: 10
  
## Defines in seconds how often to check GitLab for a new builds
##
checkInterval: 30
  
## For RBAC support:
##
rbac:
  create: true
  clusterWideAccess: false
    
## Configure integrated Prometheus metrics exporter
##
metrics:
  enabled: true
    
## Configuration for the Pods that that the runner launches for each new job
##
runners:
  ## Default container image to use for builds when none is specified
  ##
  image: ubuntu:16.04
  
  ## Specify the tags associated with the runner. Comma-separated list of tags.
  ##
  tags: "k8s-runner"
    
  ## Run all containers with the privileged flag enabled
  ## This will allow the docker:dind image to run if you need to run Docker
  ## commands. Please read the docs before turning this on:
  ##
  privileged: true
    
  ## Namespace to run Kubernetes jobs in (defaults to the same namespace of this release)
  ##
  namespace: gitlab
    
  cachePath: "/opt/cache"
    
  cache: {}
  builds: {}
  services: {}
  helpers: {}
  
resources: {}

2.3 安装GitLab Runner

$ helm package .
Successfully packaged chart and saved it to: /root/ack-gitlab-runner/ack-gitlab-runner-0.1.37.tgz
  
$ helm install --namespace gitlab --name gitlab-runner *.tgz

查看相关的deployment/pod启动是否成功,若成功启动, 则在GitLab上可以看到注册成功的GitLab Runner, 如图:

image

3. 缓存cache的配置

GitLab Runner中对缓存方案的支持有限,所以我们使用挂载volume的方式做缓存。在上面的示例中, 我们在安装GitLab Runner时默认使用/opt/cache目录作为缓存空间(可以修改values.yaml文件中的runners.cachePath字段)

比如建立maven缓存, 可以在variables下添加MAVEN_OPTS变量并指定本地缓存目录:

variables:
  KUBECONFIG: /etc/deploy/config
  MAVEN_OPTS: "-Dmaven.repo.local=/opt/cache/.m2/repository"

如果需要挂载新的volume, 则可以修改templates/configmap.yaml文件中的如下字段:

cat >>/home/gitlab-runner/.gitlab-runner/config.toml <<EOF
            [[runners.kubernetes.volumes.pvc]]
              name = "gitlab-runner-cache"
              mount_path = "{{ .Values.runners.cachePath }}"
EOF

即在GitLab Runner进行register之后, 在run之前, 修改config.toml的配置。

4. 全局变量的设置

Project --> Settings --> CI/CD --> Variables, 添加GitLab Runner可用的环境变量,本示例添加3个变量如下:

  • REGISTRY_USERNAME 镜像仓库用户名
  • REGISTRY_PASSWORD 镜像仓库密码
  • kube_config kubeconfig的编码字符串

kubeconfig的编码字符串的生成:

echo $(cat ~/.kube/config | base64) | tr -d " "

5. 编写.gitlab-ci.yml

编写.gitlab-ci.yml文件完成java demo源码项目的编译构建、镜像推送和应用部署。(可参考gitlabci-java-demo源码项目中的.gitlab-ci.yml.example)

.gitlab-ci.yml示例:

image: docker:stable
stages:
  - package
  - docker_build
  - deploy_k8s
variables:
  KUBECONFIG: /etc/deploy/config
mvn_build_job:
  image: registry.cn-beijing.aliyuncs.com/codepipeline/public-blueocean-codepipeline-slave-java:0.1-63b99a20
  stage: package
  tags:
    - k8s-runner
  script:
    - mvn package -B -DskipTests
    - cp target/demo.war /opt/cache
docker_build_job:
  image: registry.cn-beijing.aliyuncs.com/codepipeline/public-blueocean-codepipeline-slave-java:0.1-63b99a20
  stage: docker_build
  tags:
    - k8s-runner
  script:
    - docker login -u $REGISTRY_USERNAME -p $REGISTRY_PASSWORD registry.cn-beijing.aliyuncs.com
    - mkdir target
    - cp /opt/cache/demo.war target/demo.war
    - docker build -t registry.cn-beijing.aliyuncs.com/gitlab-demo/java-demo:$CI_PIPELINE_ID .
    - docker push registry.cn-beijing.aliyuncs.com/gitlab-demo/java-demo:$CI_PIPELINE_ID
deploy_k8s_job:
  image: registry.cn-beijing.aliyuncs.com/codepipeline/public-blueocean-codepipeline-slave-java:0.1-63b99a20
  stage: deploy_k8s
  tags:
    - k8s-runner
  script:
    - mkdir -p /etc/deploy
    - echo $kube_config |base64 -d > $KUBECONFIG
    - sed -i "s/IMAGE_TAG/$CI_PIPELINE_ID/g" deployment.yaml
    - cat deployment.yaml
    - kubectl apply -f deployment.yaml

.gitlab-ci.yml定义了一个Pipeline, 分三个阶段步骤执行:

image: docker:stable  # Pipeline中各个步骤阶段的构建镜像没有指定时, 默认使用docker:stable镜像
stages:
  - package                # 源码打包阶段
  - docker_build         # 镜像构建和打包阶段
  - deploy_k8s           # 应用部署阶段
variables:
  KUBECONFIG: /etc/deploy/config   # 定义全局变量KUBECONFIG

maven源码打包阶段:

mvn_build_job:     # job名称
  image: registry.cn-beijing.aliyuncs.com/codepipeline/public-blueocean-codepipeline-slave-java:0.1-63b99a20  # 本阶段构建使用的构建镜像
  stage: package      # 关联的阶段名称
  tags:                     # GitLab Runner的tag
    - k8s-runner
  script:
    - mvn package -B -DskipTests  # 执行构建脚本
    - cp target/demo.war /opt/cache   # 构建物保存至缓存区

镜像构建和发布阶段:

docker_build_job:  # job名称, 已挂载docker.sock
  image: registry.cn-beijing.aliyuncs.com/codepipeline/public-blueocean-codepipeline-slave-java:0.1-63b99a20 # 本阶段构建使用的构建镜像
  tags:                      # GitLab Runner的tag
    - k8s-runner
  script:
    - docker login -u REGISTRY_USERNAME -p $REGISTRY_PASSWORD registry.cn-beijing.aliyuncs.com   # 登录镜像仓库
    - mkdir target
    - cp /opt/cache/demo.war target/demo.war
    - docker build -t registry.cn-beijing.aliyuncs.com/gitlab-demo/java-demo:$CI_PIPELINE_ID .     # 打包docker镜像,使用的tag为本次pipeline的id
    - docker push registry.cn-beijing.aliyuncs.com/gitlab-demo/java-demo:$CI_PIPELINE_ID      # 推送docker镜像

应用部署阶段:

deploy_k8s_job:   # job名称
  image: registry.cn-beijing.aliyuncs.com/codepipeline/public-blueocean-codepipeline-slave-java:0.1-63b99a20   # 本阶段构建使用的构建镜像
  stage: deploy_k8s   # 关联的阶段名称
  tags:                      # GitLab Runner的tag
    - k8s-runner
  script:
    - mkdir -p /etc/deploy
    - echo $kube_config |base64 -d > $KUBECONFIG   # 配置连接Kubernetes集群的config文件
    - sed -i "s/IMAGE_TAG/$CI_PIPELINE_ID/g" deployment.yaml  # 动态替换部署文件中的镜像tag
    - kubectl apply -f deployment.yaml

6. 执行pipeline

提交.gitlab-ci.yml文件后,Project gitlab-java-demo会自动检测到这个文件并自行pipeline, 如图:
image

image

7. 访问服务

如果部署文件中没有指定namespace, 则默认会部署到gitlab命名空间下:

$ kubectl -n gitlab get svc 
NAME        TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
java-demo   LoadBalancer   172.19.9.252   xx.xx.xx.xx   80:32349/TCP   1m

浏览器访问 xx.xx.xx.xx/demo 进行验证

了解更多阿里云容器服务内容,请访问 https://www.aliyun.com/product/containerservice
了解更多GitLab CI的内容,请访问 https://docs.gitlab.com/runner/

相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
6月前
|
Kubernetes 监控 Cloud Native
关于容器服务 Kubernetes 版 ACK的介绍
【4月更文挑战第8天】容器服务 Kubernetes 版 ACK
522 0
关于容器服务 Kubernetes 版 ACK的介绍
|
3月前
|
Kubernetes jenkins 持续交付
Kubernetes CI/CD 集成:持续交付的最佳实践
【8月更文第29天】随着微服务架构和容器化的普及,Kubernetes 成为了运行容器化应用的事实标准。为了确保应用能够快速迭代并稳定发布,持续集成/持续部署(CI/CD)流程变得至关重要。本文将介绍如何将 Kubernetes 集成到 CI/CD 流程中,并提供一些最佳实践。
260 1
|
3月前
|
缓存 测试技术 网络安全
gitlab ci cd 不完全指南
gitlab ci cd 不完全指南
106 1
|
2月前
|
Docker 容器
Docker安装Gitlab和Gitlab-Runner并实现项目CICD
Docker安装Gitlab和Gitlab-Runner并实现项目CICD
|
4月前
|
Kubernetes Cloud Native 持续交付
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
|
3月前
|
Kubernetes Cloud Native 开发者
基于 K8s 做应用发布的工具选择:Tekton,一颗璀璨的CI/CD新星!
【8月更文挑战第8天】在众多Kubernetes应用发布工具中,阿里巴巴为何青睐Tekton?Tekton“以应用为中心”的设计理念与阿里巴巴的技术哲学相契合,不仅关注代码构建部署,还覆盖应用全生命周期管理,完美融入阿里巴巴业务场景。Tekton提供灵活工作流定义、多平台支持及与Kubernetes生态无缝集成等功能,满足阿里巴巴复杂业务需求的同时赋予开发者更多灵活性。作为CNCF毕业项目,Tekton拥有活跃社区和不断壮大的生态系统,为阿里巴巴技术演进提供坚实基础。综上所述,阿里巴巴选择Tekton是一个深思熟虑且具前瞻性的决策。
92 0
|
5月前
|
Kubernetes Ubuntu jenkins
超详细实操教程!在现有K8S集群上安装JenkinsX,极速提升CI/CD体验!
超详细实操教程!在现有K8S集群上安装JenkinsX,极速提升CI/CD体验!
|
6月前
|
存储 Kubernetes 监控
容器服务 Kubernetes 版 ACK功能特性
分布式云容器平台ACK One(Distributed Cloud Container Platform for Kubernetes)是阿里云面向混合云、多集群、分布式计算、容灾等场景推出的企业级云原生平台。ACK One可以连接并管理您任何地域、任何基础设施上的Kubernetes集群,并提供一致的管理和社区兼容的API,支持对计算、网络、存储、安全、监控、日志、作业、应用、流量等进行统一运维
208 1
|
3月前
|
Shell Docker 容器
GitlabCI学习笔记之一:安装Gitlab和GitLabRunner
GitlabCI学习笔记之一:安装Gitlab和GitLabRunner
|
4月前
|
Devops 持续交付 开发工具
入职必会-开发环境搭建54-GitLab下载和安装
GitLab 是一个基于 web 的 Git 仓库管理工具,提供了代码托管、版本控制、协作开发、持续集成等功能,是一个综合的 DevOps 平台。用户可以使用 GitLab 托管他们的代码仓库,并利用其丰富的功能来管理和协作开发项目。 以下是 GitLab 的一些主要特点和功能。
入职必会-开发环境搭建54-GitLab下载和安装

相关产品

  • 容器计算服务
  • 容器服务Kubernetes版