近期因爲工做緣由須要學習jenkins持續化集成。對於一個好學又帥氣的我來講。學習他還不是手到擒來。公司爲一箇中小型創業公司,在部署代碼上面,不多用gitlab、jenkins等等,也沒有清晰的生產環境-測試環境-線上環境之分。惟一有的就是寫完代碼-登錄服務關閉服務,上傳代碼-開啓服務。這樣每每會到來不少問題,同時也會給程序員帶來不少繁瑣的工做。這不,公司內部整頓,須要一套清晰的流程,並且爲了減輕程序員的負擔,因而就但願採用gitlab+jenkins來部署代碼。php
程序員經過提交代碼到gitlab上;觸發jenkins自動部署觸發器;部署到測試服務器,若是正常,提交到正式線上環境html
Ubuntu18.04 :python
網絡:內網環境 服務:gitlab環境
Ubuntu16.04:mysql
網絡:內網環境 服務:jenkins
Centos 7 :nginx
網路:公網環境 服務:php+nginx+mysql
公網環境爲一個測試環境,這裏沒有線上環境,引一個環境就能夠,測試成功上線是同理的道理。git
爲何從1到自動化部署呢?是由於我不太想寫安裝部署的過程。過程很是簡單,沒有坑點和難點。稍稍百度一下就有不少。程序員
前提條件:
一、你要有本身的gitlab帳號和本身的項目,固然用別人的項目也行,不過在後面設置一些權限信息的時候,可能會很麻煩別人。因此本身的纔是最方便的。
二、你的公網服務器必定要能訪問到內網gitlab的項目,由於爲了減小出錯,採用的是公網服務器pull gitlab的代碼。具體的咱們後面聊。
三、有一個不怕困難的心,和帥氣的臉。web
點擊系統管理-插件管理,經過搜索框便可下載你想要對插件。這個在剛初始化jenkins的時候也有一次安裝插件的步驟,儘可能裝,使勁裝。根據本身的需求哈!sql
一、新建任務
二、輸入任務名稱-選擇-選擇流水線-肯定
簡要介紹一下這幾個項目的優缺點shell
Freestyle Job
需在頁面添加模塊配置項與參數完成配置
每一個Job只能實現一個功能
沒法代碼化,不利於遷移與版本控制流水線項目
全部參數均可以體現爲一個pipeline腳本
能夠定義多個stage構建一個管道工做集
配置代碼化,方便Job配置遷移與版本控制
腳本寫在Jenkins項目裏多分支流水線
優勢同流水線
腳本寫在GitLab項目裏(Jenkinsfile)
關於多分支的流水線,推薦博客https://blog.51cto.com/12639039/2352222
三、進入到job的配置界面-點擊構建觸發器
General不須要配置
由於需求是程序員向gitlab提交了新的代碼,jenkins觸發。因此在構建觸發器的時候選擇下面這個選項
這裏請不要忽略Gitlab webhook URL:。這個webhook就是用來觸發jenkins自動構建的。
點擊高級,建立 Secret token
四、gitlab上添加步驟3 的webhook
在url處填寫webhook;Secret Token處填寫步驟三隨機生成的字符串。完成過,點擊添加便可。
在這裏能夠進行測試連通性。
注意到這裏的時候,你可能會遇到一個問題:有些用戶添加的時候會報這樣一個錯誤,
說是不容許本地網絡請求。這是因爲新版本安全性的問題形成的,很是容易解決!
解決方法:使用gitlab管理員帳戶登錄。
將那兩個所有勾選。而後回去從新添加便可。
五、編寫pipeline腳本
這裏有兩個選擇,第一個是在這裏直接寫入腳本(舒適提示,腳本在本身電腦上的編輯器上寫好粘貼到這裏,由於這裏的編輯器像吃了翔同樣難用!太難了。。。)第二個是使用jenkinsfile文件。我使用了第一個(由於演示操做簡單,易懂!嘿嘿)。
寫完後點擊保存。便可完成一個job的建立
你覺得這就完了。最重要的纔剛剛開始!!!!!!!!!!!!!!!!!!!!!!!!!!!
讓咱們再來回顧一下需求:
程序員經過提交代碼到gitlab上;出發jenkins自動部署觸發器;部署到測試服務器,若是正常,提交到正式線上環境。不過,我以爲這個沒有任何挑戰性。我想本身加點難度,無論部署過程是否成功,都要有個釘釘消息發到程序員小哥哥的羣裏,給他們個警示!
話很少說,上代碼一點點解釋:
舒適提示:這是我爲了知足自身須要而編寫的代碼,請不要照搬,固然與我有一樣需求的隨意嘍。同時中間的解釋也根據個人代碼去解釋,沒有刻意去講解語法,請諒解!
pipeline{ agent any stages{ stage("拉去代碼"){ steps { echo "STEP 1 :clone code" } } stage("打包代碼"){ steps { echo "step 2 : code package" sh label: '', script: '/usr/bin/ssh -p 62322 root@*.*.*.* "cd /var/www/html/pipeline/mytest && git pull && chmod -R 777 /var/www/html/pipeline/mytest/storage && composer install"' } } stage("上線發佈"){ steps { echo "step 3 :deploy package" } } } post { success { dingTalk accessToken:'釘釘機器人的token', imageUrl:'圖片的url', jenkinsUrl:'http://192.168.5.194:8080/', message:'pipeline-test代碼部署成功。', notifyPeople:'' } failure { dingTalk accessToken:'釘釘機器人的token', imageUrl:'圖片的url', jenkinsUrl:'http://192.168.5.194:8080/', message:'pipeline-test代碼部署失敗'。, notifyPeople:'' } } }
詳解:
agent
指示 Jenkins 爲整個流水線分配一個執行器(在 Jenkins 環境中的任何可用代理/節點上)和工做區。
echo
寫一個簡單的字符串到控制檯輸出。注意這裏不是shell命令行的echo或php語法。和他們做用相同而已。
stage
定義了在整個流水線的執行任務的概念性地不一樣的的子集(好比 "Build", "Test" 和 "Deploy" 階段), 它被許多插件用於可視化 或Jenkins流水線目前的 狀態/進展.
可能這句話不太形象(我第一次看官文也是矇蔽),來張圖
其中最後一個是post處理的狀態。
在打包代碼的stage塊中
sh label: '', script: '/usr/bin/ssh root@*.*.*.* "cd /var/www/html/pipeline/mytest && git pull && chmod -R 777 /var/www/html/pipeline/mytest/storage && composer install"'
這是經過jenkins的片斷生成器生成的符合語法的命令,能夠在shell中去執行的命令
那麼,如何使用jenkins片斷生成器?
(1)、點擊流水線語法
(2)、從實例步驟中選擇sh:shell script。在文本框輸入須要生成的shell命令,
(3)、點擊生成流水線腳本 按鈕便可成成相應的流水線語法
Post
相似於python中try語句。如何根據stage執行的結果而進行特定處理則是實際Pipeline使用中常常會碰到的問題。因此這裏post就是來作對異常處理的功能。同時,你也能夠理解爲自由風格中的構建後的操做步驟(在自由風格中發釘釘能夠下載dingding的插件)。而這個post塊,就是我要知足本身加的釘釘反饋的需求。說到這裏爲了讓你們更明白post的使用方法想再多解釋一下:
使用限制:
須要寫在pipeline或者stage塊中
注意:post塊的位置必定要遵循這個原則,不然不會執行。
支持的條件預置:
always: 不管pipeline或者stage的執行結果如何,此塊中的預置操做都會執行。
changed:只有當pipeline或者stage的執行後,當前狀態與以前發生了改變時,此塊中的預置操做纔會執行。
fixed:前一次運行爲不穩定狀態或者失敗狀態,並且本次運行成功結束,這兩個條件同時知足時,此塊中的預置操做纔會執行。
regression: 本次運行狀態爲不穩定狀態,失敗狀態或者是停止狀態,並且前一次運行成功結束,這兩個條件同時知足時,此塊中的預置操做纔會執行。
aborted:當前pipeline或者stage的狀態爲aborted時,此塊中的預置操做纔會執行。一般是因爲流水線被手工中會致使此狀態產生,而產生此狀態後,一般在Jenkins的UI界面會顯示爲灰色。
failure:當前pipeline或者stage的狀態爲failed時,此塊中的預置操做纔會執行。而產生此狀態後,一般在Jenkins的UI界面會顯示爲紅色。
success:當前pipeline或者stage的狀態爲success時,此塊中的預置操做纔會執行。而產生此狀態後,一般在Jenkins的UI界面會顯示爲綠色。
unstable: 當前pipeline或者stage的狀態爲unstable時,此塊中的預置操做纔會執行。一般狀況下測試失敗或者代碼規約的違反都會致使此狀態產生,而產生此狀態後,一般在Jenkins的UI界面會顯示爲黃色。
unsuccessful:當前pipeline或者stage的狀態不是success時,此塊中的預置操做纔會執行。
cleanup:不管pipeline或者stage的狀態爲什麼種狀態,在post中的其餘的條件預置操做執行以後,此塊中的預置操做就會執行。
我用到了兩個,分別是success和failure,在成功時應該作什麼操做,在失敗時應該作什麼操做。
dingTalkaccessToken:'釘釘機器人的token', 若是不知道如何添加釘釘機器人,去隔壁百度便可
imageUrl:'在發送的信息裏會附加這個圖片',
jenkinsUrl:'本身jenkins的訪問地址', 發送的信息就是這個連接,能夠直接跳轉到咱們的jenkins
message:'發送的文本信息、提示信息',
notifyPeople:'須要通知的人'
到這裏個人腳本的大概狀況也就介紹完畢。若是想了解詳細的jenkins語法,推薦學習地址
https://jenkins.io/zh/doc/book/pipeline/ 中文的,並且挺詳細。我這裏寫的腳本僅僅是知足個人我的需求,有相似需求的夥伴能夠參考!
再來一個舒適提示:初學者必定注意好代碼塊的書寫,儘可能作到規範,由於這樣纔好容易排錯。 Groovy 語法大都代碼塊可能由於一個花括號就能找個半天。因此儘可能規範。若是有 Groovy 語法高亮的編輯器就更好了。
4、測試job運行狀況
點擊當即構建
執行完畢後,經過控制檯輸出能夠看到整個過程
釘釘消息
到此便大功告成,讓大家的程序員小哥哥去推代碼試試吧!