持續整合Jenkins+Gitlab

weixin_34321977發表於2018-04-21

一、相關概念

1.1 持續整合:

持續整合(Continuous Integration),簡稱CI,是指開發者在程式碼的開發過程中,可以頻繁的將程式碼部署整合到主幹,並程式自動化測試。

6006801-c1c13430a8ae7885.png
CI

1.2 持續交付:

持續交付(Continuous Delivery),指的是在持續整合的環境基礎之上,將程式碼部署到預生產環境

6006801-d7472872335abd1c.png
CD

1.3 持續部署:

持續部署(Continuous Deployment),是指在持續交付的基礎上,把部署到生產環境的過程自動化,持續部署和持續交付的區別就是最終部署到生產環境是自動化的。

6006801-2c0dbb3bddf6a895.png
Continuous Deployment

PS:目前大部分公司都是做到持續交付,做到持續部署的還很少,因為上生產環境,還要有很多步驟需要做。

1.4上線基本流程:

1.程式碼獲取(直接了拉取最新程式碼,使用tag標籤獲取某個版本程式碼)
2.編譯 (可選)
3.配置檔案放進去
4.打包
5.scp到目標伺服器
6.將目標伺服器移除叢集
7.解壓並放置到Webroot
8.Scp 差異檔案
9.重啟 (可選)
10.測試
11.加入叢集


二、Gitlab

2.1Gitlab簡介

GitLab是一個利用 Ruby on Rails 開發的開源應用程式,實現一個自託管的Git專案倉庫,可通過Web介面進行訪問公開的或者私人專案。
GitLab擁有與Github類似的功能,能夠瀏覽原始碼,管理缺陷和註釋。可以管理團隊對倉庫的訪問,它非常易於瀏覽提交過的版本並提供一個檔案歷史庫。它還提供一個程式碼片段收集功能可以輕鬆實現程式碼複用,便於日後有需要的時候進行查詢

2.2Gitlab部署

#環境準備
[root@node1 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core) 
[root@node1 ~]# uname -r
3.10.0-693.el7.x86_64

#更換阿里yum源
[root@node1 yum.repos.d]# wget http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm 
[root@node1 ~]# wget http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
[root@node1 ~]# yum update -y

#更換gitlabyum源為清華大學
[root@node1 ~]# vim /etc/yum.repos.d/gitlab-ce.repo
[gitlab-ce]
name=gitlab-ce
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7
repo_gpgcheck=0
gpgcheck=0
enabled=1
gpgkey=https://packages.gitlab.com/gpg.key
[root@node1 ~]# yum makecache
[root@node1 ~ ]#  yum install -y gitlab-ce

#安裝依賴
[root@node1 ~]# yum install curl policycoreutils openssh-server openssh-clients postfix -y

#啟動postfix
[root@node1 ~]# systemctl start postfix

#安裝gitlab-ce   版本為gitlab-ce.x86_64 0:10.6.4-ce.0.el7
[root@node1 ~]# yum install -y gitlab-ce

#配置並啟動gitlab   比較久,需要耐心等待一下,在此之前需要保證80埠不被佔用
[root@node1 ~]# gitlab-ctl reconfigure

#等待完成,看到如下結果,說明配置成功
Running handlers:
Running handlers complete
Chef Client finished, 387/552 resources updated in 01 minutes 55 seconds
gitlab Reconfigured!

#檢視啟動狀態 全部為run說明正常啟動
[root@node1 ~]# gitlab-ctl status
run: gitaly: (pid 15333) 182s; run: log: (pid 14995) 225s
run: gitlab-monitor: (pid 15350) 181s; run: log: (pid 15153) 213s
run: gitlab-workhorse: (pid 15318) 182s; run: log: (pid 14876) 239s
run: logrotate: (pid 14928) 231s; run: log: (pid 14927) 231s
run: nginx: (pid 14895) 237s; run: log: (pid 14894) 237s
run: node-exporter: (pid 15132) 219s; run: log: (pid 15131) 219s
run: postgres-exporter: (pid 15387) 180s; run: log: (pid 15240) 199s
run: postgresql: (pid 14634) 273s; run: log: (pid 14633) 273s
run: prometheus: (pid 15370) 181s; run: log: (pid 15191) 205s
run: redis: (pid 14574) 279s; run: log: (pid 14573) 279s
run: redis-exporter: (pid 15175) 207s; run: log: (pid 15174) 207s
run: sidekiq: (pid 14858) 245s; run: log: (pid 14857) 245s
run: unicorn: (pid 14820) 247s; run: log: (pid 14819) 247s

至此最基本的gitlab已經正常執行起來了!

2.3Gitlab使用

2.3.1 此時我們在瀏覽器中訪問http://192.168.66.129

Web頁面提示需要設定一個密碼(最少8位數)我這裡設定密碼為:12345678


6006801-e781f881e103fbb4.png
image.png

登入系統,預設使用者名稱為root


6006801-722045b4a272361e.png
image.png

關閉自動註冊 因為為內部使用不需要使用者自己註冊,由管理員分配使用者即可
點選Admin Area 進入管理區域
6006801-6ce0985825c2b772.png
image.png

點選settings 把Sign-up enabled的鉤去掉即可


6006801-9a00bca3c2f45045.png
image.png

儲存即可
2.3.2 建立組,建立專案

進去管理區域,點選New group


6006801-4dabcde6a931ac3f.png
image.png

輸入相關資訊,並選擇Private


6006801-bdceeeac2bdf0c44.png
image.png

點選Create group即可,如下說明建立成果
6006801-68f6586a784fd236.png
image.png

類似上面的方法,建立一個專案,並選擇web組


6006801-129f12d1eeead011.png
image.png

看到如下,說明專案建立成功
6006801-03943712d82f7d43.png
image.png

測試一下
新建一個Readme,並隨意輸入
6006801-6c446bcac00f9a99.png
image.png
2.3.3 在客戶端測試,並配置ssh免祕
[root@node1 ~]# useradd www
[root@node1 ~]# passwd www
更改使用者 www 的密碼 。
新的 密碼:
無效的密碼: 密碼少於 8 個字元
重新輸入新的 密碼:
passwd:所有的身份驗證令牌已經成功更新。
[root@node1 ~]# su www
[www@node1 root]$ ssh-keygen -t rsa -C "yuanjy@juweitu.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/www/.ssh/id_rsa): 
Created directory '/home/www/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/www/.ssh/id_rsa.
Your public key has been saved in /home/www/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:J5Ja/RLAE4KPv70zz1YMmrz7r5ojLPfchGThH9hBdI8 yuanjy@juweitu.com
The key's randomart image is:
+---[RSA 2048]----+
|   .. ..o .      |
|  .  o o . o     |
|   o  = . E .    |
|  . .. O..       |
|   . .OoSo.      |
|    .=++ *o      |
|   ..o..+..      |
|  . =.*=..       |
|   o oB@*o.      |
+----[SHA256]-----+
[www@node1 root]$ cd 
[www@node1 ~]$ cd .ssh/
[www@node1 .ssh]$ ll
總用量 8
-rw------- 1 www www 1679 4月  21 16:40 id_rsa
-rw-r--r-- 1 www www  400 4月  21 16:40 id_rsa.pub
[www@node1 .ssh]$ cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGS5bnpPvBPLkh/j3OJ8j3Z0dkxgUgLMT2ebeL0U/c7cQ6xGRgKajfLLb2xp+U4XCgU6kKBncXvFWh4PY7/eBPpVbpstJmtf/13gAYB/skHen+jl58k1JP4m/9W/aB6KW3PBRuWF9BA3ki0fHt624R2qSHoaveHiP2YK/9hsYhAizzdN3Y6JMCfSxZ7/FluLb+tXuASLuVQqyilxxZGkAjY0/15zntXyNTovAfseeRrmyAktvMgjK9ZfdGZp/nzS3LXclw2/QhAyT4mLL9FzLLWE2adYuBxj/42UrVZrc7bfkTMUllYvSq4Qkg0VS/8n5FLxEjAIKwPDTkbeTFVKan yuanjy@juweitu.com
[www@node1 .ssh]$ 

上面建立了一個www使用者,並生產了祕鑰檔案,在瀏覽器中點選個人頭像,點選settings進入設定,點選SSH keys


6006801-33e6a8dfaa993ef1.png
image.png

輸入剛剛生成的公鑰,點選Add key既可


6006801-37afb270dc95563c.png
image.png

獲取專案路徑,複製相關路徑
6006801-7ef07f5558ef57ee.png
image.png

在客戶端測試

[www@node1 ~]$ git clone git@gitlab.example.com:web/web-demo.git
正克隆到 'web-demo'...
ssh: Could not resolve hostname gitlab.example.com: Name or service not known
fatal: Could not read from remote repository.

#PS 因為我這裡是虛擬機器沒有配置相關域名,也沒有修改hosts,這裡就臨時把gitlab.example.com改成IP既可,後面可以修改配置檔案
Please make sure you have the correct access rights
and the repository exists.
[www@node1 ~]$ git clone git@192.168.66.129:web/web-demo.git
正克隆到 'web-demo'...
The authenticity of host '192.168.66.129 (192.168.66.129)' can't be established.
ECDSA key fingerprint is SHA256:wJyF35WdLaQJxzWYaVgjv61ujKzHcTw1DpR789UPUQ8.
ECDSA key fingerprint is MD5:3c:96:f6:ad:15:ba:73:fd:67:ac:54:52:84:4d:0a:b3.
Are you sure you want to continue connecting (yes/no)? yes       
Warning: Permanently added '192.168.66.129' (ECDSA) to the list of known hosts.
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
接收物件中: 100% (6/6), done.
[www@node1 ~]$ ll
總用量 0
drwxrwxr-x 3 www www 35 4月  21 16:49 web-demo
[www@node1 ~]$ cd web-demo/
[www@node1 web-demo]$ ll
總用量 4
-rw-rw-r-- 1 www www 44 4月  21 16:49 README.md
[www@node1 web-demo]$ cat README.md 
測試專用 測試 。。。。。。。。[www@node1 web-demo]$ 

至此Gitlab基本使用已經完成

三、Jenkins

3.1 Jenkins簡介

Jenkins只是一個平臺,真正運作的都是外掛。這就是jenkins流行的原因,因為jenkins什麼外掛都有
Hudson是Jenkins的前身,是基於Java開發的一種持續整合工具,用於監控程式重複的工作,Hudson後來被收購,成為商業版。後來創始人又寫了一個jenkins,jenkins在功能上遠遠超過hudson
Jenkins官網:https://jenkins.io/

3.2 Jenkins部署

Jenkins 是由java語言編寫,所以我們這裡需要java環境,我事先已經安裝好了1.8.0_161
PS:因為gitlab中的unicorn元件會監聽8080埠,而Jenkins預設也是監聽8080,這裡我們採用node2來部署jenkins

#jenkins自己提供了yum源,這裡採用yum方式,也可以採用原始碼編譯的方式

[root@node2 ~]# cd /etc/yum.repos.d/
[root@node2 yum.repos.d]# wget http://pkg.jenkins.io/redhat/jenkins.repo
[root@node2 ~]# rpm --import http://pkg.jenkins.io/redhat/jenkins.io.key
[root@node2 ~]# yum install -y jenkins
[root@node2 ~]# systemctl start jenkins

在瀏覽器端訪問http://192.168.66.130:8080,看到如下介面就說明啟動成功


6006801-e41fba6dd899cd00.png
image.png

檢視輸入密碼,登入進入,會看到如下頁面


6006801-1d480cc651aa3002.png
image.png

選擇安裝推薦外掛即可,等待安裝完成
6006801-fd40a9c6573e3997.png
image.png

填寫要建立的管理使用者這裡使用Admin 密碼為12345678,點選儲存並完成即可。


6006801-4f36ba388cc16d36.png
image.png

點選開始使用Jenkins即可
6006801-ab9c27f6e864ef80.png
image.png

至此基本的Jenkins已經正常的執行了

3.3 Jenkins外掛安裝

因為我們要和gitlab結合,所以這裡需要安裝gitlab的外掛
在系統管理中,進入外掛管理,搜尋gitlab


6006801-559691fd70bf7c76.png
image.png

按實際情況,選擇需要的外掛,點選下載待重啟後安裝既可


6006801-afa247db20e6f41e.png
image.png

等待安裝完成,並重啟Jenkins

四、實現持續整合

點選建立一個新任務,輸入任務名字,選擇自由風格,點選確定既可


6006801-8e01411a0385fd65.png
image.png

在原始碼管理新增原始碼路徑,點選Add,新增認證,這裡是git,如果是svn,需要安裝svn相關外掛


6006801-a32773fb2025d98d.png
image.png

選擇SSH認證方式
6006801-eb0d994ad067131c.png
image.png

在Gitlab上建立deploy keys


6006801-e25f09bc826eec43.png
image.png

點選新建,並在node2 新建www使用者,並建立祕鑰檔案
[root@node2 yum.repos.d]# useradd www
[root@node2 yum.repos.d]# cd 
[root@node2 ~]# passwd www
更改使用者 www 的密碼 。
新的 密碼:
無效的密碼: 密碼未通過字典檢查 - 過於簡單化/系統化
重新輸入新的 密碼:
抱歉,密碼不匹配。
新的 密碼:
無效的密碼: 密碼未通過字典檢查 - 過於簡單化/系統化
重新輸入新的 密碼:
passwd:所有的身份驗證令牌已經成功更新。
[root@node2 ~]# su www
[www@node2 root]$ ssh-keygen -t rsa -C "yuanjy@juweitu.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/www/.ssh/id_rsa): 
Created directory '/home/www/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/www/.ssh/id_rsa.
Your public key has been saved in /home/www/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:CSt+dEEFmyv40qJ5d1e/NbCHbn9fgEYLaf2FhKHuptk yuanjy@juweitu.com
The key's randomart image is:
+---[RSA 2048]----+
|        oo. .o.  |
|       . o +.. . |
|      . + = o . .|
|     . o * o + . |
|    o + S . +.o  |
|   . = o . .. +. |
|    + +   o. + oo|
|   o.+. .=. ..o.+|
|  o. . .o.E ..oo+|
+----[SHA256]-----+
[www@node2 root]$ cd
[www@node2 ~]$ ll
總用量 0
[www@node2 ~]$ cd .ssh/
[www@node2 .ssh]$ ll
總用量 8
-rw------- 1 www www 1675 4月  21 23:42 id_rsa
-rw-r--r-- 1 www www  400 4月  21 23:42 id_rsa.pub
[www@node2 .ssh]$ cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZZE5beieQdGcCQLkHjeh/4TJXwGnybLc7A0xVfTSQszjq7jx/m6jjE4pOHMQX/yUqb9Pg+NdvsJynpV1ZSNr/ojm18vR4S7sj+6nEV0kIP0IWOLeqSlHKvr9BFggkvcAjSTzsSc31P1Wn8rs6z9xag8WWK759vSz1BdG85fW5xgDdlu8ynwGulF6roOa2pAKhCCk2ibRvwYbpElVGcFA6taf7LOnR63842JsYbeC+a8XTcZmWFWVq8JYfeDcoHZ/61gC9lmiIlsVlEGifAJaM6KHQxkViQtEpWzgfRvKEnBmXigiCUvbJPBNSPCbzSPVYK+Yv1llBsGJQfp/74glD yuanjy@juweitu.com
[www@node2 .ssh]$ 

6006801-37cce64f2b99af20.png
image.png

點選Create既可,填寫私鑰檔案,點選Add既可


6006801-983af17c6d4f4343.png
image.png

點選儲存既可,點選立即構建


6006801-17d17d0356e0a50c.png
image.png

點選檢視檢視控制檯
6006801-0706d29f16221ebd.png
image.png

至此持續整合初步已經完成了

相關文章