阿里云容器服务Kubernetes之Jenkins X(2)-自动化CICD实践篇

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文主要演示基于阿里云容器服务Kubernetes和Jenkins-X-Platform创建、构建和发布一个Spring Boot应用。

在云栖博客 阿里云容器服务Kubernetes之Jenkins X(1)-安装部署实践篇 中, 我们基于 阿里云r容器服务Kubernetes 搭建了自己的Jenkins-X-Platform, 本文将以一个Spring Boot应用为例继续演示如何使用Jenkins-X-Platform构建、发布和管理自己的应用。

在创建Spring Boot应用之前, 还需要对Jenkins-X-Platform引擎做一些定制化配置:

1. 给多分支流水线任务添加访问GitHub的凭证

登录 http://jenkins.jx.aliyunk8s.com ,用户名admin, 密码可以在 ~/.jx/jenkinsAuth.yaml 文件中查看。 登录成功后会看到Jenkins-X-Platform默认会创建两个多分支流水线项目 environment-sharkplanet-staging 和 environment-sharkplanet-production, 它们分别负责不同环境下的应用发布和管理。此时两个任务的扫描构建都处于Pending状态:
image

构建日志为:
image

创建并配置访问GitHub的凭证:
image
image

保存并重新执行扫描构建:
image

2. 进入 系统管理-> 系统配置,更改Kubernetes云配置

(1)找到 “Disable https certificate check” 选项并勾选
image
(2)找到Labels为jenkins-maven的Kubernetes Pod Template并确认Docker image使用了最新的构建镜像jenkinsxio/builder-maven:latest, 否则会在应用构建时报错“Error: unknown command "build" for "skaffold"”
image
image

3. 创建configmaps “jenkins-x-docker-registry”

此步骤的更改是为了避免创建应用时有如下报错:

error: Could not find ConfigMap jenkins-x-docker-registry in namespace jx: configmaps "jenkins-x-docker-registry" not found

从jenkins-x-docker-registry-config 导出编排文件:

# kubectl get configmaps -n jx
NAME                               DATA      AGE
exposecontroller                   1         15h
ingress-config                     5         15h
jenkins                            6         15h
jenkins-tests                      1         15h
jenkins-x-docker-registry-config   1         15h
jenkins-x-git-kinds                2         15h
jenkins-x-monocular-api-config     1         15h
jenkins-x-monocular-ui-config      1         15h
jenkins-x-monocular-ui-vhost       1         15h
jx-install-config                  2         15h
# kubectl get configmaps jenkins-x-docker-registry-config  -n jx --export -o yaml > jenkins-x-docker-registry.yaml

修改名称并创建:

%s/jenkins-x-docker-registry-config/jenkins-x-docker-registry/
# kubectl create -f jenkins-x-docker-registry.yaml
configmap/jenkins-x-docker-registry created
4. 创建Spring Boot应用

查看当前环境中的应用列表:

# jx get apps
No applications found in environments staging, production

创建Spring应用, 此步骤会自动生成一个git repo并推送至GitHub, 在Jenkins上生成与之对应的多分支流水线任务,最后生成webhook指向多分支流水线任务:
image

如果有报错信息如下, 则需要安装jdk:

...
The JAVA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
NB: JAVA_HOME should point to a JDK not a JRE exit status 1
5. 修改webhook

在GitHub上查看jenkins-x-demo、environment-sharkplanet-staging和environment-sharkplanet-production三个项目的webhook:
image

GitHub是无法解析jenkins.jx.aliyunk8s.com这个域名的, 在后续构建中用到这个webhook的地方就会报错, 我们需要做一些修改:

# kubectl edit svc jenkins -n jx

把“type: CLusterIP” 改为“type: LoadBalancer”, 保存退出后在容器服务Kubernetes控制台上查看jenkins服务的外部端点:
image
修改webhook的 Payload URL并保存。

6. 多分支流水线jenkins-x-demo的构建

应用创建完毕后,会自动进行多分支流水线jenkins-x-demo的构建:
image

查看构建日志发现有报错,先点击“Abort”终止此次构建:
image

此处报错为docker镜像构建和推送问题, 我们这里配置使用 阿里云容器镜像服务 来管理,本次实践构建的镜像url为:registry.cn-hangzhou.aliyuncs.com/xxx/jenkins-x-demo步骤如下:
(1)进入 系统管理->系统设置->全局属性,勾选环境变量并增加键值对:
image
(2)生成docker auth secret

[root@iZj6cenjoxeycpx4qfdqmkZ ~]# docker login -u xxx -p xxx registry.cn-hangzhou.aliyuncs.com
Login Succeeded
# kubectl get secret -n jx
NAME                               TYPE                                  DATA      AGE
cleanup-token-wvhp8                kubernetes.io/service-account-token   3         1d
default-token-zx5p8                kubernetes.io/service-account-token   3         1d
expose-token-qkw5l                 kubernetes.io/service-account-token   3         1d
jenkins                            Opaque                                3         1d
jenkins-docker-cfg                 Opaque                                1         21h
jenkins-git-credentials            Opaque                                1         1d
jenkins-git-ssh                    Opaque                                2         1d
jenkins-hub-api-token              Opaque                                1         1d
jenkins-maven-settings             Opaque                                1         1d
jenkins-npm-token                  Opaque                                1         1d
jenkins-release-gpg                Opaque                                4         1d
jenkins-ssh-config                 Opaque                                1         1d
jenkins-token-t2n4j                kubernetes.io/service-account-token   3         1d
jenkins-x-chartmuseum              Opaque                                2         1d
jenkins-x-docker-registry-secret   Opaque                                1         1d
jenkins-x-mongodb                  Opaque                                2         1d
jx-basic-auth                      Opaque                                1         1d
jx-install-config                  Opaque                                3         1d
jx-pipeline-git-github-github      Opaque                                2         1d
nexus                              Opaque                                1         1d
pipelinecontroller-token-tpbkj     kubernetes.io/service-account-token   3         1d
# kubectl delete secrets jenkins-docker-cfg -n jx
secret "jenkins-docker-cfg" deleted
# kubectl create secret generic jenkins-docker-cfg -n jx --from-file=/root/.docker/config.json
secret/jenkins-docker-cfg created

jenkins-x-demo应用会成功构建Helm Charts并发布到chartmuseum,
访问 http://monocular.jx.aliyunk8s.com 可以看到新增加了jenkins-x-demo的chart:
image

继续查看jenkins-x-demo的构建日志:
image

流水线会创建一个environment-sharkplanet-staging项目的PRhttps://github.com/haoshuwei/environment-sharkplanet-staging/pull/1, merge PR后, promotion动作执行成功:
image

7. 查看和访问应用
jx get apps
APPLICATION    STAGING PODS URL                                            PRODUCTION PODS URL
jenkins-x-demo 0.0.3   1/1  http://jenkins-x-demo.jx-staging.aliyunk8s.com

绑定hosts后访问http://jenkins-x-demo.jx-staging.aliyunk8s.com
image

8. 开发jenkins-x-demo 应用并新增一个页面

步骤7中访问的应用并没有准备好发布到生产环境下, 在发布到生产环境之前,我们需要先对其进行开发和测试。

新建一个分支:

# git checkout -b feature
切换到一个新分支 'feature'
# cat src/main/resources/static/index.html
<html>
  <head>
    <title> Jenkins X Spring Demo </title>
  </head>
  <body bgcolor=white>

    <table border="0" cellpadding="10">
      <tr>
        <td>
          <img height="300" width="300" src="https://github.com/jenkins-x/jenkins-x-website/raw/e5aae999166a67d6220aa469eed1f23e0996c1f7/images/logo.png">
        </td>
        <td>
          <h1>Jenkins X Spring Demo</h1>
        </td>
      </tr>
    </table>
  </body>

</html>

保存并提交:

# git add src
# git commit -m "add index.html"
[feature 5853790] add index.html
 1 file changed, 19 insertions(+)
 create mode 100644 src/main/resources/static/index.html
# git push origin feature
Counting objects: 11, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.

在GitHub上创建feature分支到master分支的PR:
image
PR创建成功后,会通过webhook触发流水线构建:
image
流水线构建成功后会为这个PR的jenkins-x-demo应用创建预览环境haoshuwei-jenkins-x-demo-pr-1并部署应用, 点击"here" 访问(注意绑定hosts):
image

image

9. 更新staging环境下的jenkins-x-demo应用

步骤8中我们验证新PR下的应用没问题后,就可以在GitHub上merge PR到master分支:
image
查看当前staging环境下jenkins-x-demo应用版本为0.0.3:

# jx get apps
APPLICATION    STAGING PODS URL                                            PRODUCTION PODS URL
jenkins-x-demo 0.0.3   1/1  http://jenkins-x-demo.jx-staging.aliyunk8s.com

合并PR后会自动触发新的流水线构建, 构建成功后再查看staging环境下jenkins-x-demo应用版本变为0.0.4:

# jx get apps
APPLICATION    STAGING PODS URL                                            PRODUCTION PODS URL
jenkins-x-demo 0.0.4        http://jenkins-x-demo.jx-staging.aliyunk8s.com

helm charts仓库也有新版本的更新:
image

可以再次访问 http://jenkins-x-demo.jx-staging.aliyunk8s.com/ 进行验证。

10. 发布应用到生产环境

步骤9中我们更新了staging环境下的jenkins-x-demo应用版本并验证没问题后, 就可以发布到生产环境中:

# git checkout master
切换到分支 'master'
# jx promote --version 0.0.4 --env production --timeout 20m
Using helmBinary helm with feature flag: none
Promoting app jenkins-x-demo version 0.0.4 to namespace jx-production

image

构建成功后查看应用信息:

# jx get apps
APPLICATION    STAGING PODS URL                                            PRODUCTION PODS URL
jenkins-x-demo 0.0.4   1/1  http://jenkins-x-demo.jx-staging.aliyunk8s.com 0.0.4           http://jenkins-x-demo.jx-production.aliyunk8s.com

可以看到生产环境下的应用访问url为: http://jenkins-x-demo.jx-production.aliyunk8s.com
访问 http://jenkins-x-demo.jx-production.aliyunk8s.com (注意hosts绑定):
image

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
5天前
|
消息中间件 运维 Kubernetes
构建高效自动化运维体系:Ansible与Kubernetes的融合实践
【5月更文挑战第9天】随着云计算和微服务架构的普及,自动化运维成为确保系统可靠性和效率的关键。本文将深入探讨如何通过Ansible和Kubernetes的集成,构建一个强大的自动化运维体系。我们将分析Ansible的配置管理功能以及Kubernetes容器编排的优势,并展示如何将二者结合,以实现持续部署、快速扩展和高效管理现代云原生应用。文章还将涵盖实际案例,帮助读者理解在真实环境下如何利用这些工具优化运维流程。
|
1天前
|
运维 Kubernetes Serverless
阿里云容器服务
小陈在大刘的指导下学习Kubernetes,发现搭建和维护Kubernetes集群有一定难度。大刘建议小陈考虑使用阿里云的容器服务ACK,它基于Kubernetes,但进行了云原生优化,简化了集群管理和运维工作。ACK有三种形态:专有版、托管版和Serverless版。小陈认为ACK Serverless更适合,因为它无需运维,开箱即用,适合专注于业务开发。ACK Serverless基于弹性容器实例ECI,提供无服务器的容器运行环境,支持Kubernetes兼容,降低了使用门槛。
|
5天前
|
存储 运维 Kubernetes
构建高效自动化运维体系:Ansible与Kubernetes的协同实践
【5月更文挑战第2天】随着云计算和微服务架构的兴起,自动化运维成为保障系统稳定性与效率的关键。本文将深入探讨如何利用Ansible作为配置管理工具,结合Kubernetes容器编排能力,共同打造一个高效、可靠的自动化运维体系。通过剖析二者的整合策略及具体操作步骤,为读者提供一套提升运维效率、降低人为错误的实用解决方案。
|
5天前
|
存储 运维 Kubernetes
构建高效自动化运维体系:Ansible与Kubernetes的协同策略
【4月更文挑战第29天】 在当今快速迭代的软件开发环境中,自动化运维成为了确保部署效率和稳定性的关键。本文深入探讨了如何通过Ansible和Kubernetes的集成来实现高效的自动化配置管理与容器编排。文章首先介绍了Ansible与Kubernetes各自的特点及优势,随后详细阐述了它们在自动化运维中的互补作用,并提供了一个实用的集成方案。通过案例分析,验证了该策略在提高部署速度、降低人为错误以及增强系统可靠性方面的有效性。最后,讨论了实施过程中可能遇到的挑战和解决思路。
|
5天前
|
运维 Kubernetes 安全
构建高效自动化运维体系:Ansible与Kubernetes的协同实践
【4月更文挑战第29天】 在当今快速迭代的软件发布周期中,自动化已成为维护大规模服务部署的关键。本文聚焦于将Ansible和Kubernetes结合使用,构建一个灵活、可扩展的自动化运维体系。通过分析两者的技术特性及互补优势,我们将探讨如何优化配置管理流程,实现持续集成和持续部署(CI/CD),并确保系统的稳定性与安全性。此研究不仅为读者提供一套行之有效的运维解决方案,同时也为未来运维技术的发展提供了参考方向。
|
5天前
|
运维 Kubernetes 监控
构建高效自动化运维体系:Ansible与Kubernetes的完美结合
【4月更文挑战第29天】 在当今快速迭代的IT环境中,自动化已成为提高运维效率、减少人为错误的关键。本文将探讨如何通过Ansible和Kubernetes的结合来构建一个高效的自动化运维体系。文章首先分析了Ansible作为配置管理工具的优势,然后讨论了Kubernetes在容器编排领域的领导地位,最后详细阐述了如何将两者融合以实现更灵活、可扩展的自动化策略。
|
5天前
|
运维 Serverless API
Serverless 应用引擎产品使用之在阿里云函数计算中,容器运行过程中的最大内存使用量获取如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
43 2
|
5天前
|
运维 Kubernetes 负载均衡
构建高效自动化运维体系:基于Docker和Kubernetes的实践指南
【4月更文挑战第28天】随着云计算和微服务架构的普及,自动化运维已成为提升系统稳定性、效率及快速响应市场变化的关键。本文将探讨如何利用容器化技术Docker和容器编排工具Kubernetes来构建一个高效、可扩展的自动化运维体系。我们将分析该技术栈的优势,并通过一系列实践案例,展示如何优化现有的运维流程,实现资源的最大化利用和风险的有效控制。
|
5天前
|
运维 IDE Serverless
Serverless 应用引擎产品使用之阿里函数计算中,阿里云容器镜像服务(Container Registry)中创建自定义镜像,然后将其部署到FC上如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
31 0
|
5天前
|
人工智能 边缘计算 Kubernetes
阿里云边缘容器云帮助AI推理应用快速落地
2024全球分布式云大会·北京站,阿里云徐若晨演讲内容分享
32 0

相关产品

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