资料下载地址:https://home.freemanke.com:28000/d/b099fde19e9241948220/
通过工作坊的方式介绍并演练如何使用 gitlab,jenkins, docker 等服务来实现日常开发中的的持续集成,持续交付流程,让开发工作变得更高效,有趣和自动化,时间大约1个半小时。
二、相关概念
工作坊中涉及到的基本概念的解释。
持续集成服务
用于管理、构建、执行持续集成和持续交付任务的综合自动化服务,包含海量扩展以支持各种开发语言、框架、三方工具的集成。目前主流CI Service 包括:jenkins,goCD
开发流水线 (Pipeline )
开发工作比喻成工业场景中的流水线,在流水线中流动的就是设计、创意、算法、数据、源代码、和软件构建物等等。
持续集成 (CI)
是一种软件开发实践,即团队开发成员持续不断地集成他们的工作,每次集成都通过自动化的构建(包括编译、发布、自动化测试、部署)来验证,从而尽早地发现集成错误。
相当于将传统工业的流水线作业的思想应用到现代的 软件工业中来。不同之处在于,工业流水线最终出来的是一个一个的产品复制体,但是软件流水线最终出来的是一代一代更新迭代的版本,但是共同点在于:整体产出的效率将极大地增加。
团队成员的代码尽早快速集成到中心代码库,通过构建完备的单元测试,集成测试,功能测试,来保证代码质量,确保新的 feature 或 bug fix 代码不会破坏已有功能。
持续交付 (CD)
通过将运行环境(TEST STAGING PRODUCTION)对接到持续集成的后端,在所有测试完成并确定可交付后,自动化将代码推送到各个环境,并实现自动部署。
三、准备工作
开始本次 Workshop 之前,我们需要花费大约 15 分钟左右准备环境,列表如下:
- 一台联网的笔记本电脑
- 已部署好的开箱即用的 gitlab 服务,直接访问地址: https://home.freemanke.com:9888/
- 已部署好的开箱即用的 jenkins 服务,直接访问地址: https://home.freemanke.com:28080/
- 开发环境 VS Code 官方下载地址,或者 私有云下载地址
- .NET Core 2.1 SDK 官方下载 或者 私有云下载
- 源代码管理 Git 客户端 官方下载地址 或者 私有云下载地址
四、正式开始
创建代码库
访问 Gitlab Community Edition 服务主页: https://home.freemanke.com:9888/ 使用通用的账号和密码登录到系统,创建一个你自己的代码库,命令请使用:workshop-名字全拼
,例如:workshop-kezhiguang
。
代码库中添加一个 README.md 文件
查看自动创建的 Docker Registry
后面的持续交付会用到这个 Registry 作为镜像源。
创建对应该代码库的 Pipeline
访问并登陆 https://home.freemanke.com:28080/ ,创建一个跟 gitlab 库名字相同的 Pipeline
配置 Pipeline
记录下API地址和秘钥
https://home.freemanke.com:28080/project/workshop-kezhiguang
9305109090f638fd1fb101cf10f3c3c4
现场演示
在 gitlab 代码库里配置并测试 webhook
webhook 就是一个事件触发器,当 repo 上有代码事件(push tag branch etc)发生时触发一个动作,当我们的代码 commit 被 push 到 gitlab 上,就会触发 push event,这个时间就会调用 jenkins 上的构建 api,从而自动触发 jenkins 去拉取新的代码并执行 pipeline 中定义的所有 stages。从而实现了一个 开发-提交-构建-部署 的闭环。添加 webhook 时注意从 pipeline config 中得到 secret token 这个 token 是为了确保接口的安全。
现场演示
克隆代码库到本地
注意把库地址中的名字换成自己的拼音缩写!在这个过程中会弹出授权窗口,请输入默认的用户名和密码。
git clone https://home.freemanke.com:9888/cmit/workshop-kezhiguang.git
cd workshop-kezhiguang
git status
如果本机原来没有配置过 git 的用户名和密码,需要作如下配置:
git config --global user.name "cmit"
git config --global user.email "[email protected]"
添加 Jenkinsfile 实现第一次自动集成
使用 VS Code 打开文件夹 workshop-kezhiguang
,在项目跟目录下创建文件 Jenkinsfile
,注意第一个字母是大写,因为我们的 jenkins 部署在 linux 上,对文件名大小写是敏感的。将以下内容复制到 Jenkinsfile
文件中。
#!/usr/bin/env groovy
pipeline {
agent any
stages {
stage('Build') {
steps {
sh "echo building"
}
}
stage('Unit test') {
steps {
sh "echo unit testing"
}
}
}
}
提交代码
git add .
git commit -m "add Jenkinsfile"
git push --set-upstream origin master
在 jenkins 页面上查看通过 commit 提交触发 gitlab 调用 webhook,继而调用 jenkins 构建 api 进行构建。
添加一个真实的控制台项目实现持续集成
我们创建一个真实的简单的控制台项目来让持续集成变得更有意义。
mkdir src
cd src
dotnet new console Caculator
团队开发实现持续集成
对于团队开发来说,使用过 SVN 的开发者都有过处理代码冲突的痛苦经历,对于基于中心代码库思想的源代码管理系统都无法完全避免代码冲突,因为总是存在团队内不同的人同时更新同一个文件的同一个地方的可能,但只要我们按照基本的 git 协作流程,基本上不会有冲突的问题。
团队开发的正确姿势
- 开始编码前拉取最新代码
git pull --rebase
- 小步快走式开发,尽早提交合并
- 提交后时刻关注你的 commit 是否搞红了 pipeline,谁提交谁负责修复 pipeline
- 高效频繁沟通是解决问题的最好方式,沟通!沟通!沟通!重要的事情说三遍
实现持续发布
持续发布的关键是什么呢?
- 要有一个执行自动化任务的 CD 服务,一般 jenkins 服务可以承担
- 要有一个版本化的 artifacts 集中管理库(FTP,docker registry ...)
- 要有配置好的每个环境的服务器资源
- 要有一个触发机制(自动,条件还是手动触发),一般 TEST环境自动触发,其他手动触发,以下以 docker 相关技术来演示如何实现持续发布。
1. 编译构建
dotnet build ./src/workshop/ -c Release
2. 打包成 image
Dockerfile
FROM microsoft/dotnet:2.1-runtime
WORKDIR /root/
USER root
COPY ./src/workshop/bin/Release/netcoreapp2.1/ /root/
EXPOSE 3723/tcp
CMD dotnet workshop.dll
docker-build.sh
docker build -t home.freemanke.com:9999/cmit/workshop .
3. 发布 image 到 registry
docker-push.sh
docker push home.freemanke.com:9999/cmit/workshop
4. 部署到开发环境
docker stop workshop || true
docker rm -f workshop || true
docker run -d --name workshop home.freemanke.com:9999/cmit/workshop