Jenkins BlueOcean

    同样的,我们可以使用上节课的方法直接把要构建的脚本配置在 Jenkins Web UI 界面中就可以,但是我们也提到过最佳的方式是将脚本写入一个名为 Jenkinsfile 的文件中,跟随代码库进行统一的管理。

    我们这里在之前的 git 库中新建一个 dev 分支,然后更改 main.go 的代码,打印当前运行的代码分支,通过环境变量注入进去,所以我们我们通过 k8s.yaml 文件的环境变量把当前代码分支注入进去,具体代码可以参考https://github.com/cnych/jenkins-demo/tree/dev

    然后新建一个 Jenkinsfile 文件,将上节课的构建脚本拷贝进来,但是我们需要对其做一些修改:(Jenkinsfile)

    在第一步中我们增加了checkout scm命令,用来检出代码仓库中当前分支的代码,为了避免各个环境的镜像 tag 产生冲突,我们为非 master 分支的代码构建的镜像增加了一个分支的前缀,在第五步中如果是 master 分支的话我们才增加一个确认部署的流程,其他分支都自动部署,并且还需要替换 k8s.yaml 文件中的环境变量的值。

    更改完成后,提交 dev 分支到 github 仓库中。

    BlueOcean

    我们这里使用 BlueOcean 这种方式来完成此处 CI/CD 的工作,BlueOcean 是 Jenkins 团队从用户体验角度出发,专为 Jenkins Pipeline 重新设计的一套 UI 界面,仍然兼容以前的 fressstyle 类型的 job,BlueOcean 具有以下的一些特性:

    • 连续交付(CD)Pipeline 的复杂可视化,允许快速直观的了解 Pipeline 的状态
    • 可以通过 Pipeline 编辑器直观的创建 Pipeline
    • 需要干预或者出现问题时快速定位,BlueOcean 显示了 Pipeline 需要注意的地方,便于异常处理和提高生产力
    • 用于分支和拉取请求的本地集成可以在 GitHub 或者 Bitbucket 中与其他人进行代码协作时最大限度提高开发人员的生产力。

    BlueOcean 可以安装在现有的 Jenkins 环境中,也可以使用 Docker 镜像的方式直接运行,我们这里直接在现有的 Jenkins 环境中安装 BlueOcean 插件:登录 Jenkins Web UI -> 点击左侧的 Manage Jenkins -> Manage Plugins -> Available -> 搜索查找 BlueOcean -> 点击下载安装并重启

    安装完成后,我们可以在 Jenkins Web UI 首页左侧看到会多一个 Open Blue Ocean 的入口,我们点击就可以打开,如果之前没有创建过 Pipeline,则打开 Blue Ocean 后会看到一个Create a new pipeline的对话框:

    然后我们点击开始创建一个新的 Pipeline,我们可以看到可以选择 Git、Bitbucket、GitHub,我们这里选择 GitHub,可以看到这里需要一个访问我们 GitHub 仓库权限的 token,在 GitHub 的仓库中创建一个 Personal access token:

    blue demo3

    然后将生成的 token 填入下面的创建 Pipeline 的流程中,然后我们就有权限选择自己的仓库,包括下面需要构建的仓库,比如我们这里需要构建的是 jenkins-demo 这个仓库,然后创建 Pipeline 即可:

    Blue Ocean 会自动扫描仓库中的每个分支,会为根文件夹中包含Jenkinsfile的每个分支创建一个 Pipeline,比如我们这里有 master 和 dev 两个分支,并且两个分支下面都有 Jenkinsfile 文件,所以创建完成后会生成两个 Pipeline:

    blue demo5

    我们可以看到有两个任务在运行了,我们可以把 master 分支的任务停止掉,我们只运行 dev 分支即可,然后我们点击 dev 这个 pipeline 就可以进入本次构建的详细页面:

    在上面的图中每个阶段我们都可以点击进去查看对应的构建结果,比如我们可以查看 Push 阶段下面的日志信息:

    1. [jenkins-demo_dev-I2WMFUIFQCIFGRPNHN3HU7IZIMHEQMHWPUN2TP6DCYSWHFFFFHOA] Running shell script
    2. + docker push ****/jenkins-demo:dev-ee90aa5
    3. The push refers to a repository [docker.io/****/jenkins-demo]
    4. ...

    我们可以看到本次构建的 Docker 镜像的 Tag 为dev-ee90aa5,是符合我们在 Jenkinsfile 中的定义的吧

    我们可以看到打印了一句 BRANCH: dev ,证明我本次 CI/CD 是正常的。

    现在我们来把 dev 分支的代码合并到 master 分支,然后来触发一次自动构建:

    1. jenkins-demo [dev] git status
    2. On branch dev
    3. nothing to commit, working directory clean
    4. Switched to branch 'master'
    5. Your branch is up-to-date with 'origin/master'.
    6. jenkins-demo [master] git merge dev
    7. Updating 50e0401..ee90aa5
    8. Fast-forward
    9. Jenkinsfile | 29 +++++++++--------------------
    10. k8s.yaml | 3 +++
    11. 3 files changed, 14 insertions(+), 20 deletions(-)
    12. jenkins-demo [master] git push origin master
    13. To git@github.com:cnych/jenkins-demo.git
    14. 50e0401..ee90aa5 master -> master

    然后我们回到 Jenkins 的 Blue Ocean 页面中,可以看到一个 master 分支下面的任务被自动触发了,同样我们进入详情页可以查看 Push 阶段下面的日志:

    我们可以查看到此处推送的镜像 TAG 为 ee90aa5,没有分支的前缀,是不是和我们前面在 Jenkinsfile 中的定义是一致的,镜像推送完成后,进入 Deploy 阶段的时候我们可以看到出现了一个暂停的操作,让我们选择是否需要部署到线上,我们前面是不是定义的如果是 master 分支的话,在部署的阶段需要我们人工确认:

    bule demo7

    然后我们点击Proceed才会继续后面的部署工作,确认后,我们同样可以去 Kubernetes 环境中查看下部署的结果:

    1. $ kubectl get pods
    2. NAME READY STATUS RESTARTS AGE
    3. ...
    4. jenkins-demo-c69dc6fdf-6ssjf 0/1 Completed 5 4m
    5. ...
    6. $ kubectl logs jenkins-demo-c69dc6fdf-6ssjf
    7. Hello, KubernetesI'm from Jenkins CI!

    现在我们可以看到打印出来的信息是 master,证明部署是没有问题的。

    到这里我们就实现了多分支代码仓库的完整的 CI/CD 流程。

    当然我们这里的示例还是太简单,只是单纯为了说明 CI/CD 的步骤,在后面的课程中,我们会结合其他的工具进一步对我们现有的方式进行改造,比如使用 Helm、Gitlab 等等。

    另外如果你对声明式的 Pipeline 比较熟悉的话,我们推荐使用这种方式来编写 Jenkinsfile 文件,因为使用声明式的方式编写的 Jenkinsfile 文件在 Blue Ocean 中不但支持得非常好,我们还可以直接在 Blue Ocean Editor 中可视化的对我们的 Pipeline 进行编辑操作,非常方便。