开发作业流水线工具

  在工作中经常会遇到领导让你去开发一个定时任务:监控某一个程序的运行状况并定时邮件提醒我们,开发不是不可以但是成本太高了。在这个效率为王的互联网环境里,高成本低产出是很难获得认可的,作为自我提升的话去开发一套还是很值得去投入的。

  接下来就我们的 CI 的工作介绍、CI三剑客(GitLab、Ansible、Jenkins)及 Jenkins 的项目实战对 Jenkins 这个强大的持续集成工具进入深入的学习。

一、基础知识

1. CI/CD是什么?

1.1 CI

  CI(Continuous integration,持续集成),是一种软件开发时间。持续集成强调开发人员提交了新代码后,立即进行构建和单元测试,根据测试结果来判断新代码和原代码是否能正确的集成在一起,根据判断结果进行代码优化。

CI工作流

  CI(持续集成)通常会用到三大组件,也就等于持续交付:

版本控制系统:GitHub、GitLab
持续集成工具:Jenkins
自动化部署工具(替代我们在那费劲的写脚本):Ansible、Saltstack、Chef

1.2 CD

  CD(Continuous Delivery, 持续交付)是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。完成单元测试后,可以把代码部署到连接数据库的 Staging环境【注:软件应用开发的经典模型对应的环境:Development开发环境、Integration集成环境、testing环境、QA验证、Staging预演环境、production环境】 环境中进行更多的测试,待代码没问题了可以手动部署到生产环境。

CD工作流

接下来我们从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工作流程

  1. 创建并克隆项目
  2. 创建项目某 Feature 分支(对应的就是些小需求)
  3. 编写代码并提交至该分支
  4. 推送该项目分支至远程 GitLab 服务器
  5. 进行代码检查并提交 Master 主分支合并申请
  6. 项目领导审查代码并确认合并申请

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

  1. Jenkins是一个开源持续集成工具
  2. 开发工具:Java
  3. 功能:提供了软件开发的持续集成服务
  4. 特点:支持主流软件配置管理,配合实现软件配置管理,持续集成功能

1.2 Jenkins优势应用

  1. 主流的运维开发平台,兼容所有主流的开发环境
  2. 插件时长可与海量业内主流开发工具实现集成
  3. Job为配置单位与日志管理,使运维与开发人员能协同工作
  4. 权限管理划分不同Job不同角色
  5. 强大的负载均衡功能,保证项目的可靠性

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插件

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参数集成

适用于发版不同环境、发布不同版本、发布或构建版本时需要外部动态传入不同的参数等场景,用起来真的很酸爽。
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 路径,并正确填写凭证。
Jenkins集成Git

3.4 Jenkins集成Ansible

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模式

Job示例
Jenkins Job是什么?

  • 代表一个任务或者项目
  • 可配置与可执行
  • 执行后的记录称之为Build
  • 日志监控与记录
  • 所有文件集中记录

4.1 Freestyle Job

1、很简单滴创建一个自由风格的job

创建自由风格的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"
                    }
                }
            }
        }
    }
}

五、Jenkins、Ansible、GitLab集成环境搭建

Jenkins、Ansible、GitLab集成环境搭建流程

posted @ 2020-05-16 19:04  secoder  阅读(1690)  评论(0编辑  收藏  举报