开发作业流水线工具
在工作中经常会遇到领导让你去开发一个定时任务:监控某一个程序的运行状况并定时邮件提醒我们,开发不是不可以但是成本太高了。在这个效率为王的互联网环境里,高成本低产出是很难获得认可的,作为自我提升的话去开发一套还是很值得去投入的。
接下来就我们的 CI 的工作介绍、CI三剑客(GitLab、Ansible、Jenkins)及 Jenkins 的项目实战对 Jenkins 这个强大的持续集成工具进入深入的学习。
一、基础知识
1. CI/CD是什么?
1.1 CI
CI(Continuous integration,持续集成),是一种软件开发时间。持续集成强调开发人员提交了新代码后,立即进行构建和单元测试,根据测试结果来判断新代码和原代码是否能正确的集成在一起,根据判断结果进行代码优化。
CI(持续集成)通常会用到三大组件,也就等于持续交付:
版本控制系统:GitHub、GitLab
持续集成工具:Jenkins
自动化部署工具(替代我们在那费劲的写脚本):Ansible、Saltstack、Chef
1.2 CD
CD(Continuous Delivery, 持续交付)是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。完成单元测试后,可以把代码部署到连接数据库的 Staging环境【注:软件应用开发的经典模型对应的环境:Development开发环境、Integration集成环境、testing环境、QA验证、Staging预演环境、production环境】 环境中进行更多的测试,待代码没问题了可以手动部署到生产环境。
接下来我们从CI的三剑客(GitLab、Ansible、Jenkins)入手。
二、GitLab版本控制工具
1.GitLab介绍
GitLab由乌克兰程序员DmitriyZaporozhets和ValerySizov开发,它使用Ruby语言写成。使用 MIT 许可证的基于网络的 Git 仓库管理工具开源项目,且具有 wiki 和 issue 跟踪功能,使用 Git 作为代码管理工具,并在此基础上搭建起来的 web 服务。
1.GitLab与GitHub的区别:
(1)GitLab分布式在线代码仓库托管软件,分为社区版和企业收费版,都需要企业服务器安装;
(2)GitHub分布式在线代码托管仓库,个人版可直接在线免费试用,企业版本收费且需要服务器安装。
2.GitLab主要服务构成:
(1)Nginx 静态web服务器
(2)GitLab-workhorse 轻量级的反响代理服务器
(3)GitLab-shell 用于处理 Git 命令和修改 authorized keys 列表
(4)Logrorate 日志文件管理工具
(5)Postgresql 数据库
(6)Redis 缓存服务器
3.GitLab的优势及应用场景:
(1)开源免费,适合中小型公司将代码放置在公司内网服务器上
(2)差异化的版本管理,离线同步以及强大的分支管理
(3)便捷的GUI操作界面以及强大的账户管理功能
(4)集成度很高,能够集成绝大多数的开发工具(如,jira等)
(5)支持内置HA,保证在高并发下仍旧实现高可用性
2.GitLab工作流程
- 创建并克隆项目
- 创建项目某 Feature 分支(对应的就是些小需求)
- 编写代码并提交至该分支
- 推送该项目分支至远程 GitLab 服务器
- 进行代码检查并提交 Master 主分支合并申请
- 项目领导审查代码并确认合并申请
3. GitLab安装配置
一般的企业级的 GitLab 是部署在内网环境的,为了避免在访问时报错的尴尬,得做一些前期的准备工作。
3.1.关闭 firewalld 防火墙
防火墙通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络与其内、外网之间构成一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。
# 临时关闭防火墙,也就是说下次进入系统后防火墙还是会自己开启的
sudo systemctl stop firewalld
# 永久关闭防火墙,开机不会自启
sudo systemctl disable firewalld
# 防火墙开机自启动
sudo systemctl enable firewalld
# 查看防火墙状态
sudo systemctl status firewalld
3.2.关闭 SELINUX
SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到。
# 我用的腾讯云ubuntu是没有安装这个子系统的,如果需要这个子系统的安装一下即可
sudo apt-get install selinux-utils
# 临时关闭SELINUX
setenforce 0
# 临时打开SELINUX
setenforce 1
# 查看SELINUX的状态
getenforce
# 开机关闭SELINUX,编辑/etc/selinux/config文件,将SELINUX的值设置为disabled。下次开机SELinux就不会启动了。
# setenforce 1也无法打开必修修改配置文件
# 重启系统
reboot
3.3 安装ssh
如果使用云服务器的话,一般都会有ssh。如果没有的话,就需要我们自己手动安装。
# 更新系统软件
sudo apt-get update
# 安装ssh服务
sudo apt-get install openssh-server
# 启动ssh服务
sudo /etc/init.d/ssh start
# 重启ssh服务
sudo /etc/init.d/ssh restart
# 关闭ssh服务
sudo /etc/init.d/ssh stop
# 查看进程,看ssh服务是否启动
ps -e | grep sshd
# 配置使得root用户可以远程登录
sudo vi /etc/ssh/sshd_config
# 在文件中添加 PermitRootLogin yes 保存
3.4 安装 Postfix 邮件服务
# 安装postfix服务
sudo apt-get install postfix
# 启动postfix服务
sudo systemctl start postfix
# 重启postfix服务
sudo systemctl restart postfix
# 关闭postfix服务
sudo systemctl stop postfix
# 开机自启动postfix服务
sudo systemctl enable postfix
3.5 安装 ca-certificates
生成证书使用的
sudo apt-get install ca-certificates
3.6 安装GitLab
# 添加GitLab包服务并安装包
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
# 安装社区版gitlab-ce
sudo apt-get install gitlab-ce
# 配置GitLab,将将external_url地址改为服务器的地址
sudo vim /etc/gitlab/gitlab.rb
# 更新配置
# 更新配置报错(由于服务器的配置带不动o(╥﹏╥)o)https://idce.com/document/VnmQ
sudo gitlab-ctl reconfigure
# 启动、停止、查看状态、重启gitlab服务
sudo gitlab-ctl start/stop/status/restart
3.7 给GitLab配置证书
# 证书创建于配置加载
# Nginx SSL代理服务器配置
# 初始化GitLab相关服务并完成安装
4.GitLab的应用
4.1 GitLab后台管理
4.2 开发视角的GitLab
4.3 运维视角的GitLab
三、Ansible部署工具
# 为Ubuntu获取Ansible的最佳方法是将项目的PPA(个人包存档)添加到系统中
sudo apt-add-repository ppa:ansible/ansible
# 刷新系统的包索引,以便它知道PPA中可用的包
sudo apt-get update
sudo apt-get install ansible
# 查看Ansible是否安装成功
ansible --version
四、Jenkins流水线工具
1. Jenkins初认识
Jenkins是一个软件开源项目,是基于Java的开发的一款持续集成工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。
1.1 什么是Jenkins
- Jenkins是一个开源持续集成工具
- 开发工具:Java
- 功能:提供了软件开发的持续集成服务
- 特点:支持主流软件配置管理,配合实现软件配置管理,持续集成功能
1.2 Jenkins优势应用
- 主流的运维开发平台,兼容所有主流的开发环境
- 插件时长可与海量业内主流开发工具实现集成
- Job为配置单位与日志管理,使运维与开发人员能协同工作
- 权限管理划分不同Job不同角色
- 强大的负载均衡功能,保证项目的可靠性
1.3 Jenkins配置安装
我又来了,工欲善其事必先利其器。Jenkins的依赖操作系统还是以Ubuntu为例。【官方操作文档】
# Jenkins是基于Java开发
# 安装配置Jenkins的依赖环境-Java环境,这里的话建议用Java8
# 太高的版本会出现不兼容的情况
sudo apt-get install openjdk-8-jdk
# 查看Java是否安装成功
java
# 安装配置Jenkins
# 将 jenkins 存储库密钥添加到系统
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
# 将Debian包存储库地址附加到服务器的sources.list
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
# 更新本地软件源
sudo apt-get update
# 安装Jenkins
sudo apt-get install jenkins
# Jenkins的相关操作
# 启动
sudo service jenkins start
# 停止运行
sudo service jenkins stop
# 重启服务
sudo service jenkins restart
# 查看运行状态
sudo service jenkins status
# 使用Jenkins
# jenkins启动后的访问地址:http://ip_address_or_domain_name:8080
# 访问上面的地址会发现需要输入初始密码,查看获取初始密码
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
2. Jenkins Job模块
3. Jenkins插件
3.1 Jenkins Linux shell集成
我们可以构建一个参数话的Jenkins job,根据参数去执行。
#!/bin/bash
# 执行 whoami 命令,将执行结果传给变量
user=`whoami`
# 判断用户是不是ubuntu,是的话Hello,不是的话Sorry
# shellcheck disable=SC2086
if [ $user == "ubuntu" ]
then
echo "Hello, deplyer is $user"
else
echo "Sorry, deplyer is not $user"
fi
# 查看执行环境服务器的IP地址
ip addr
# 查看执行环境服务器的系统信息
cat /etc/system-release
# 查看剩余空间
free -m
# 查看磁盘的使用信息
df -h
# 执行命令 which python3 命令并将结果传给变量
py_cmd=`which python3`
# 查看环境的Python版本
$py_cmd --version
3.2 Jenkins参数集成
适用于发版不同环境、发布不同版本、发布或构建版本时需要外部动态传入不同的参数等场景,用起来真的很酸爽。
#!/usr/bin/env bash
# 输出当前选择的环境
echo "Current deploy environment is $deploy_env"
# 输出选择的版本
echo "The bulid is $version"
# 输出密码信息
echo "The password is $pass"
# 根据bool值选择输出
if $bool
then
echo "Request is approved"
else
echo "Request is rejected"
fi
3.3 Jenkins集成Git
通常在做构建发版的时候,代码都是从 GitLab 或 GitHub 中拉取代码进行构建或发版,这个相对比较简单。注意填写 URL 为代码的 .git 路径,并正确填写凭证。
3.4 Jenkins集成Ansible
#!/bin/bash
# 关闭环境变量值的输出
set +x
# 激活python的虚拟环境
source /home/ubuntu/MySpace/Jenkins/env/bin/activate
source /home/ubuntu/MySpace/Jenkins/env/ansible/hacking/env-setup -q
# 查看Ansible的版本
ansible --version
# 查看Ansible-playbook的版本
ansible-playbook --version
# 打开环境变量值的输出
set -x
4. Jenkins常用Job模式
Jenkins Job是什么?
- 代表一个任务或者项目
- 可配置与可执行
- 执行后的记录称之为Build
- 日志监控与记录
- 所有文件集中记录
4.1 Freestyle Job
1、很简单滴创建一个自由风格的job
2、构建任务界面功能介绍
(1)General
General:是构建任务的一些基本配置,如:名称、描述之类的
项目名称:刚才创建构建任务步骤设置的,当然在这里也可以更改
描述: 对构建任务的描述
丢弃旧的构建: 服务器资源是有限的,有时候保存了太多的历史构建,会导致Jenkins速度变慢,并且服务器硬盘资源也会被占满
(2)源码管理
源码管理就是配置你代码的存放位置
Git: 支持主流的github 和gitlab代码仓库
Repository URL:仓库地址,一般用xxxx.git文件
Credentials:凭证。可以使用HTTP方式的用户名密码,也可以是RSA文件。 但要通过后面的"ADD"按钮添加凭证
Branches to build:构建的分支。*/master表示master分支,也可以设置为其他分支
源码浏览器:你所使用的代码仓库管理工具,如github, gitlab
URL:填入上方的仓库地址即可
Version: 8.7 gitlab或GitHub服务器的版本
Subversion:就是SVN
(3)构建触发器
构建触发器,就是构建任务的触发器
触发远程构建(例如,使用脚本):该选项会提供一个接口,可以用来在代码层面触发构建
Build after other projects are built:在其他projects构建后构建
Build periodically: 周期性的构建,每隔一段时间进行构建
Build when a change is pushed to GitLab:当有更改push到gitlab代码仓库,即触发构建
Poll SCM:该选项是配合上面这个选项使用的。当代码仓库发生改动,jenkins并不知道。需要配置这个选项,周期性的去检查代码仓库是否发生改动。
(4)构建环境
构建环境就是构建之前的一些准备工作,如指定构建工具
(5)构建
进行任务执行的命令集合
Eexcute shell:执行shell命令,该工具是针对linux环境的,windows环境也有对应的工具"Execute Windows batch command"
(6)构建后操作
构建后操作,就是对project构建完成后的一些后续操作,比如生成相应的代码测试报告
Allure Report:生成 Allure 测试报告
Publish Clover PHP Coverage Report:发布代码覆盖率xml格式的文件报告。路径会在"build.xml"文件中定义
Publish HTML reports:发布代码覆盖率的HTML报告
Report Crap: 发布crap报告
E-mail Notification: 邮件通知,构建完成后发邮件到指定的邮箱
知识点太多了,慢慢积累吧!
4.2 Pipline Job
1.创建Pipeline Job
2. Jenkins Freestyle 与 Pipline Job 区别
(1)所有模块,参数配置都可以体现为一个 Pipeline 脚本
(2)可以定义多个 stage 构建一个管道工作集
(3)所有配置代码化,方便 Job 配置迁移与版本控制
(4)需要 Pipeline 脚本语法基础
4.3 Pipeline Job编写规范
(1)Pipeline基础架构
所有代码包裹在 pipeline{} 层内
stages{} 层用来包含该 pipeline 所有 stage 子层
stage{} 层用来包含我们需要编写任务的 steps{} 子层
steps{} 层用来添加我们具体调用的模块语句
pipeline{
agent any
environment{
host="test.com"
user="crisimple"
}
satges{
stage("build"){
steps{
sh "cat $host"
echo "$deploy"
}
}
}
}
(2)agent区域
agent 定义 pipeline 在哪里运行,可是使用any,node,或具体的Jenkins node主机名
例如:特指在 node1 上执行,可以写成:
agent {node {label ‘node1’}}
pipeline{
agent any
environment{
host="test.com"
user="crisimple"
}
satges{
stage("build"){
steps{
sh "cat $host"
echo "$deploy"
}
}
}
}
(3)environment区域
"变量名称=变量值"定义我们的环境变量
可以定义全局环境变量,应用于所有的 stages 任务
可以定义 stage 环境变量,应用单独的 stage 任务
pipeline{
agent any
environment{
host="test.com"
user="crisimple"
PATH="/bin:/sbin:/usr/bin"
}
satges{
stage("build"){
environment{
JAVA_HOME="/usr/lib/jre"
}
steps{
sh "cat $host"
echo "$deploy"
}
}
}
}
(4)steps区域
echo:打印输出
sh:调用 Linux 系统 shell 命令
git url: 调用 git 模块进行 git 相关操作
pipeline{
agent any
environment{
host="test.com"
user="crisimple"
PATH="/bin:/sbin:/usr/bin"
}
satges{
stage("build"){
environment{
JAVA_HOME="/usr/lib/jre"
}
steps{
sh "cat $host"
echo "$deploy"
git url:"https://root@gitlab.test.com/root/test.git"
}
}
}
}
(5)script区域(可选)
在 steps 内定义 script{}
grrovy 脚本语言
用来进行脚本逻辑运算
pipeline{
agent any
environment{
host="test.com"
user="crisimple"
PATH="/bin:/sbin:/usr/bin"
}
satges{
stage("build"){
environment{
JAVA_HOME="/usr/lib/jre"
}
steps{
sh "cat $host"
echo "$deploy"
git url:"https://root@gitlab.test.com/root/test.git"
echo "Hello Pipeline and groovy"
script{
def servers = ["node1", "node2"]
For (int i=0; I<servers.size(); ++i){
echo "testing ${server[i]} server"
}
}
}
}
}
}