开发者社区> 流生> 正文

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

简介: 本文主要演示如何在阿里云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/

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云容器Kubernetes监控(一) - 资源监控
简介 容器通过集装箱式的编译、打包、部署,大大提高了应用的迭代速度。对于架构师而言,容器带来的是分钟级的部署、秒级的伸缩与恢复、一个量级的迭代速度提升、50%左右的基础成本节省。但是对于落地实施容器的开发者而言。
6299 0
阿里云Kubernetes容器服务上体验Knative
Knative Serving是一种可缩放至零、请求驱动的计算运行环境,构建在 Kubernetes 和 Istio 之上,支持为 serverless 应用、函数提供部署与服务。Knative Serving的目标是为Kubernetes提供扩展功能,用于部署和运行无服务器工作负载。
5075 0
阿里云服务器上利用IIS部署.net网站(windows server2012r2系统)
本文介绍了在在一台新的阿里云服务器(windows server2012r系统)上,利用IIS发布net网站的教程,分享给大家。(还有代金券礼包领取,希望大家有所帮助)具体如下: 1.添加站点(1)创建连接池 (2)添加网站 添加网站这里,需要注意上图中这个画框的这个位置,ip地址这里,不要填 服务器的 公有ip地址 ,而是直接按照默认的写 全部未分配 ,端口这里,服务器的默认端口只有 80 。
4085 0
阿里云容器服务Kubernetes实现应用自动部署
## 前言 CICD是研发效率提升必不可少的一环, 要提高迭代效率,就要减少开发到部署中等待和人工操作的时间与步骤。 通过容器以及周边产品集成,我们更能将代码开发完成到部署时间极大缩短, 并将一切手工操作自动化。
5432 0
CICD联动阿里云容器服务Kubernetes实践之CodePipeline篇
通过CodePipeline可以构建您的代码工作流模板,配置从应用编译到容器镜像构建和推送,再到Kubernetes应用的发布,打通代码应用发布全过程自动化。
3451 0
阿里云容器服务团队实践——Alluxio优化数倍提升云上Kubernetes深度学习训练性能
近些年,以深度学习为代表的人工智能技术取得了飞速的发展,正落地应用于各行各业。越来越多的用户在云上构建人工智能训练平台,利用云平台的弹性计算能力满足高速增长的AI业务模型训练方面的需求,然而这种“本地存储+云上训练”的训练模式加剧了计算存储分离架构带来的远程数据访问的性能影响。
3634 0
asp.net core webapi 使用ef 对mysql进行增删改查,并生成Docker镜像构建容器运行
1.构建运行mysql容器,添加数据库user 参考Docker创建运行多个mysql容器,地址 http://www.cnblogs.com/heyangyi/p/9288402.html 添加user数据库,添加tbusers表 2.
2549 0
使用阿里云容器服务Kubernetes实现蓝绿发布功能
背景 在发布应用时,经常需要先上线一个新版本,用较小的流量去测试一下该新版本的可用性。但是Kubernets的ingress resource 并没有实现流量控制与切分的功能,导致针对同一个域名下的路径,只能有一个service来进行服务。
9282 0
容器日志采集利器Log-Pilot
容器时代越来越多的传统应用将会逐渐容器化,而日志又是应用的一个关键环节,那么在应用容器化过程中,如何方便快捷高效地来自动发现和采集应用的日志,如何与日志存储系统协同来高效存储和搜索应用日志,本文将主要跟大家分享下如何通过Log-Pilot来采集容器的标准输出日志和容器内文件日志。
15507 0
【转载】CodePipeline联动容器的DevOps实践
在推出容器服务之后,阿里云研发了开源持续交付工具CodePipeline,它提供多种语言的持续交付向导模板,通过模板快速填写进行持续集成,从而实现多平台、多环境的持续交付。
1967 0
+关注
57
文章
0
问答
来源圈子
更多
容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级 Kubernetes 容器化应用的全生命周期管理。容器服务 Kubernetes 版简化集群的搭建和扩容等工作,整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳的 Kubernetes 容器化应用运行环境。
+ 订阅
相关文档: 容器镜像服务 ACR 容器服务 ACK 服务网格 ASM
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载