使用 ansible+jenkins+gitlab 实现自动化发布和手动回滚前端项目 01
惯例,介绍下 ansible
、jenkins
、gitlab
ansible:Ansible
简单的说是一个配置管理系统(configuration management system
)。你只需要可以使用 ssh
访问你的服务器或设备就行。它也不同于其他工具,因为它使用推送的方式,而不是像 puppet
等那样使用拉取安装 agent
的方式。你可以将代码部署到任意数量的服务器上!
jenkins:Jenkins
是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)的基于 web
界面的平台。允许持续集成和持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成。
gitlab:GitLab
是一个基于 Git
实现的在线代码仓库托管软件,你可以用 gitlab
自己搭建一个类似于 Github
一样的系统,一般用于在企业、学校等内部网络搭建 git
私服。
准备工作
准备 4
台机器并且为了方便,把防火墙和 SElinux
关闭停用(实际环境看需求开放端口)
ansible
hostname
:dev-of-runfa-20
IP
:10.18.193.20
jenkins
hostname
:dev-of-runfa-25
IP
:10.18.193.25
gitlab
hostname
:dev-of-runfa-26
IP
:10.18.193.26
web
hostname
:dev-of-runfa-27
IP
:10.18.193.27
部署 ansible
、jenkins
、gitlab
服务器
ansible:
[root@dev-of-runfa-20 ~]# yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
[root@dev-of-runfa-20 ~]# yum -y install ansible
[root@dev-of-runfa-20 ~]# ansible --version
ansible 2.8.1
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Apr 9 2019, 14:30:50) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
jenkins:
[root@dev-of-runfa-25 ~]# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
[root@dev-of-runfa-25 ~]# yum -y install docker-ce.x86_64
[root@dev-of-runfa-25 ~]# systemctl start docker.service
[root@dev-of-runfa-25 ~]# systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@dev-of-runfa-25 ~]# mkdir -p /data/jenkins_home
[root@dev-of-runfa-25 ~]# chmod -R 777 /data/jenkins_home
[root@dev-of-runfa-25 ~]# docker run -itd --name jenkins --hostname jenkins -v /data/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime:ro -p 8080:8080 -p 50000:50000 jenkins/jenkins:latest
[root@dev-of-runfa-25 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8ea0f7f2a521 jenkins/jenkins:latest "/sbin/tini -- /usr/…" 5 seconds ago Up 4 seconds 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp jenkins
gitlab
[root@dev-of-runfa-26 ~]# vim /etc/yum.repos.d/gitlab.repo
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1
[root@dev-of-runfa-26 ~]# yum install -y gitlab-ce
[root@dev-of-runfa-26 ~]# gitlab-ctl reconfigure
[root@dev-of-runfa-26 ~]# gitlab-ctl start
ok: run: alertmanager: (pid 9205) 23s
ok: run: gitaly: (pid 9031) 27s
ok: run: gitlab-monitor: (pid 9089) 26s
ok: run: gitlab-workhorse: (pid 9061) 27s
ok: run: grafana: (pid 9230) 22s
ok: run: logrotate: (pid 8576) 123s
ok: run: nginx: (pid 8553) 129s
ok: run: node-exporter: (pid 9081) 26s
ok: run: postgres-exporter: (pid 9220) 23s
ok: run: postgresql: (pid 8319) 203s
ok: run: prometheus: (pid 9105) 25s
ok: run: redis: (pid 8158) 215s
ok: run: redis-exporter: (pid 9093) 25s
ok: run: sidekiq: (pid 8501) 141s
ok: run: unicorn: (pid 8473) 147s
配置 gitlab
和 jenkins
服务器,模拟真实环境
gitlab
相关
先在 gitlab
上创建项目,然后在 windows
主机上(存放源码)安装 windows
git
客户端
使用 git
客户端把源码上传到 gitlab
仓库,git push
的时候提示输入用户名和密码,输入 gitlab
的登录用户的信息
Admin@LAPTOP-JB08JEOV MINGW64 ~
$ cd /d/CF/website/
Admin@LAPTOP-JB08JEOV MINGW64 /d/CF/website
$ git config --global user.name "Administrator"
Admin@LAPTOP-JB08JEOV MINGW64 /d/CF/website
$ git config --global user.email "[email protected]"
Admin@LAPTOP-JB08JEOV MINGW64 /d/CF/website
$ git init
Initialized empty Git repository in D:/CF/website/.git/
Admin@LAPTOP-JB08JEOV MINGW64 /d/CF/website (master)
$ git remote add origin http://10.18.193.26/root/website.git
Admin@LAPTOP-JB08JEOV MINGW64 /d/CF/website (master)
$ git add .
Admin@LAPTOP-JB08JEOV MINGW64 /d/CF/website (master)
$ git commit -m "One commit"
Admin@LAPTOP-JB08JEOV MINGW64 /d/CF/website (master)
$ git push -u origin master
Enumerating objects: 202, done.
Counting objects: 100% (202/202), done.
Delta compression using up to 4 threads
Compressing objects: 100% (198/198), done.
Writing objects: 100% (202/202), 12.01 MiB | 7.74 MiB/s, done.
Total 202 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To http://10.18.193.26/root/website.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
查看 gitlab
是否有你所上传的项目
jenkins
相关
打开 jenkins web
页面并做一些配置
安装一些前端项目需要用到的插件(具体需求具体分析,我这里的不一定通用)
并且针对项目需求做一些配置,我这里安装 gitlab
、gitlab hook
、nodejs
、SSH
、Publish Over SSH
五个插件
把 jenkins
和 gitlab
串联起来并尝试构建
首先在 jenkins
上生成私钥和公钥
[root@dev-of-runfa-25 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:4Rql+pHx9WmNPXyU9blYevCK8/xmwDThgk8+USo+aUA root@dev-of-runfa-25
The key's randomart image is:
+---[RSA 2048]----+
| |
| E o |
| . o . + . .|
| = + = + =|
| + S B =..+o|
| . * * = O*..|
| . + o . *o*+.|
| . . oo o= |
| . .o++. |
+----[SHA256]-----+
[root@dev-of-runfa-25 ~]# cat .ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAwm0l/UzoOGlpIK1cz8+PKEJGILmV5FJWLYwH/Kbe7c5GGS0d
lXLcAl7TngjV9UNSkCDXh792ThCr5hMZyL5YAD0dJ8fRLWmWwyO8neda9I+XndQY
ktgW9TCPtrjquhtFMbL6gwvAua6jzmk2wQzNNUHfkQI+eAk0Fe1XYKLQ1Z/Chk6Z
okfwuZ762zxpmyTyMJBDNibEMBo7PcqLfEuw37hTEkSCGDVi01Im4b9nCl3TK6ZR
IqviQaxrOIyrOlQqhQCSBbtP8T7O1ZmWA1sMdwehxUQyj9+J/x6hErf8DOSmamM2
f4EKxA0Syfcbl/Oz1Eg1exctxmZrI9q8CEtfcQIDAQABAoIBAQCXkqgPNSnE8Mi4
ZO76Q4IDjMdHM+ebPGVa1NRVL3KUSj9z2Sw7GnRSlMK9bX3/2yA+pJvihG0ipvSc
RT/QtDO+2+Yi4TA+CxcxwmaFY5wRFPDKZlNSB4y+UcF4XekAdcoX2MRb7YmuOGwT
uwqoreY9IsG8NteklOg6P/HisIvGPYtS2Te15DoldH/047z7C5I7KWSCRj09L1fk
7TQjYZLV15Gmev0GG/qpp7PVKyp2zd7g9XlC4X2H4pDC15TmM4d3GpUqJ5l8ybfX
3LvWqR8YRoVq4mWvKKXkh0yr/pYJKA1QXud7eMSIIaXO0UdEtdEARI2VNruG5QXq
75k1iTURAoGBAP859j30Mx31fxIQNlh3JeSh3gcXEGeprvRbELXig+AOC11Zcf3g
Da2NDDctGNOdq2TdF/uvK3FI9Ot+8ifDkqJ/VEP5KJ8EgOY3d3vNl/Y8UfW7C1oj
UEcKTcVeF8y+l9k0vb65+xjxSk1InwJ/uIi9CgU2u9mvEbC8wsaZwlmbAoGBAMME
AoY21IHoOkIDqinrQPxT0Fwrs0E6+hzgLM/D9gCFyJSlnl50RuPYNY3qP65AV32a
4A4ZUVcCiXqG6jkT/El0/2YYnVXZyStUnYER6/G5sH4dtD4rwFHco46Bmg/M+g4B
DeitiAdsom8AHbl2hkxZvEPmS/juQvdzoeizAfHjAoGAWppX6NxkvRDmYCIzOKpr
YEN6DyhH4ZTiD8q4HulfiU1TCXt0NPyxvldg68Ftm8nQC0lVdzpTAK82itcQ3b7W
sirjXhH4MqMloxQzrVZpyLbXHZWdzQzWNbHZs+PYLQ3H2AqaBTf+hHc7uj26fOec
OaZqBTnN69PzQrtvpZL15FsCgYAyjCiHV1DvtxzanY6OvP6kKKlaKq2U28+Winiz
Ba0O555dASyyeNsjFZiUB0KoTN8gnHM01FUkA3FVBAFT+B0tgRjuArVNWlztUUpd
+SI6DpJzrglZEAgSb+ko9+jR7aRm2tkbFVer7PmRYetSdilLQvssclYA2OkcsKkn
4rY/VwKBgQCCtEFlD8e0wdcTOqxu0kOC9um5fgWesmZnsSmJGyvXnGwvWZViFcSx
3aF5LaSSU7aUxFijaIDHp/rMreoy0i9JePtHysqR5xJNK507RxKXGAM9M4VPNb3O
J5pBfwh7jV9VoAA0shznph6AwYUxJ8lr03QuLJfhhGczxYYbuCGsMQ==
-----END RSA PRIVATE KEY-----
[root@dev-of-runfa-25 ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCbSX9TOg4aWkgrVzPz48oQkYguZXkUlYtjAf8pt7tzkYZLR2VctwCXtOeCNX1Q1KQINeHv3ZOEKvmExnIvlgAPR0nx9EtaZbDI7yd51r0j5ed1BiS2Bb1MI+2uOq6G0UxsvqDC8C5rqPOaTbBDM01Qd+RAj54CTQV7VdgotDVn8KGTpmiR/C5nvrbPGmbJPIwkEM2JsQwGjs9yot8S7DfuFMSRIIYNWLTUibhv2cKXdMrplEiq+JBrGs4jKs6VCqFAJIFu0/xPs7VmZYDWwx3B6HFRDKP34n/HqESt/wM5KZqYzZ/gQrEDRLJ9xuX87PUSDV7Fy3GZmsj2rwIS19x root@dev-of-runfa-25
把私钥放到 jenkins
上,把公钥放到 gitlab
上,使 jenkins
能从 gitlab
拉取代码构建
回到 jenkins
,新建项目
测试是否能正常构建,构建完成最后又 SUCCESS
即为构建成功(最后一张图比较大,可以另开页面放大看下)
我这里一开始因为 npm install
和 npm run build
后面有个空格导致构建失败,所以调试了好几次才成功,能看到调试了 7
次
所以大家有什么问题要自己看下
这篇文章结束了
到这里,已经把 jenkins
和 gitlab
串联起来了
因为篇幅所限,下一篇文章将介绍如何使用 gitlab
钩子触发自动构建,以及 jenkins
和 ansible
协同部署到服务器