1.1 開發寫代碼的演變
好景不長,開發越來越多,代碼文件越來越多,每天下班前合並代碼時,發現很多合並失敗的文件。最后每天加班3小時人工合並代碼。
解決方法:將合並代碼的周期縮短,以前一天,現在一小時,半小時。。。
隨時隨地地將代碼合並,這種方法叫做持續集成。
1.2 持續集成(簡稱CI)
說明:持續集成說的是頻繁地(一天多次)將代碼集成到主干。
它的好處主要有兩個:
1、快速發現錯誤。每完成一點更新,就集成到主干,可以快速發現錯誤,定位錯誤也比較容易。
2、放置分支大幅偏離主干。如果不是經常集成,主干又在不斷更新。會導致以后集成的難度變大,甚至難以集成
1.3 JENKINS的作用
說明:借助一個自動化的部署工具,叫做JENKINS,開發上傳自己的代碼到GITLAB(私有倉庫),GITLAB(私有倉庫)發信息通知JENKINS,隨后JENKINS從倉庫拉取代碼,最后全自動部署到測試服務器進行相關測試,並將測試結果通知運維和開發,更懶得方法可把這個工具可給開發使用,這樣以后就事情少了很多,這種自動測試的方法叫做持續交付。
1.3.1 JENKINGS作用個人簡單小總結
說明:相當於開發將代碼上傳到GITLAB私有倉庫,倉庫就會自動通知JENKINS自動從倉庫里拉取代碼,最后部署到測試服務器里測試,測試的好壞結果通知發給運維和開發。
1.4 持續交付
持續交付指的是,頻繁地將軟件的新版本,交付給質量團隊或者用戶,以供評審。如果評審通過,代碼就進入生產階段。
持續交付可以看作持續集成的下一步。它強調的是,不管怎么更新,軟件是隨時隨地可以交付的。
1.5 持續部署
持續部署是持續交付的下一步,指的是代碼通過評審以后,自動部署到生產環境。將代碼部署到服務器,就叫持續部署,可使用ansible或JENKINS,但是公司不是很相信工具,所以絕大部分都相信人工上線部署。
行話
CI/CD 持續集成/持續交付/持續部署。
1.6 JENKINS介紹
JENKINS用JAVA編寫的開源的持續集成工具,相當於寫好任意的shell腳本和windows批處理命令可放到JENKINS自動運行,自動部署。
1.7 安裝JENKINS的環境准備
1、准備2台安裝好Centos7.2系統的虛擬機,內存1G+
2、所有虛擬機的防火牆和Selinux關閉
3、主機名及IP地址關系如下:
Jenkins 10.0.0.202 #不需要安裝軟件
Gitlab 10.0.0.201 #安裝好gitlab
4、Linux中能發郵件的賬號
1.8 安裝JENKINS的方法
1.8.1 使用RPM包安裝
RPM包下載地址:
http://pkg.jenkins.io/redhat-stable/
清華園地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/
1.8.2 yum安裝jdk
yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel #只有安裝了jdk軟件才能使用jenkins的軟件。
1.8.3 安裝rpm包
rpm -ivh jenkins-2.73.1-1.1.noarch.rpm #這里可以去官網下載,然后安裝這個rpm包,因為沒有任何依賴。
1.8.4 啟動
/etc/init.d/jenkins start
1.8.5 打開網頁安裝Jenkins
http://10.0.0.202:8080 #切記是8080端口。
這里需要解鎖Jenkins,需要按照他給的路徑,進行復制密碼填入框里。
cat /var/lib/jenkins/secrets/initialAdminPassword #打開這個文件,並且復制密碼到網頁里點擊Continue下一步,里面的密碼是每次隨機的,不是固定的,當要再次輸入密碼時再打開文件復制密碼。
提示安裝插件,默認安裝與自定義安裝都是找官網下來,過程比較慢,這里什么都不選,點擊右上角的X取消。
跳過安裝插件的界面。
這就是jenkins的歡迎使用界面了。
1.9 解壓插件放置Jenkins插件目錄
cp plugins.tar.gz /var/lib/jenkins/ #我的插件壓縮包是針對plugins這個目錄的,所以需要放到這個目錄進行解壓
tar -xf plugins.tar.gz #進行解壓這個文件,將插件文件放到文件夾里面。
/etc/init.d/jenkins restart #解壓完后,要重啟jenkins才能生效,常用插件就已經補全了,所有默認的插件都在里面了。
1.10 重啟jenkins后需重新登陸
10.0.0.8:8080 #打開網頁
cat /var/lib/jenkins/secrets/initialAdminPassword
admin #默認賬號
f72d71394e594007918aff6509a1ba73 #索取文件密碼
1.11 查看是否安裝好插件
這里確認,已經安裝好了。
1.12 Jenkins配置文件說明
[root@oldboyedu-47 plugins]# rpm -ql jenkins #查看Jenkins的配置文件路徑
/etc/init.d/jenkins #啟動文件
/etc/logrotate.d/jenkins #日志分隔配置文件
/etc/sysconfig/jenkins #Jenkins主配置文件
/usr/lib/jenkins
/usr/lib/jenkins/jenkins.war #war包存放目錄
/usr/sbin/rcjenkins #命令
/var/cache/jenkins #var包解壓目錄,jenkins網頁代碼目錄
/var/lib/jenkins #Jenkins工作目錄 ***
/var/log/jenkins
1.13 配置並發執行任務數量
系統管理-系統設置
根據電腦配置來填寫,這個數量是要起進程數的,改成5。
1.14 郵件配置
系統管理》系統設置
讓Jenkins用郵件的方式通知我,這里填寫要發送郵件的郵箱
像全網備份一樣,填寫使用什么服務器發送郵件,填寫smtp.163.com,還有用戶郵箱后綴以什么為結尾,還有smtp的用戶名和密碼,最下面還有一個發送郵件測試,前提是前面的配置都配置好了后才可以,最后點擊保存,
重要提示:可能163郵箱有點問題,可能往后需要用到126的郵箱地址來做測試
1.15 新建一個任務
填寫一個項目名字,點擊第一個“構建一個自由風格的軟件項目”,最后點擊OK。
將GitLab的項目源地址復制
在Jenkins頁面下面找源碼管理-選擇Git-將GitLab的項目地址寫入框框里,記得將地址改成IP地址,因為沒有解析,填入進去之后會有紅色提示,提示需要密鑰。
這里有一個原理圖
在Jenkins服務器操作:
[root@oldboyedu-47 plugins]# ssh-keygen #生成密鑰
[root@oldboyedu-47 plugins]# cat /root/.ssh/id_rsa.pub #打開密鑰將密鑰復制粘貼到Git密鑰管理那,添加一個公鑰,
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTK9DGLclX4wK7GbnRZvlIKEOUuHtHg7OyBM9UEkali45utx2M4S78gu7hDTsDCZu5wNzyCywkkEOubaB0HmB5PWOeDaXftozWity4C857Yqu2ESaJ2fdnTq1CX4GI+89xE4RyuhE6nTol75eXrb7aUfq0r+yioTAM5ADV/b+y7hxdLOVNtED1TnPQP61mpC7UH87Oc/UgCzVH50wJ5XgdLyrN1QAiVhArqnJN3/KrKf5OEdo8SLfDqCLVXJc28Hg2c6ObnljRdM8ZhGHwBPQRLifMFWj2K7G1JauRqs/m+fZRC0Ybf+p2NNYJ+E4RYe5j8RedHDdq4/A7OVvCL16z root@oldboyedu-47
GitLab網頁上操作:
因為GitLab改版了,功能很多出現在別的地方,所以要搜索這個Profile Settings,在點擊SSH Keys
將剛才Jenkins服務器的SSH公鑰對放在里面,點擊ADD添加。
Jenkins網頁上操作:
在GitLab上添加了Jenkins的公鑰,這時候想在Jenkins上訪問GitLab就需要做這步,點擊Add,點擊Jenkins,把私鑰放在我的Jenkins里。
選擇SSH那一欄
填寫git,因為git運行用戶是git
這時候這個私鑰可以選擇在自己的家目錄去讀取等等其他方式,這里我選擇了直接輸入密鑰的信息
Jenkins服務器上操作:
[root@oldboyedu-47 plugins]# cat /root/.ssh/id_rsa #打開私鑰的信息,把里面所有打印出來的信息全都要復制。
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA0yvQxi3JV+MCuxm50Wb5SChDlLh7R4OzsgTPVBJGpYuObrcd
jOEu/ILu4Q07AwmbucDc8gssJJBDrm2gdB5geT1jng2l37aM1orcuAvOe2KrthEm
idn3Z06tQl+BiPvPcROEcroROp06Je+Xl62+2lH6tK/soqEwDOQA1f2/su4cXSzl
TbRA9U5z0D+tZqQu1B/OznP1IAs1R+dMCeV4HS8qzdUAIlYQK6pyTd/yqyn+ThHa
PEi3w6gi1VyXNvB4NnOjm55Y0XTPGYRh8AT0ES4nzBVo9iuxtSWrkarP5vn2UQtG
G3/qdjTWCfhOEWHuY/EXnRw3auPwOzlbwi9eswIDAQABAoIBAENoYSRhyTu8w0pm
U+J8NGbMM4ZtvSx+5gWVc3kqvFJr0fOVkGFAIHeKdCZyyruVfZg18FFzL4wcYP51
EBsA91q8NehmAuT+qMZzXTGC006fmKBtqRen9EmN29CsG/VWLEm0KTtWGdnUBpPF
f2Zzl9CpCpZS8f6X5Xa38Wxdq6u5sekE4qeYuttYIFyzwgBWyzMezqKpz1Cgjsyj
nJjg2G8f0YRBoY+3f+fqDSgf1nTdZkKOzTysoPhh2Y1TrpgbaVldkElMe7FCpmaC
ddOR4wPnfH3bhU3ECsdgtHc9RjBmsaHG7LXoedjTqPuYvbBoGBb7HrF5vLvn42k7
woeVY8ECgYEA7hYaDO7KKDs81zgfD+wqVA5p7V+V2nzpgXQzltnPR55F0cos61YB
zJjVMFF0qnc8SXgNMo0bdxqs1YMdToR4Q68gYxuFBo42XpO1Xu4Hwz63cICrLu1G
W8H99JCLdPwt4AoPWdBl5otn1GNzKdPsLSRlJLS6LiwLy/HgOdOGyH0CgYEA4w9J
hkdHp+ZhKAm8MF8OH/Y+IaKmR1iiP3ZHaziJfulSeyFg79/lQPABvR0OMxj1shht
mlPqBr3lpKe+spM3SCW8RmNbVy9kIkn7so+NHcJgyENjI7LUAFihpa1mQ4xdcFYm
uO+zUxmHLxVqf3c/BkbZgvSdYiohq6n7f0jrmu8CgYEAqijDr5COjRhhUFQ85w1b
5z1x+YQCPuhdnvbk1CCRY1c8AUckuYF7wbVNUL42yopzXPLfQ8zT31kCQ4r0zCQj
LASi+hI2DcxgEVIyI0mt5J4TTuW28tAEJBpOnZcdBJwjUWb/N6qY2Z+ysnntWeyr
dEv5ubUtB0jVmYoiPlHul6UCgYEAl+UoKH4Sv41svV4V2L4eMt+GHPY0ClKO56l2
iZHe2Vm45cokkRPUx6ZHY33GfARciPGykKVGT5BFyeq1tbyqJMepteTNu/tmH1Ii
4QcLPjdEi3QZJE6DaF/ic3UWjmWeNIJNkTY5XoQbXTIUdoUNUmOfKu39QygwMiia
qEHd610CgYEAgHDY5kEuTHkcG6k+tB4I60ty1bvbyskf7cVk/FUVMl4oKrpBCbN3
YXY3UtKYwbn4a9/TGBSbNvAg0MgGCdlM9Bf4+cWZFJMRW/GgldtRYoTorFlwjE1I
yeqwxjFcSoMDBGrKqSoJjP6AxSRCF4iJ3azHydTWv+U1HgVNWOn1VZc=
-----END RSA PRIVATE KEY-----
Jenkins網頁上操作:
將Jenkins機器的密鑰放在里面就好了。
最后點擊ADD
這時候會出現一個新的選項叫做,git,選擇他,這就是Git的關聯方法了。
找到下方的構建,然后選擇第二個Execute shell(執行命令)
填寫復制所有東西到/data/www目錄的命令,然后保存,這時候就完成了一個項目了。(這里相當於Jenkins復制GitLab倉庫的文件到Jenkins工作目錄后要執行的權限)
Jenkins服務器上操作:
[root@oldboyedu-47 ~]# mkdir /data/www –p #創建目錄,要讓GitLab所有的東西都復制到Jenkins服務器上的/data/www目錄下
[root@oldboyedu-47 ~]# chown -R jenkins.jenkins /data/www #jenkins的進程是jenkins用戶控制的,所以這里也要改成jenkins
jenkins會從gitLab里拉文件到jenkins服務器上的/var/lib/jenkins/workspace目錄下以項目名稱同名的“php-deploy”
Jenkins網頁上操作:
點擊Jenkins大圖標,回到主頁,會看到一個項目,這時候准備從GitLab里啦代碼下來,在執行那個cp那個命令
GitLab網頁上操作:
因為要測試自動化同步,所以在GitLab這個倉庫里創建一些新文件來測試,也可以在GitLab這個服務器工作目錄當中去創建文件,這里為了快速,所以這里在Git網頁里按加號+來選擇New file添加新的文件作為測試。
隨便寫一個文件名稱和內容
然后最后在下面點擊保存。
這里是成功新建文件的結果,如果不創建的文件的話,是無法啦文件的,在生產環境當中開發不是這樣去編輯文件的的,都是在工作目錄環境當中去寫文件的,這邊為樂兒快速測試,所以這樣去做。
Jenkins網頁上操作:
在Jenkins網頁中點擊剛才創建的項目,有個小鬧鍾類似於播放器一樣,點擊一下,會自動把我們的東西啦到Jenkins里部署復制(因為我們只寫了cp,要想裝環境等得收集安裝環境的命令,類似於寫腳本。),也可以點擊允許自動刷新,在“構建執行狀態”會有一個過程,可以仔細看,完成后顯示空閑。
這是正在部署的狀態。
Jenkins服務器上操作:
[root@oldboyedu-47 php-deploy]# ls /var/lib/jenkins/workspace/php-deploy #此時在GitLab新建的文件就會先拉到到這個Jenkins目錄下的項目目錄
123test asdasdastest #這是剛才新創建的文件
[root@oldboyedu-47 php-deploy]# ls /data/www #先將GitLab倉庫的文件拉到Jenkins的默認目錄,在執行部署的cp命令,將他拉到指定的目錄/data/www
123test asdasdastest #此時已經將默認目錄的東西拉到指定目錄了。
Jenkins的工作目錄: /var/lib/jenkins/workspace/php-deploy #php-deploy是jenkins里創建的項目名稱
部署指定的目錄: /data/www
功能小總結:
不管可以執行cp,ssh,或者export安裝環境變量等命令都可以執行,可以幫你一鍵搭建部署,只要有代碼,剩下就是拉到指定倉庫做指定的事情,像寫腳本一樣,指定路徑,執行環境初始化,在啟動服務等。
1.16 在Jenkins平台上查看GitLab導入數據到Jenkins工作目錄的(失敗或成功)的操作記錄
點擊成功的#號,或者失敗的#號
點擊Console output
原理就是在jenkins新建一個腳本,然后把命令在里面操作,這個腳本在/tmp目錄下,執行完就自己刪除自己這個腳本。
失敗的也是同樣操作看法。
1.17 Jenkins自動部署命令說明
只要在jenkins工作平台上的一個項目里,在他的構建選項里填入命令就好了,當然第一步有復制cp 文件到某個目錄,然后怎么執行什么環境變量,啟動服務等命令都可以,總結一點就是要准備好配置文件,再准備好啟動服務的命令。
1.18 配置Gitlab Push自動觸發jenkins構建(開發新建代碼,jenkins自動更新並且觸發部署命令)
步驟一、下載gitlab plugin
Jenkins>插件管理
下載並安裝gitlabplugin
步驟二、配置gitlab認證
路徑
Jenkins網頁上操作:
點擊Credentials-System-Global creadentials的按鈕
點擊Add多創建一個Git
選擇GitLab API token那個選項
GitLab網頁上操作:
搜索框里搜索Profile settings后,在點擊Account
這有一個token,復制一下,粘貼到Jenkins的界面
Jenkins網頁上操作:
將剛才的token粘貼到API tokne框框里,然后填寫一個描述為GITLAB,不用管,就這樣填寫,填寫完后,再點擊OK
在到Jenkins里的主頁里點擊系統管理,
點擊系統管理-系統設置
找到Gitlab區塊的地方,然后第一個隨便取一個連接的名字,第二個URL填寫GitLab的IP地址,第三個直接點擊下拉框可以看到我們剛才配置好的GitLab API tonke的選項。
故障:test connection測試時出現error錯誤。
/etc/gitlab #GitLab服務器上打開這個網頁編輯
external_url 'http://10.0.0.7' #修改oldboyedu為GitLab倉庫的IP地址,否則不能解析
gitlab-ctl restart #執行這個命令,重啟Git所有組件
gitlab-ctl reconfigure #執行這個命令,對GitLab進行重配置並且重新啟動,主要是讓剛才那個配置文件修改后生效。
最后刷新一下也
最后是使用ssh密鑰對的方式連接成功並且同步的,沒有用token的方式。
說明:簡單來講是在jenkins中對gitlab的倉庫設置一個token和倉庫地址,后向gitlab的倉庫設置了剛jenkins生成的token值,讓其倉庫和jenkins對接起來,原理是當用戶觸發push操作,就會自動合並到master分支上。
1.19 關於Jenkins部署代碼權限三種方案
1.19.1 方法一:修改jenkins進程用戶為root
vim /etc/sysconfig/jenkins #修改Jenkins的主配置文件
JENKINS_USER=”jenkins” #在這里可以修改。
1.19.2 方法二:將代碼目錄用戶改為jenkins
mkdir /data/www –p
chown –r jenkins.jenkins /data/www
1.19.3 方法三:使用sudo授權
visudo
1.20 自動化構建腳本
#!/bin/sh
DATE=$(date +%Y-%m-%d-%H-%M-%S)
HOST="10.0.0.7"
CODE_DIR="/var/lib/jenkins/workspace/my-freestyle-job"
WEB_DIR="/var/www/"
GET_CODE(){
echo git_get
}
TAR_CODE(){
cd $CODE_DIR
tar zcf /opt/web-${DATE}.tar.gz ./*
}
SCP_CODE_WEB(){
scp /opt/web-${DATE}.tar.gz $HOST:${WEB_DIR}
}
TAR_XF(){
ssh $HOST "cd $WEB_DIR && mkdir web-$DATE && rm -rf html && tar xf web-${DATE}.tar.gz -C web-$DATE"
}
DEPLOY(){
ssh $HOST "cd $WEB_DIR && ln -s web-$DATE html"
}
main(){
GET_CODE
TAR_CODE
SCP_CODE_WEB
TAR_XF
DEPLOY
}
main