1. 程式人生 > >Jenkins實現持續整合中的那些坑

Jenkins實現持續整合中的那些坑

小夥伴在《這些年我們一起搞過的持續整合~Jenkins+Perland Shell script》中詳細介紹了優化後的job流,接下來總結一下在構建這一套job中遇到的Shell  Script和Jenkins的問題。

1.      比較兩個檔案後有特殊字元< 會導致Jenkins job failure;

圖片1

解決方法:過濾特殊字元<同時利用diff–b去除最後的錯位行,更多diff使用請參考diff--help;

-------------1)

[[email protected]]$ diff current.txt base.txt

1,2d0

<annzan

<wadexu

52c50

<davima

---

>davima

-----------2)

[ann[email protected]]$ diff -b current.txt base.txt

1,2d0

<annzan

<wadexu

-------------3)

[[email protected]]$ diff -b current.txt base.txt | grep "<"|sed 's/^<//g'

annzan

wadexu

2.      awk按分隔符分段輸出,例如 echo $PROJECT_LIST|awk –F “,”‘{print $1}’ 。 將PROJECT_LIST遍歷輸出,需要引數化輸出段數,$$id肯定是不行的;

解決方法: echo $PROJECT_LIST|awk  -v id=$id  -F”,” ‘{print$id}’

這邊之前也試過cut這個命令去分隔字串, echo $PROJECT_LIST|cut  -f $id  -d “,” 但是這裡有個問題,當PROJECT_LIST中沒有,這個分隔符的時候,不論id是幾結果都是本身。所以cut命令無法實現我們想要遍歷所有project的初衷,除非強制PROJECT_LIST一定要有一個分隔符。

3.      用curl命令呼叫下一個job大大提高了我們job流程的靈活機動性,同時用data json將引數值也一起傳遞到下一個job,實現我們整個流程的引數化。

curl -X POST --user "jadmin:71103407"-s http://vm10686.global.test.net:8080/view/Template/job/Template_Service_Commit_Auto_Build/build --data json='{"parameter":[{"name":"PROJECT_NAME","value":"'$projectName'"},{"name":"PIPELINE_NUM","value":"'$BUILD_NUMBER'"}]}' 

注意: value後面雙引號裡面直接加值,如果是引數的話,需要在引數名外面加單引號。

4.       這裡著重講一下我們遇到的天坑,單引號,雙引號再順便提一下反引號和反斜槓。[轉自網際網路]

 1. 單引號( '' )
# grep Susan phonebook 
Susan Goldberg 403-212-4921 
Susan Topple 212-234-2343 
如果我們想查詢的是SusanGoldberg,不能直接使用grep Susan Goldberg phonebook命令,grep會把Goldbergphonebook當作需要搜尋的檔案
# grep 'Susan Gold' phonebook 
Susan Goldberg 403-212-4921 
shell碰到第一個單引號時,它忽略掉其後直到右引號的所有特殊字元

2. 雙引號( " " )
雙引號作用與單引號類似,區別在於它沒有那麼嚴格。單引號告訴shell忽略所有特殊字元,而雙引號只要求忽略大多數,具體說,括在雙引號中的四種特殊字元不被忽略:$,\,`,!,即雙引號會解釋字串的特別意思,而單引號直接使用字串.如果使用雙引號將字串賦給變數並反饋它,實際上與直接反饋變數並無差別。如果要查詢包含空格的字串,經常會用到雙引號。
# x=* 
# echo $x 
hello.sh menus.sh misc.sh phonebook tshift.sh 
# echo '$x' 
$x 
# echo "$x" 

這個例子可以看出無引號、單引號和雙引號之間的區別。在最後一種情況中,雙引號告訴shell在引號內照樣進行變數名替換,所以shell$x替換為*,因為雙引號中不做檔名替換,所以就把*作為要顯示的值傳遞給echo對於第一種情況需要進一步說明,shell在給變數賦值時不進行檔名替換(這從第三種情況中也能看出來),各步驟發生的精確次序如下: shell掃描命令列,把x的值設為星號*
shell再次掃描命令列,碰到星號*,把它替換成當前目錄下的檔案清單;
shell啟動執行echo命令,把檔案清單作為引數傳遞給echo. 
這個賦值的先後次序非常重要:shell先作變數替換,然後作檔名替換,最後把這行處理為引數

3. 反引號(``)
命令替換是指shell能夠將一個命令的標準輸出插在一個命令列中任何位置。shell中有兩種方法作命令替換:把shell命令用反引號或者$(...)結構括起來,其中,$(...)格式受到POSIX標準支援,也利於巢狀。
# echo The date and time is `date` 
The date and time is 6 15 06:10:35CST 2005 
# echo Your current working directory is $(pwd) 
Your current working directory is/ home/annzan/test

4. 反斜槓backslash-escaped( \ )
反斜槓一般用作轉義字元,或稱逃脫字元,linux如果echo要讓轉義字元發生作用,就要使用-e選項,且轉義字元要使用雙引號
echo -e "\n" 
反斜槓的另一種作用,就是當反斜槓用於一行的最後一個字元時,shell把行尾的反斜槓作為續行,這種結構在分幾行輸入長命令時經常使用

5.      由單雙引號引發的血案還有很多,比如下面遇到的中括號,if後面加中括號,注意加空格,可是結果卻總是不對:


整了半天發現還是雙引號的問題,字串比較需要把$test放在雙引號裡,或者在外面再加一箇中括號:

 

6.      grep和egrep的使用區別

1)     grep  [option]  pattern  filename 注意: pattern如果是表示式或者超過兩個單詞的, 需要用引號引用. 可以是單引號也可雙引號, 區別是單引號無法引用變數而雙引號可以.

2)     egrep= grep -E 可以使用基本的正則表達外, 還可以用擴充套件表示式. 注意區別.
擴充套件表示式:
+ 匹配一個或者多個先前的字元, 至少一個先前字元.
? 匹配0個或者多個先前字元.
a|b|c 匹配a或b或c
() 字元組, 如: love(able|ers) 匹配loveable或lovers.
(..)(..)\1\2 模板匹配. \1代表前面第一個模板, \2代第二個括弧裡面的模板.
x{m,n} =x\{m,n\} x的字元數量在m到n個之間.

具體使用請參考grep –help;  egrep -- help

7.      當引數名是引數時,取值用eval。 例如configfile中每個定義兩個project的GIT_PROJECT_NAME,用projectname作為字首:

PROA_GIT_PROJECT_NAME=git_proa

PROB_GIT_PROJECT_NAME=git_prob

當用project name作為引數時,$($PROJECT_NAME_GIT_PROJECT_NAME)是沒有這種寫法的,正確取值如下: GIT_PROJECT_NAME=${PROJECT_NAME}"_GIT_PROJECT_NAME"

GIT_PROJECT_NAME=$(eval echo\${$GIT_PROJECT_NAME})

8.      大俠用perl語言寫了打包安裝等核心功能,需要執行這些指令碼前,需要把指令碼路徑加到path裡,要不然有核心程式碼也執行不了:

1)     把路徑添到PATH路徑裡面

       cd ${SCRIPTS_HOME}

       chmod 755 *

       export PATH=$PATH:`pwd`

2)      直接修改.bashrc檔案

檔案被開啟如下 
# .bashrc 
# Source global definitions 
if [ -f /etc/bashrc ]; then 
. /etc/bashrc 
fi 
# User specific aliases and functions 
export PATH=/home/annzan/bin:$PATH 
-----增加自己的Path,在已有:$PATH的之前 儲存並退出 
[[email protected] ~]$ . .bashrc 
.相當於source讓修改生效 
[[email protected] bin]$ echo $PATH 
/home/annzan/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin

9.      上面講到.bashrc檔案,就順便記錄一下.bashrc和.bash_profile檔案的區別:

/etc/profile: 此檔案為系統的每個使用者設定環境資訊,當用戶第一次登入時,該檔案被執行。並從/etc/profile.d目錄的配置檔案中搜集shell的設定;
/etc/bashrc: 為每一個執行bashshell的使用者執行此檔案.當bashshell被開啟時,該檔案被讀取;
~/.bash_profile:每個使用者都可使用該檔案輸入專用於自己使用的shell資訊,當用戶登入時,該檔案僅僅執行一次!預設情況下,他設定一些環境變數,執行使用者的.bashrc檔案;
~/.bashrc:該檔案包含專用於你的bashshell的bash資訊,當登入時以及每次開啟新的shell時,該檔案被讀取;
~/.bash_logout:當每次退出系統(退出bashshell)時,執行該檔案;
另外,/etc/profile中設定的變數(全域性)的可以作用於任何使用者,而~/.bashrc等中設定的變數(區域性)只能繼承/etc/profile中的變數,他們是"父子"關係。
 
~/.bash_profile 是互動式、login方式進入bash 執行的
~/.bashrc 是互動式non-login 方式進入bash 執行的
通常二者設定大致相同,所以通常前者會呼叫後者。

設定生效:可以重啟生效,也可以使用命令:source

10.  小數之間的比較用bc, 不是整數比較,不可以簡單的用大於小於來比較;

if [ $(echo "$code_coverage_integer< $SONAR_MIN_COVERAGE" | bc) ]   or

if (( $(echo "$code_coverage_integer< $SONAR_MIN_COVERAGE" | bc) ))

注意 : 對於資料比較有以下兩種格式:

 

以下是檔案,字串和算術比較運算子:

 

11.  換行問題;

1)     字串換行:

mail_body="Hi,${PROJECT_NAME}"" project member"$'\n'"Alerts"

2)     echo寫入檔案換行:

         echo -e "exportCONFIG_TIME=${CURRENT_TIME}\n

                        exportPROJECT_LIST=${PROJECT_LIST}\n

                        exportSHARED_FOLDER=~/jenkins/common\n" > config.txt

12.  通過git commit hash來判斷程式碼有沒有更新,取當前commit hash與base hash對比,有不一樣,打包安裝,並把當前的commithash放入base檔案;同理,取出當前所有的author list,與base list對比,取出程式碼修改的所有作者。

               git log --max-count=1--pretty=format:"%H" > ${CURRENT_MD5_FILE}  

               gitlog --pretty=format:"Author: %an" > ${CURRENT_AUTHOR_LIST}

13.  從pom.xml 檔案中取一指定節點的值:


例如<name>testService</name>,取testService值: 

1)sed -n'/name/{s/.*<name>\(.*\)<\/name>.*/\1/p;q;}' pom.xml

2)catpom.xml|sed -n '/name/p'|awk -F "[<>]" '{print $3}'

如果取的值是一個數字,例如<num>12</ num >,我們可以通過取數字得到;

 cat pom.xml | sed -n '/ num /p' | sed -r's/([^0-9]*([0-9]*)){1}.*/\2/'      

 但是當num顯示的值為1,000時,就只能取到1 而 不是1,000。所以 還是上面兩種方法比較奏效。

14.  JSON物件取值,示例如下:

JSON 物件:

 response='{"name"="annzan","value"="test"}'

用如下方法取值:

function jsonValue(){

KEY=$1

VALUE=$2

awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'$KEY'\042/){print $(i+1)}}}' | tr -d '"' | sed -n ${VALUE}p

}

如果要取到name裡的值annzan,呼叫jsonValue方法並輸入相應的Key值:

15.  在linux系統中,可以使用mount命令掛載光碟映象檔案、行動硬碟、U盤以及Windows網路共享和UNIX NFS網路共享等,這裡主要介紹一下Linux系統中NFS檔案共享;

1) 首先要看一下需要被掛載盤的檔案地址:  df  /mnt/ifs10001

2)在需要掛載的系統中建立相應資料夾:mkdir /mnt/ifs10001

3)實現掛載共享檔案:mount -t nfs isiloncwy0001.transfer.test.net:/ifs/data/transfer/clients /mnt/ifs10001 

具體可以參考http://www.jb51.net/os/RedHat/1109.html

16.  Jenkins自身設定的按時啟動job,時間是有延遲的,比如我設定為下午4點,可是卻發現沒有動靜,後來發現每天都是4點15執行job。而且這個設定的時間是jenkins伺服器的時間不是本機時間。設定格式如下:

例如設定每週一到週五,3點鐘執行job。設定定時任務:  H 3 * *  1-5 

17.  Jenkins中執行job前大都需要先export 環境變數,我們可以不需要手動寫shell 指令碼,可以在Jenkins Nodeconfig頁面設定Node屬性,如下圖:

 

18.  除了在Node端設定環境變數,我們也可以在Jenkins系統設定進行全域性設定,例如MAVEN_OPTS或者賬號密碼, $ENV{USERNAME}即為呼叫賬號;

 

19.  因為我們現在用Git管理程式碼庫,所以在Jenkins中要checkout程式碼,需要先設定git賬號,把key配置在Jenkins的ManageCredentials中,如下圖:

 

相關推薦

Jenkins實現持續整合那些

小夥伴在《這些年我們一起搞過的持續整合~Jenkins+Perland Shell script》中詳細介紹了優化後的job流,接下來總結一下在構建這一套job中遇到的Shell  Script和Jenkins的問題。 1.      比較兩個檔案後有特殊字元< 會導

[轉]使用jenkins實現持續整合

本文轉自:https://www.cnblogs.com/zishengY/p/7170656.html 一、jenkins 介紹   它是一個自動化的週期性的整合測試過程,從檢出程式碼、編譯構建、執行測試、結果記錄、測試統計等都是自動完成的,無需人工干預

ansible+gitlab+Jenkins實現持續整合

ansible簡介:   一、ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程式部署、批量執行命令等功能。   二、ansible是基於模組工作的,本身沒有批

jenkins實現持續整合

下載安裝 軟體版本需求:     JDK要求1.7以上,ant版本1.9系列都可以,jenkins版本2.33以上。jdk的安裝不再說了,下面只說一下ant和jenkins的安裝和配置:     ant是基於java的一款構建工具,通過配置build.xml,讓

ASP.NET Core + Docker +Jenkins 實現持續整合

本文為 docker-compose 方式,但自從 Visual Studio 2017 15.8 版本更新以後,通過VS新增的 Docker 支援預設就只有 Dockerfile 了,所以請參見這篇文章:https://www.cnblogs.com/stulzq/p/9201830.html 準備 我

.NET Core部署到linux(CentOS)最全解決方案,入魔篇(使用Docker+Jenkins實現持續整合、自動化部署)

通過前面三篇: [.NET Core部署到linux(CentOS)最全解決方案,常規篇](http://blog.rdiframework.net/article/244) [.NET Core部署到linux(CentOS)最全解決方案,進階篇(Supervisor+Nginx)](http://bl

Gradle + Jenkins + Ubuntu 在Android持續整合的深集合

1.gradle構建失敗2.jenkins找不到android sdk 3.專案程式碼的總方法數超過65535時,將會出現編譯錯誤 4.job的目錄出現在root目錄的解決辦法(因為用sudo啟動,導致許可權正確,配置JENINS_HOME,可以隨意制定目錄) 5.Tomc

Jenkins 通過Gradle對Android實現持續整合

Gradle 編譯打包越來越受歡迎,特別是在安卓端,如何實現GitLab、Jenkins 、Gradle、fir工具完成版本、編譯、打包、釋出流程。   Jenkins配置 Git Gradle構建環境配置 Gradle build.gradle配置檔

Jenkins+Git+Gitlab+Ansible實現持續整合自動化部署靜態網站(一)--技術流ken

  前言   在之前已經寫了關於Git,Gitlab以及Ansible的兩篇部落格《Git+Gitlab+Ansible劇本實現一鍵部署Nginx--技術流ken》,《Git+Gitlab+Ansible劇本實現一鍵部署動態網站(二)--技術流ken》,以及關於jenkins的簡單使

Jenkins+Git+Gitlab+Ansible實現持續整合自動化部署動態網站(二)--技術流ken

  專案前言   在上一篇部落格《Jenkins+Git+Gitlab+Ansible實現持續化整合一鍵部署靜態網站(一)--技術流ken》中已經詳細講解了如何使用這四個工具來持續整合自動化部署一個靜態的網站。 如果大家可以熟練掌握以上內容,勢必會在工作中減輕不小的工作量。 本篇

Asp.net Core 使用Jenkins + Dockor 實現持續整合、自動化部署(二):部署

前面又是廢話 我之前寫過: Asp.Net Core 程式部署到Linux(centos)生產環境(一):普通部署 Asp.Net Core 程式部署到Linux(centos)生產環境(二):docker部署 大家可能會有疑問,分散式環境當中的部署還是跟我們在windows一樣,一臺機一臺機的去

Asp.net Core 使用Jenkins + Dockor 實現持續整合、自動化部署(一):Jenkins安裝

寫在前面 其實園子裡很多大佬都寫過,我也是一個搬運工很多東西不是原創的,不過還是想把自己安裝的過程,記錄下來如果能幫到大家的忙,也是一件功德無量的事; 執行環境 centos:7.2 cpu:1核 2G記憶體 1M頻寬 其實用的騰訊雲 安裝jenkins 這裡的jenkins就不從docker

Jenkins + maven + git 實現持續整合

前言 小編最近開發的專案 採用的是 : 前後臺分離,後臺只需要提供rest 風格 返回具有規則的json 資料即可,考慮到開發人員不能面對面的碰介面,想到用 jenkins 去 搭建一個 可 熱部署的 架構,這樣前臺只需要接收到通知 外網對介面即可,後臺這塊也只

Python Web專案使用Jenkins進行持續整合CI

轉載原文:http://www.hustlzp.com/post/2014/08/jenkins 在一個專案的開發過程中,往往會有一些需要反覆執行的操作,比如編譯、測試、部署。具體於Flask專案,我一般使用nose執行單元測試、fabric進行部署、pylint執行程式碼質量檢測等。這些頻繁需要執行

使用Jenkins搭建持續整合(CI)環境(實現自動構建)(轉載)

轉載地址:http://www.cnitblog.com/luckydmz/archive/2012/01/03/77007.htmlhttp://www.cnitblog.com/luckydmz/archive/2012/01/03/77007.html 例如我

[C#]使用 Jenkins + TFS 為 .Net Core 實現持續整合/部署

在前後端分離開發的專案當中為了避免重複構建釋出,我們需要部署一個持續釋出環境,而目前的開發環境伺服器都是基於 CentOS 的,因此每次在本地釋出之後還需要打包,上傳,部署,十分繁瑣。故這裡採用了比較成熟的Jenkins 作為持續部署環境。 為了方便安裝,我們這裡使用了 Docker 來進行安裝,至於 Doc

在Python Web專案使用Jenkins進行持續整合

在一個專案的開發過程中,往往會有一些需要反覆執行的操作,比如編譯、測試、部署。具體於Flask專案,我一般使用nose執行單元測試、fabric進行部署、pylint執行程式碼質量檢測等。這些頻繁需要執行的步驟,是非常枯燥的,那何不交給機器來自動執行呢?最近,我參與的一個

Android友盟第三方登入與分享自動整合那些

自動整合的方式現在只支援微信,QQ,新浪三個平臺,如果需要使用其它平臺請選擇手動整合。 1:新增依賴     //友盟統計 compile 'com.umeng.sdk:common:1.5.1' compile 'com.umeng.sdk:analytics:7.5.0

劍指offer第二章——c++實現 持續更新

2.1面試官談基礎知識 1、c++的基礎知識(面向物件的特性、建構函式、解構函式、動態繫結、記憶體管理) 2、設計模式 3、uml圖 4、併發控制 5、對os的理解程度 時間複雜度排序:O(1) > O(lognN) > O(n) > O(NlogN) &g

JMeter+ant+Jenkins部署持續整合環境

首先,安裝好幾個東西,配置好環境變數,接下來一一演示下: 1、JDK 存放路徑:D:\java\jdk   環境變數: JAVA_HOME=D:\java\jdk CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar