0X00 CI/CD(Continuous Integration/Continuous Delivery)
CI/CD 中的“CI”始终指持续集成,它属于开发人员的自动化流程。成功的 CI 意味着应用代码的新更改会定期构建、测试并合并到共享存储库中。该解决方案可以解决在一次开发中有太多应用分支,从而导致相互冲突的问题。
CD(Continuous Delivery, 中文意思持续交付)是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境。下图反应的是CI/CD 的大概工作模式。
0X01 Jenkins
Jenkins是一个开源的,提供持续集成功能的工具,用于持续性的构建,部署,测试项目。通常和SCM(Source Code Management)一起使用,常见的SCM有Gitlab,Github,SVN。简单来说就是实现软件全生命周期的自动化,当我们把代码提交到代码仓库后,Jenkins自动拉取代码到目标服务器,然后对代码进行构建/部署/测试,
1.安装Java
apt install openjdk-11-jdk
2.Ubuntu安装Jenkins:
https://www.jenkins.io/download/
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
添加源到/etc/apt/sources.list:
deb https://pkg.jenkins.io/debian-stable binary/
更新源并安装Jenkins:
sudo apt-get update
sudo apt-get install jenkins
3.登录Jenkins界面继续安装
http://localhost:8080/
http://localhost:8080/log/all # 可查看jenkins的所有日志
4.如果添加Node节点,Node节点也需要安装java
apt install openjdk-11-jdk
node节点配置好后需要指定工作目录:
然后jenkins会通过agent在该目录下创建相关文件:
其中workspace就存放了在该节点构建的所有项目,例如workspace/test/hello_world.py,从git或svn拉取的源码会直接存放在test项目目录下
5.使用注意事项
1.如果使用git协议从github拉取仓库代码,会要求上传服务器公钥到github,因为git clone是基于SSH协议的,可以切换到https协议,那么就不需要上传公钥了。
2.自动化构建Github项目
在Github项目这一栏填入git地址还不够,在源码管理栏还得通样填入地址,否则不会自动拉取代码
更新了代码后重新构建即可,jenkins会自动拉取新的代码然后部署
支持Github更新代码后自动触发jenkins构建,但是需要jenkins有公网IP,然后在Github上进行设置,代码变动后自动通过WEB HOOK通知jenkins
3.默认没有添加SVN的源码管理选项,自行下载该插件,搜索Subversion
插件下载完成后可以添加SVN的源码仓库:需要注意的是如果SVN有认证,那么需要填入相应的账号密码信息
4.支持指定构建项目到某个节点:
在自由构建中,可以选择运行节点的label,让项目构建在指定节点
5.管道Pipeline
FreeStyle Job:
1. 需要在页面添加模块配置项与参数完成配置
2. 每个Job仅能实现一个开发功能
3. 无法将配置代码化,不利于Job配置迁移与版本控制
4. 逻辑相对简单,无额外学习成本
1. 所有模块,参数配置都可以体现为一个Pipeline脚本
2. 可以定义多个Stage构建为一个Pipeline工作集
3. 所有配置代码化,方便Job配置迁移与版本控制
4. 需要Pipeline脚本语法基础,学习成本高
使用Pipeline syntax定义项目构建 测试的整个流程,通常会写入到Jenkinsfile中,类似Dockerfile,使项目的构建 测试具有可重复性,而且还可以将该文件直接加入到项目的代码仓库中,使整个构建 测试流程自动化。将Jenkinsfile加入到代码仓库进行管理的好处:
-
为所有分支和拉取请求自动创建管道构建过程。
-
保证管道文件中的代码可审查
-
管道的审计跟踪。
-
保证管道文件的唯一可信源,并且构建 测试过程完全透明,可以供所有团队成员查看
对于管道文件中的语法,分为脚本化管道语法和声明式管道语法,脚本化管道需要用到Groovy脚本语言,对于没有掌握Groovy语法的人来说,重新学习Groovy会造成额外的开销,所以建议使用声明式语法。
声明式管道:定义了整个管道完成的工作
Jenkinsfile(声明性管道)
pipeline {
agent any // 在任何可用代理上执行此管道或其任何阶段。
stages {
stage('Build') { // 定义“构建”阶段。
steps {
// 执行一些与“构建”阶段有关的步骤。
}
}
stage('Test') { // 定义“测试”阶段。
steps {
// 执行与“测试”阶段相关的一些步骤。
}
}
stage('Deploy') { // 定义“部署”阶段。
steps {
// 执行与“部署”阶段相关的一些步骤。
}
}
}
}
脚本化管道:
Jenkinsfile(脚本管道)
node { // 在任何可用代理上执行此管道或其任何阶段。
stage('Build') { // 定义“构建”阶段。stage块在脚本管道语法中是可选的。但是,stage在脚本化管道中实现块可提供Jenkins UI中每个阶段的任务/步骤子集的清晰可视化。
// 执行一些与“构建”阶段有关的步骤。
}
stage('Test') { // 定义“测试”阶段。
// 执行与“测试”阶段相关的一些步骤。
}
stage('Deploy') { // 定义“部署”阶段。
// 执行与“部署”阶段相关的一些步骤。
}
}
为了帮助开发者熟悉Pipeline语法,Jenkins提供了一个界面帮助生成Pipeline代码:
http://YOUR_JENKINS:8080/job/jenkins_test/pipeline-syntax/
6.blue ocean
提供UI界面,帮助我们创建管道
但是请注意,第一次 在Blue Ocean中为特定的Git服务器(即GitHub,Bitbucket或普通的Git服务器)创建管道时,Blue Ocean会提示您输入凭据以访问Git服务器上的存储库,以便根据这些存储库创建管道。这是必需的,因为Blue Ocean可以将Jenkinsfile
s写入您的存储库。测试时没有提供TOKEN,blue ocean一直卡在connect git的界面,无法帮助创建Jenkinsfile
由于Pipeline编辑器将已编辑的Pipelines以Jenkinsfile
s的形式保存到Git存储库 ,因此Blue Ocean仅支持通过SSH协议与远程Git存储库的连接,不支持使用HTTPS。
使用Pipeline项目和自由项目不同,Pipeline项目的创建界面没有gitlab或者svn仓库的填写栏,所以需要在Pipeline script中写入完整的代码处理流程,例如拉取代码-->编译代码-->运行代码-->测试代码等等,具体流程看因项目需要而异。
7.使用python虚拟环境
Python环境很容易产生Python版本冲突、第三方库冲突等问题。所以,Python开发通常会进行工程级别的环境隔离,也就是每个Python工程使用一个Python环境。
在Jenkins环境下,我们使用Pyenv Pipeline插件可以轻松地实现。
首先,准备Python基础环境。
- 在Jenkins机器上安装python、pip、virtualenv。
- pip:Python的包管理工具。
- virtualenv:Python中的虚拟环境管理工具。
- 安装Pyenv Pipeline插件。
然后,在pipeline中使用Pyenv Pipeline插件提供的withPythonEnv
方法。
withPythonEnv("/usr/bin/python") {
sh "python --version"
}
withPythonEnv
方法会根据第一个参数——可执行python路径——在当前工作空间下创建一个virtualenv环境。withPythonEnv
方法的第二个参数是一个闭包。闭包内的代码就执行在新建的virtualenv环境下。
0X02 Pipeline语法