Jenkinsfile in SCM 意为将 Jenkinsfile 文件本身作为源代码管理 (Source Control Management) 的一部分,根据该文件内的流水线配置信息快速构建工程内的 CI/CD 功能模块,比如阶段 (Stage),步骤 (Step) 和任务 (Job)。因此,在代码仓库中应包含 Jenkinsfile。

目的

本示例演示如何通过 GitHub 仓库中的 Jenkinsfile 来创建流水线,流水线共包括 8 个阶段,最终将演示示例部署到 KubeSphere 集群中的开发环境和生产环境且能够通过公网访问。 仓库中的 dependency 分支为缓存测试用例,测试方式与 master 分支类似,对 dependency 的多次构建可体现出利用缓存可以有效的提升构建速度。

前提条件

视频教程

预估时间

30-50 分钟 (时间由于环境的网速等因素而有所不同) 。

操作示例

流水线概览

下面的流程图简单说明了流水线完整的工作过程:

SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER$BUILD_NUMBER

创建凭证

注意:

  • GitHub 账号或密码带有 "@" 这类特殊字符,需要创建凭证前对其进行 urlencode 编码,可通过一些 第三方网站进行转换,然后再将转换后的结果粘贴到对应的凭证信息中。
  • 这里需要创建的是凭证(Credential),不是密钥(Secret)。

在 多租户管理快速入门 中已给项目普通用户 project-regular 授予了 maintainer 的角色,因此使用 project-regular 登录 KubeSphere,进入已创建的 devops-demo 工程,开始创建凭证。

1、本示例代码仓库中的 Jenkinsfile 需要用到 DockerHub、GitHubkubeconfig (kubeconfig 用于访问接入正在运行的 Kubernetes 集群) 等一共 3 个凭证 (credentials) ,参考 创建凭证 依次创建这三个凭证。

2、然后参考 访问 SonarQube 并创建 Token,创建一个 Java 的 Token 并复制。

devops-demo秘密文本

至此,4 个凭证已经创建完成,下一步需要在示例仓库中的 jenkinsfile 修改对应的四个凭证 ID 为用户自己创建的凭证 ID。

修改 Jenkinsfile

第一步:Fork项目

登录 GitHub,将本示例用到的 GitHub 仓库 devops-java-sample Fork 至您个人的 GitHub。

第二步:修改 Jenkinsfile

1、Fork 至您个人的 GitHub 后,在 根目录 进入 Jenkinsfile-online

jenkins-online

2、在 GitHub UI 点击编辑图标,需要修改如下环境变量 (environment) 的值。

image-20190409121802459

https://github.com/kubesphere/kubesphere
mastermvn-o

3、修改以上的环境变量后,点击 Commit changes,将更新提交到当前的 master 分支。

提交更新

dependencydependency

创建项目

kubesphere-sample-devkubesphere-sample-prod

第一步:创建第一个项目

project-admin
project-admin
kubesphere-sample-dev

2、本示例暂无资源请求和限制,因此高级设置中无需修改默认值,点击 创建,项目可创建成功。

第二步:邀请成员

project-adminproject-regularkubesphere-sample-devproject-regularoperator

第三步:创建第二个项目

kubesphere-sample-prodproject-regularkubesphere-sample-prodoperator
kubesphere-sample-devkubesphere-sample-prod

project

创建流水线

第一步:填写基本信息

1、进入已创建的 DevOps 工程,选择左侧菜单栏的 流水线,然后点击 创建

create-pipeline

2、在弹出的窗口中,输入流水线的基本信息。

  • 名称:为创建的流水线起一个简洁明了的名称,便于理解和搜索
  • 描述信息:简单介绍流水线的主要特性,帮助进一步了解流水线的作用
  • 代码仓库:点击选择代码仓库,代码仓库需已存在 Jenkinsfile

basic_info

第二步:添加仓库

1、点击代码仓库,以添加 Github 仓库为例。

2、点击弹窗中的 获取 Token。

git_input

Generate token

access-token

4、复制生成的 token,在 KubeSphere Token 框中输入该 token 然后点击保存。

5、验证通过后,右侧会列出此 Token 关联用户的所有代码库,选择其中一个带有 Jenkinsfile 的仓库。比如此处选择准备好的示例仓库 devops-java-sample,点击 选择此仓库,完成后点击 下一步

image-20190409122653070

第三步:高级设置

完成代码仓库相关设置后,进入高级设置页面,高级设置支持对流水线的构建记录、行为策略、定期扫描等设置的定制化,以下对用到的相关配置作简单释义。

丢弃旧的分支

说明:

分支设置的保留分支的天数和保持分支的最大个数两个选项可以同时对分支进行作用,只要某个分支的保留天数和个数不满足任何一个设置的条件,则将丢弃该分支。假设设置的保留天数和个数为 2 和 3,则分支的保留天数一旦超过 2 或者保留个数超过 3,则将丢弃该分支。默认两个值为 -1,表示将会丢弃已经被删除的分支。

丢弃旧的分支将确定何时应丢弃项目的分支记录。分支记录包括控制台输出,存档工件以及与特定分支相关的其他元数据。保持较少的分支可以节省 Jenkins 所使用的磁盘空间,我们提供了两个选项来确定应何时丢弃旧的分支:

  • 保留分支的天数:如果分支达到一定的天数,则丢弃分支。
  • 保留分支的个数:如果已经存在一定数量的分支,则丢弃最旧的分支。

2、行为策略中,KubeSphere 默认添加了三种策略。由于本示例还未用到 从 Fork 仓库中发现 PR 这条策略,此处可以删除该策略,点击右侧删除按钮。

advance

说明:

支持添加三种类型的发现策略。需要说明的是,在 Jenkins 流水线被触发时,开发者提交的 PR (Pull Request) 也被视为一个单独的分支。

发现分支:

  • 排除也作为 PR 提交的分支:选择此项表示 CI 将不会扫描源分支 (比如 Origin 的 master branch),也就是需要被 merge 的分支
  • 只有被提交为 PR 的分支:仅扫描 PR 分支
  • 所有分支:拉取的仓库 (origin) 中所有的分支

从原仓库中发现 PR:

  • PR 与目标分支合并后的源代码版本:一次发现操作,基于 PR 与目标分支合并后的源代码版本创建并运行流水线
  • PR 本身的源代码版本:一次发现操作,基于 PR 本身的源代码版本创建并运行流水线
  • 当 PR 被发现时会创建两个流水线,一个流水线使用 PR 本身的源代码版本,一个流水线使用 PR 与目标分支合并后的源代码版本:两次发现操作,将分别创建两条流水线,第一条流水线使用 PR 本身的源代码版本,第二条流水线使用 PR 与目标分支合并后的源代码版本

3、默认的 脚本路径Jenkinsfile,请将其修改为 Jenkinsfile-online

注:路径是 Jenkinsfile 在代码仓库的路径,表示它在示例仓库的根目录,若文件位置变动则需修改其脚本路径。

如果没有扫描触发,则定期扫描5 minutes

说明:定期扫描是设定一个周期让流水线周期性地扫描远程仓库,根据 行为策略 查看仓库有没有代码更新或新的 PR。

Webhook 推送:

Webhook 是一种高效的方式可以让流水线发现远程仓库的变化并自动触发新的运行,GitHub 和 Git (如 Gitlab) 触发 Jenkins 自动扫描应该以 Webhook 为主,以上一步在 KubeSphere 设置定期扫描为辅。在本示例中,可以通过手动运行流水线,如需设置自动扫描远端分支并触发运行,详见 设置自动触发扫描 - GitHub SCM。

完成高级设置后点击 创建

第四步:运行流水线

masterdependency
master
TAG_NAME: defaultValueTAG_NAME

3、点击 确定,将新生成一条流水线活动开始运行。

TAG_NAMEtag

运行流水线

至此,流水线 已完成创建并开始运行。

注:点击 分支 切换到分支列表,查看流水线具体是基于哪些分支运行,这里的分支则取决于上一步 行为策略 的发现分支策略。

查看流水线

第五步:审核流水线

inputdeploy to dev, push with tag, deploy to production3

审核流水线

input

查看流水线

活动

stage

查看日志

log

验证运行结果

代码质量

kubesphere-sample-devkubesphere-sample-prod
http://{$Virtual IP}:{$8080}http://{$内网/公网 IP}:{$30861}http://{$Virtual IP}:{$8080}http://{$内网/公网 IP}:{$30961}
kubesphere-sample-prod

进入该项目,在左侧的菜单栏点击 工作负载 → 部署,可以看到 ks-sample 已创建成功。正常情况下,部署的状态应该显示 运行中

sample

10.233.42.330961

查看服务

service

devops-java-sample

查看 DockerHub

releasev0.0.1push with tag

访问示例服务

若在内网环境访问部署的演示示例服务,可通过 SSH 登陆集群节点,或使用集群管理员登陆 KubeSphere 在 web kubectl 中输入以下命令验证访问,其中 Virtual IP 和节点端口 (NodePort) 可通过对应项目下的服务中查看:

验证 Dev 环境的示例服务

Virtual IP 在

验证 Prodcution 环境的示例服务

若两个服务都能访问成功,则说明流水线运行结果也是符合预期的。

提示:若需要在外网访问该服务,可能需要绑定公网 EIP 并配置端口转发和防火墙规则。在端口转发规则中将内网端口比如 30861 转发到源端口 30861,然后在防火墙开放这个源端口,保证外网流量可以通过该端口,外部才能够访问。例如在 QingCloud 云平台进行上述操作,则可以参考 云平台配置端口转发和防火墙。

至此,基于 GitHub 和 DockerHub 的一个 Jenkinsfile in SCM 类型的流水线已经完成了,若创建过程中遇到问题,可参考 常见问题。

devops缓存测试

dependencydependency
dependencyTAG_NAME

2、流水线开始运行,等待其构建完成。

可发现,第二次构建利用了第一次构建时缓存的依赖,无需再次进行依赖下载。