持续交付

持续交付指的是一种能够使得软件在较短的循环中可靠的发布的软件工程方法。在持续交付初期需要掌握的内容有:(1)版本控制系统,如GitLab、GitHub等,也就是代码仓库,用来作为项目构建初期代码构建的仓库平台;(2)持续集成工具,如Jenkins,作为核心的平台,用来将代码抓取到本地,进行集成配置工作;(3)部署交付工具,如Ansible、Saltstack、Chef等,对我们在Jenkins本地抓取的代码进行最终的远程服务器端交付推送工作。因此我们可以得出一个结论:持续交互=交付+版本控制系统&持续集成工具&部署工具

本套笔记用于记录Jenkins+Ansible+Gitlab如何搭建一个自动化的部署平台。在此过程中会解决一些问题,如Jenkins如何集成Ansible、playbook等;如何使用Gitlab集成我们的交付部署。

记录内容

本套笔记主要记录的内容有:(1)GitLab代码仓库的搭建流程与使用流程,且介绍这个工具在项目交付过程中所起的作用;(2)Ansible部署工具的虚拟环境配置以及Playbook脚本编写规范,并介绍Ansible的架构使用规范、模块调用,以及最终的流程应用;(3)Jenkins集成工具系统的环境构建,以及它的Freestyle、Pipeline这两种不同任务格式的编写,以及最终与主流开发工具的集成应用;(4)FreeStyle任务结合JAG(Jenkins+Ansible+Gitlab)三剑客工具去编写一个静态网站的自动化部署交付流程的集成与实现;(5)Pipeline任务结合三剑客工具去编写一个WordPress博客网站的自动化部署交付流程的集成与实现。

GitLab概述

GitLab定义

GitLab是一个开源的分布式版本控制系统,它的开发语言是Ruby,通过Web界面与用户交付实现项目源代码管理缺陷与注释、版本控制、代码复用与查找等功能。

看到这里你可能有疑惑了,这个与我们平时使用的GitHub有什么区别呢?我们平常就是使用Github来管理代码。Github是一个分布式的在线代码托管仓库,个人版可直接在线免费使用,而企业版需要收费且需要服务器安装。Gitlab是一个分布式的在线代码托管软件,分社区免费版和企业收费版,且都需要服务器安装。不过GitLab它的优势在于中小公司可以直接使用社区免费版本去保存和管理自己的私有代码,无需使用Github将代码直接暴露在我们的公网上面。

Gitlab的优势和应用场景有以下几点:1、开源免费,适合中小型公司将代码放置在该系统中。Gitlab目前所发布的社区免费版中的适配功能完全满足中小型公司将其安装到自己的私有网络当中,并充当我们的代码仓库,如果我们需要对Gitlab进行二次开发获取一些第三方平台的集成服务,以及需要没有宕机时间的系统升级服务,我们也可以随时购买它的企业付费版本,服务许可证,实现无缝的将当前免费社区版升级到收费企业版本。2、差异化的版本管理,离线同步以及强大的分支管理功能。这里的差异化的版本管理保证我们的代码无论有多少次细微或这巨大的变动,Gitlab都能实时的保存我们的变动记录。离线同步保证我们不再实时依赖网络资源进行代码提交,Gitlab可以实现本地的代码提交,并在网络通畅的情况下将本地的所有Git相关的操作同步到远程Gitlab服务器当中,GitLab强大的分支管理使我们可以针对不同的部署环境、不同的业务逻辑、不同的代码batch特征,创建不同的分支进行并行的独立维护与更新。3、便捷的GUI操作界面以及强大的账户权限管理功能。Gitlab最大的优势与特点就是有一个强大的便捷GUI操作界面,以及支持本地或者Feature账户对不同仓库,根据用户或组进行读、写、查看、提交等权限划分,保证我们的Gitlab用户可以各司其职,不会越权去操作不属于他的工作。4、集成度很高,能够集成绝大多数的开发工具。Gitlab集成度很高的最大原因就是它广泛应用于国内外大中小公司,充当一个非常可靠的分布式代码仓库系统,正是因为它的口碑,很多第三方工具,如Jira、Jenkins等开发工具都会选择Gitlab作为一个非常重要的持续集成工具加入其系统工具当中。5、支持内置HA,保证在高并发下仍旧实现高可用性。Gitlab支持内置HA,保证在高并发下仍旧实现高可用,无论Gitlab的服务宕机或者因服务异常导致网络中断,它的内置HA高可用功能都可以保证我们的用户在7*24小时内不间断地使用它的服务,我们无需去搭配第三方的高可用工具去保证它的系统安全稳定,我们可以直接打开Gitlab内置HA工具,使用它。

Gitlab主要服务构成

Gitlab作为一个分布式在线代码仓库托管软件,它必然有相关的服务组件去支撑这个庞大的系统,接下来就介绍Gitlab的主要服务构成:(1)Nginx静态Web服务器。它作为Gitlab的Proxy代理,处理我们所有HTTPS静态访问请求;(2)Gitlab-workhorse轻量级的反向代理服务器。它用于处理一些较大的文件上传下载以及我们经常使用的git push等命令行操作;(3)Gitlab-shell用于处理日常使用的Git命令和修改存放我们ssh公钥的authorized keys文件列表;(4)Logrotate日志文件管理工具。 Logrotate负责处理我们Gitlab日志的一些切割、打包操作;(5)Postgresql数据库。Postgresql数据库作为Gitlab的推荐数据库,用于保存我们所有的Gitlab信息;(6)Redis缓存服务器。它作为Gitlab的缓存服务器,用于缓存我们的数据库信息,加快我们的前台访问速度,以及数据的交互读写。

GitLab工作流程

我们需要在Gitlab前台Web界面创建项目仓库,然后在本地去克隆我们的项目,这里需要注意的是在完成前台项目仓库创建之后,需要在本地电脑上安装Git客户端工具git client,保证我们可以使用git命令去执行我们本地克隆项目操作。上面其实就是第一步,创建并克隆项目。接下来是第二步,创建项目某Feature分支。我们会根据项目的需求Feature特征去创建对应的仓库分支,这样就可以开始编写该Feature的代码并提交至该Feature分支。需要注意的是,在实际开发过程中,Gitlab管理员会事先创建好我们的项目仓库,并在该仓库下根据项目的业务需求,去创建若干个Feature特征分支,这些Feature特征分支会以任务的形式分发给开发人员,然后开发人员在该分支下编写对应的代码,并初步提交至该分支。第三步就是推送该项目分支至远程Gitlab服务器。我们编写的代码最后肯定是需要提交的远程服务器的,你以为这就完了么?不,我们还有第四步,在Gitlab 图形Web界面下找到自己开发的代码,并进行代码检查,检查无误后,提交Master主分支合并申请。第五步,项目领导审查代码并确认合并申请,这样就完成了一个Feature分支到我们的项目当中,进而完成了Gitlab的一个工作流程。

作为一个开发团队,我们需要这样一个Gitlab工作流程去更加快速、高效和稳定地进行项目代码编写、提交、检查、合并等操作,这样可以使开发人员可以并行地完成各自的Feature需求,而又不会对主分支代码造成影响。这里选择Gitlab分布式代码管理软件其中最重要的一个原因就是它有一个非常方便的Web界面去完善我们的工作流程,可以帮助我们非常清晰地完成代码的编写与存放工作。

Gitlab的安装与配置管理

Gitlab安装配置

这次是在本地虚拟机下安装Gitlab社区版本,并以一个demo来演示Gitlab的工作流程。首先需要准备一台虚拟机,系统是CentOS7 64位,然后利用xshell工具来登录该虚拟机,开始Gitlab开始前的预配置准备工作,分两步:第一步,关闭firewalld防火墙。首先需要关闭CentOS7系统自带的firewalld防火墙,以保证本地电脑可以访问该CentOS7 中所有的端口资源,使用的命令为systemctl stop firewalld,同时需要使用systemctl disable firewalld命令去禁用防火墙开机启动服务;第二步,关闭SELINUX并重启系统。关闭SELINUX强制访问控制安全策略,保证该策略不会影响Gitlab的正常运行。可以编辑selinux文件,使用的命令为vi /etc/sysconfig/selinux,将其中的enforcing修改为disabled,最后输入reboot命令来重启系统,完成SELINUX的禁用操作。预配置准备工作就完成了。

接着需要安装Omnibus Gitlab-ce安装包(其实就是Gitlab社区版安装包),这里你可能就需要问了,为什么使用Omnibus Gitlab-ce安装包,而不是直接通过源代码的方式进行安装,那是因为这里的Omnibus是综合性的意思,而Gitlab本身包含很多服务组件及依赖的安装包,如果你手动去安装这些会很难,且非常费时间,因此Gitlab推出了一键Omnibus Gitlab-ce安装包,去帮助我们快速安装Gitlab所有组件及其依赖,并使用内置的shell自动化配置工具去自动的配置Gitlab的相关组件及有关配置,降低了初学者的安装成本,相比利用源代码安装Gitlab,这里仅仅花费很短的时间就可以完成安装配置工作。安装步骤为:1、安装Gitlab组件,使用的命令为:

1
yum -y install curl policycoreutils openssh-server openssh-clients postfix

2、配置YUM仓库,使用的下面的命令去下载Gitlab仓库源:

1
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash

3、启动postfix邮件服务且开机可以自动加载,使Gitlab能够与postfix集成,发送相关的任务通知给我们的账户邮箱。启动命令为:

1
systemctl start postfix && systemctl enable postfix

4、安装Gitlab-ce社区版本。使用下面的命令来安装Gitlab-ce一键社区版本安装包:

1
yum install -y gitlab-ce

5、在安装完Gitlab-ce一键社区版本安装包后,需要配置Gitlab相关的一些证书。(A)首先使用openssl去创建Gitlab本地证书,并配置Gitlab config去加载该证书;(B)配置Nginx SSL代理服务,使我们可以通过域名直接访问Gitlab的所有系统资源;(C)最后使用gitlab-ctl命令来管理并初始化Gitlab相关服务并完成安装。

Gitlab安装实战

首先启动本地虚拟机,然后获取到它的IP地址,然后打开git bash或者xshell工具,使用ssh@IP命令登录到该虚拟机。开始执行一系列命令:

1
2
3
4
5
6
7
8
9
10
systemctl stop firewalld  #关闭firewalld防火墙
systemctl disable firewalld # 禁用防火墙开机启动服务
vi /etc/sysconfig/selinux # 设置selinux值为disabled
reboot # 重启系统
getenforce # 检查selinux策略是否已为disabled状态

yum -y install curl policycoreutils openssh-server openssh-clients postfix # 安装Gitlab组件
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash # 下载Gitlab仓库源
systemctl start postfix && systemctl enable postfix # 启动postfix邮件服务且开机可以自动加载
yum install -y gitlab-ce # 安装gitlab社区版一键启动包

执行完上述命令后,结果出现下面的信息,表示已经成功安装好Gitlab-ce社区版本:

接下来进行Gitlab相关的一些证书。(A)使用openssl去创建Gitlab本地证书,并配置Gitlab config去加载该证书,一共有四个证书,这是Gitlab安装必备的。首先需要创建一个ssl目录,使用的命令为mkdir -p /etc/gitlab/ssl,然后去创建一个本地私有秘钥,使用的命令为openssl genrsa -out "/etc/gitlab/ssl/gitlab.example.com.key" 2048,接着使用刚才的私有秘钥去创建csr证书,使用的命令为openssl req -new -key "/etc/gitlab/ssl/gitlab.example.com.key" -out "/etc/gitlab/ssl/gitlab.example.com.csr"之后会进入一个交互页面,按照图示输入信息:

然后进入到/etc/gitlab/ssl目录下,查看是否存在私有秘钥和csr证书:

1
2
-rw-r--r-- 1 root root 1074 4月  16 18:28 gitlab.example.com.csr
-rw-r--r-- 1 root root 1675 4月 16 18:26 gitlab.example.com.key

接下来用私有秘钥和csr证书创建crt签署证书,使用openssl x509 -req -days 365 -in "/etc/gitlab/ssl/gitlab.example.com.csr" -signkey "/etc/gitlab/ssl/gitlab.example.com.key" -out "/etc/gitlab/ssl/gitlab.example.com.crt"命令来进行创建。注意其中的x509 -req代表签署证书的格式,-days 365代表证书有效期是365天,-in "/etc/gitlab/ssl/gitlab.example.com.csr"代表引入这个csr证书,-signkey "/etc/gitlab/ssl/gitlab.example.com.key"代表使用这个私有秘钥作为签名Key,-out "/etc/gitlab/ssl/gitlab.example.com.crt"表示输出已经签署的证书到本路径。可以看到/etc/gitlab/ssl目录下已经有三个文件了。

接着去输出pem证书,使用的命令为openssl dhparam -out /etc/gitlab/ssl/dhparams.pem 2048,这里可能需要花费一些时间(注意这里面的/etc/gitlab/ssl/dhparams.pem是不能使用引号包围的)。

然后进入到/etc/gitlab/ssl目录下,查看是否存在4个证书:

1
2
3
4
-rw-r--r-- 1 root root  424 4月  16 19:04 dhparams.pem
-rw-r--r-- 1 root root 1281 4月 16 18:59 gitlab.example.com.crt
-rw-r--r-- 1 root root 1074 4月 16 18:28 gitlab.example.com.csr
-rw-r--r-- 1 root root 1675 4月 16 18:26 gitlab.example.com.key

那么到此关于创建证书这一块就到此为止了,接下来就是更改/etc/gitlab/ssl目录下所有证书的权限(注意必须在/etc/gitlab/ssl目录进行操作),使用的命令为chmod 600 *。然后编辑Gitlab的配置文件,将这里的4个证书都配置到Gitlab的配置文件中,先使用vi /etc/gitlab/gitlab.rb打开配置文件,将external_url中的http修改为 https,接着在阅读模式下使用/redirect_http_to_https命令来查找redirect_http_to_https相关的信息,将其前面的#号去掉,且将值修改为true。然后使用/ssl_certificate命令来查找ssl_certificate相关的信息,将其前面的#号去掉,同时将"/etc/gitlab/ssl/#{node['fqdn']}.crt"更改为/etc/gitlab/ssl/gitlab.example.com.crt,顺便将下面的nginx['ssl_certificate_key'] 中的key的值也修改为/etc/gitlab/ssl/gitlab.example.com.key。然后使用/ssl_dhparam命令来查找ssl_dhparam相关的信息,注意其前面的#号一定需要保留,这里仅仅只是将nil值修改为/etc/gitlab/ssl/dhparams.pem。修改完上述信息后,执行wq保存操作。

最后使用gitlab-ctl reconfigure命令来初始化gitlab的相关服务配置,在命令执行过程中可以看到gitlab会使用chef自动化部署工具来初始化gitlab相关配置,该过程可能需要一定时间,请耐心等待。当你看到下面的结果时,则表示gitlab已经初始化成功:

(B)配置Nginx SSL代理服务,使我们可以通过域名直接访问Gitlab的所有系统资源。接下来找到gitlab下面的nginx代理工具,去更改gitlab的一个http配置文件,使用的命令为vi /var/opt/gitlab/nginx/conf/gitlab-http.conf,接着在阅读模式下使用/server_name命令来查找server_name相关的信息,我们在该行的下面新增一行,用来重定向所有gitlab的https请求,添加的那行代码为:

1
rewrite ^(.*)$ https://$host$1 permanent;

添加完上述信息后,执行wq保存操作。最后使用gitlab-ctl restart命令来使我们刚才修改的nginx配置信息生效:

(C)修改本机hosts文件,文件地址是C:\Windows\System32\drivers\etc\hosts,你可以一步步定位到该目录或者直接使用win+R,将这个文件地址放进入回车即可快速进入该目录。在里面手动输入一条DNS记录,内容为192.168.2.131 gitlab.example.com,这条DNS记录的含义是将gitlab.example.com域名重定向到192.168.2.131这个Gitlab主机,也就是我们的虚拟机IP地址。然后打开浏览器,在地址栏中输入网址gitlab.example.com,如果看到下面的图片信息,则表明你已经成功安装了gitlab分布式代码仓库:

第一次登陆要求更改默认密码,自己设置一个即可,然后点击提交。然后在登录页面使用默认的账号名称root,密码就是你刚才输入的那个:

接下来就创建一个project,名称为first-repo,具体操作见下面的图片:

复制上面的https链接,回到本地电脑,在桌面上新建一个文件夹repo,然后使用git client进入到该文件夹中,在里面执行命令git -c http.sslVerify=false clone https://gitlab.example.com/root/first-repo.git,其中这个-c http.sslVerify=false用来避免我们的本地证书无法进行克隆操作。然后输入你gitlab的账号和密码即可将线上的first-repo项目克隆到本地:

然后新建一个my.py文本文件,里面的内容为:print("hello,this is my first repository which created by gitlab"),现在尝试将其推送到我们线上远程仓库。首先使用git add .命令将该目录下所有文件添加到本地仓库,然后使用git commit -m "提交信息"命令输入提交信息。如果页面提示让你输入全局邮箱和用户名,你就按照要求依次进行输入:

1
2
git config --global user.email "admin@example.com"
git config --global user.name "admin"

然后再次执行git commit -m 'first commit'命令,如果出现以下信息:

1
2
3
4
$ git commit -m 'first commit'
[master (root-commit) 8c9ef06] first commit
1 file changed, 1 insertion(+)
create mode 100644 test.py

说明本地已经上传了一个my.py文件到我们本地的master分支上,但这还不是远程服务器分支上,需要使用git -c http.sslVerify=false push origin master命令来完成我们本地master分支同步到远程的服务器当中:

如果你觉得页面是英文的不易阅读,可以点击参看这篇文章进行汉化 gitlab安装和汉化的两种方式

最后需要说明的是gitlab的启动、重启、暂停方式代码和普通的服务方式差不多,命令依次为:

1
2
3
gitlab-ctl start
gitlab-ctl restart
gitlab-ctl stop