乐趣区

阿里云Kubernetes服务上从零搭建GitLabJenkinsGitOps应用发布模型的实践全纪录

关于 GitOps 的介绍,可以参考 GitOps:Kubernetes 多集群环境下的高效 CICD 实践

1. 在 容器服务控制台 创建 kubernetes 集群

1.1 新建 Kubernetes 集群:

1.2 新建命名空间 gitops

我们将会把 gitlab 和 jenkins 全部部署到此命名空间下

2. 创建 GitLab 应用(可选项,可以对接已有 GitLab 环境)

容器服务控制台上依次点击 市场  ->  应用目录 -> gitlab-ce :

在 参数 中设置 externalUrl 和 gitlabRootPassword 后选择 gitops 命名空间并创建应用,本次实践中 externalUrl 设置为 http://ls-gitlab.example.com/, 如果没有 dns 解析的话,可以在创建成功后直接使用 ip

容器服务控制台上依次点击 路由与负载均衡  ->  服务 查看 gitlab 应用的访问地址,大约 2 分钟后可访问 gitlab 并登陆:

3. 设置 GitLab 并上传示例源码项目

3.1 新建 private group application

创建 private group application:

3.2 新建并上传 private project application-demo

创建 private project application-demo,示例源码地址:

https://code.aliyun.com/haoshuwei/application-demo.git

从 master 新建一个分支 latest:

设置 master 和 latest 分支只有管理员才能 merge 和 push 代码的操作:

3.3 新建 private group builds

3.4 新建并上传 private project preview-pipeline staging-pipeline production-pipeline

preview-pipeline 示例源码地址为:

https://code.aliyun.com/haoshuwei/preview-pipeline.git

staging-pipeline 示例源码地址为:

https://code.aliyun.com/haoshuwei/staging-pipeline.git

production-pipeline 示例源码地址为:

https://code.aliyun.com/haoshuwei/production-pipeline.git

上传 3 个构建项目之前需要替换以下字段:
IMAGE_REPO:  应用容器镜像要上传到哪个镜像仓库,镜像仓库地址
dingTalkToken:钉钉通知所使用的钉钉机器人 accessToken
Fetch Git Repo -> credentialsId : 用于 Jenkins 拉取 git 项目的证书名称,需要在 Jenkins 中创建名为 gitlab 的证书
Fetch Git Repo -> url : Jenkins 拉取 git repo 的 url

preview-pipeline:

staging-pipeline

production-pipeline

3.5 注册一个普通开发者用户 developer

管理员用户登录后将 developer 用户添加为 application 组的 developer member:

此时 developer 用户只有 application 组下 projects 的权限,没有 builds 组的权限:

3.6 生成一个 apiToken 用于 Jenkins 配置 gitlabConnection

生成并复制保存 apiToken:

4. 创建 Jenkins 应用

容器服务控制台上依次点击 市场  ->  应用目录 -> jenkins:

在 参数 中设置 Master.AdminPassword 的值,并更改 rbac.install 的值为 true,选择 gitops 命名空间后点击创建:

容器服务控制台上依次点击 路由与负载均衡  ->  服务 查看 jenkins 应用的访问地址,大约 1 分钟后可访问 jenkins 并登陆:

5. 配置 Jenkins 并创建构建任务

5.1 配置 gitlabConnection

系统管理 -> 系统设置 -> Gitlab:

配置完毕后点击 Save 保存。

5.2 新建构建任务 preview-pipeline

5.2.1 新建任务,输入名称选择流水线类型并点击创建:

5.2.2 Build Triggers 区域勾选 GitLab 插件配置如图所示:

点击 Advanced 进行高级选项配置如图所示:

复制并保存 GitLab webhook URL 和 Secret token 的值用于在 Gitlab 上配置 webhook。

5.2.3 Pipeline 区域配置 preview-pipeline 构建项目的 git repo

完成配置后点击 保存。

5.3 新建构建任务 staging-pipeline

5.3.1 新建任务,输入名称选择流水线类型并点击创建:

5.3.2 Build Triggers 区域勾选 GitLab 插件配置如图所示:

点击 Advanced 进行高级选项配置如图所示:

复制并保存 GitLab webhook URL 和 Secret token 的值用于在 Gitlab 上配置 webhook。

5.3.3 Pipeline 区域配置 staging-pipeline 构建项目的 git repo

完成配置后点击 保存。

5.4 新建构建任务 production-pipeline

5.4.1 新建任务,输入名称选择流水线类型并点击创建:

5.4.2 Build Triggers 区域勾选 GitLab 插件配置如图所示:

点击 Advanced 进行高级选项配置如图所示:

复制并保存 GitLab webhook URL 和 Secret token 的值用于在 Gitlab 上配置 webhook。

5.4.3 Pipeline 区域配置 production-pipeline 构建项目的 git repo

完成配置后点击 保存。

5.5 创建 docker registry auth secret:

$ docker login registry.cn-hangzhou.aliyuncs.com
$ kubectl -n gitops create secret generic jenkins-docker-cfg  --from-file=/root/.docker/config.json

5.6 创建 clusterrolebinding 授予 serviceaccount default 对 gitops 命名空间的管理权限

clusterrolebinding.yaml:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: gitops-cluster-admin
subjects:
  - kind: ServiceAccount
    name: default
    namespace: gitops
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
$ kubectl create -f clusterrolebinding.yaml

5.7 设置匿名用户的可读权限

系统管理 -> 全局安全管理 -> Authorization -> 勾选 Allow anonymous read access 并保存:

6. 配置 GitLab webhook

进入 application-demo 项目的 webhook 配置页面:

6.1 配置触发 jenkins job preview-pipeline 的触发器

所图所示:

6.2 配置触发 jenkins job staging-pipeline 的触发器

所图所示:

6.3 配置触发 jenkins job production-pipeline 的触发器

所图所示:

7. GitOps 模型发布应用

7.1 developer 用户做以下操作

7.1.1 在 application-demo 项目上新建一个开发分支 features/change-index-1

7.1.2 修改 src/main/resources/static/index.html 中的 kubernetes.svg 为 jenkins.svg 并提交修改

7.1.3 创建请求合并到 latest 分支的 Merge Request

Open MergeRequest 的动作会触发 jenkins job preview-pipeline 的自动构建,并完成以下 stages:
(1)拉取 http://xxx.xxx.xxx/builds/preview-pipeline.git 项目并按照 Jenkins 定义的内容继续执行以下内容
(2)Fetch Git Repo:拉取应用源码项目 http://xxx.xxx.xxx.xxx/application/application-demo.git
(3)Maven Build:打包
(4)Maven Test:测试
(5)Docker Build And Publish:docker 镜像构建和推送
(6)Kubectl Deploy:部署应用到 Kubernetes 集群(本示例使用的是本集群的一个动态创建的命名空间 preview-xxx)
(7)Post Actions:钉钉通知

developer 可以查看 Merge Request 页面的内容

点击可跳转至 jenkins 构建日志:

7.1.4 构建完成后可以看到一个 application-demo 应用的预览页面

点击预览应用:

也可以直接在钉钉群里查看应用访问链接等信息:

7.1.5 应用预览验证后,developer 可以申请管理员接受此合并

7.2 管理员合并指向 latest 分支的 MergeRequest

合并 MR:

Accept MR 的动作或触发 staging-pipeline 的构建,拉取 application-demo 项目的 latest 分支代码并构建和部署到 staging 命名空间下

查看钉钉通知并访问 staging 环境中的 application-demo 应用:

7.3 管理员创建 latest 到 master 分支的 Merge Request 并合并此指向 master 的 Merge Request

Accept MR 的动作或触发 production-pipeline 的构建,拉取 application-demo 项目的 master 分支代码并构建和部署到 production 命名空间下

查看钉钉通知并访问 production 环境中的 application-demo 应用:


本文作者:流生

阅读原文

本文为云栖社区原创内容,未经允许不得转载。

退出移动版