jenkins
Jenkins是一個用Java編寫的開源的持續集成工具。在與Oracle發生爭執后,項目從Hudson項目復刻。
Jenkins提供了軟件開發的持續集成服務。它運行在Servlet容器中(例如Apache Tomcat)。它支持軟件配置管理(SCM)工具(包括AccuRev SCM、CVS、Subversion、Git、Perforce、Clearcase和RTC),可以執行基於Apache Ant和Apache Maven的項目,以及任意的Shell腳本和Windows批處理命令。Jenkins的主要開發者是川口耕介。Jenkins是在MIT許可證下發布的自由軟件。
可以通過各種手段觸發構建。例如提交給版本控制系統時被觸發,也可以通過類似Cron的機制調度,也可以在其他的構建已經完成時,還可以通過一個特定的URL進行請求。
創建Pipeline
基本環境搭建好后,我們來配置一個工作流親自感受一下
工作流在Jenkins中被稱為pipeline,pipeline的運行行為由用戶自己定義,定義的內容存放在一個Jenkinsfile文件中,並將該文件存放在git倉庫的根目錄,大致的流程如下
- 用戶將代碼提交到git
- Jenkins從git拉取最新代碼
- 讀取根目錄下的Jenkinsfile文件,並依次執行文件中定義的任務
下面是具體的配置步驟
編寫Jenkinsfile
pipeline {
agent {
label 'master' /* 執行節點 */
}
stages {
stage('Build') {
steps {
echo 'Building'
}
}
stage('Test') {
steps {
echo 'Testing'
}
}
stage('Deploy - Staging') {
steps {
sh './deploy staging'
sh './run-smoke-tests'
}
}
stage('Sanity check') {
steps {
input "Does the staging environment look ok?"
}
}
stage('Deploy - Production') {
steps {
echo './deploy production'
}
}
}
post {
always {
echo 'One way or another, I have finished'
deleteDir() /* clean up our workspace */
}
success {
echo 'I succeeeded!'
}
unstable {
echo 'I am unstable :/'
}
failure {
echo 'I failed :('
}
changed {
echo 'Things were different before...'
}
}
}
以上是一個基本的Jenkinsfile模板,其中有以下幾個關鍵概念
agent
- 指定在哪台機器上執行任務,還記得上面配置Node
時候填的Label
嗎,如果這兩個label
匹配得上,就在該Node
中執行stage
- 組成工作流的大的步驟,這些步驟是串行的,例如build
,test
,deploy
等steps
- 描述stage中的小步驟,同一個stage
中的steps
可以並行sh
- 執行shell
命令input
- 需要你手動點擊確定,Pipeline
才會進入后續環節,常用於部署環節,因為很多時候部署都需要人為的進行一些確認post
- 所有pipeline執行完成后,會進入post環節,該環節一般做一些清理工作,同時還可以判斷pipeline的執行狀態
了解了這些后,你會發現寫一個Jenkinsfile是一件很容易的事情。好了,現在要測試pipeline功能,把上面的代碼中的sh換成echo,拷貝到你的Jenkinsfile中,並存放在git倉庫的根目錄
創建pipeline
回到Jenkins web頁面,添加pipeline
如果你想每次git commit
時自動執行該pipeline,有兩種方法,一種是讓Jenkins對git進行輪詢,每分鍾檢查git倉庫有沒有更新,如下配置
另一種方式是使用git提供的hook,該方式原理是git一旦提交,便會觸發hook中的腳本,讓腳本給Jenkins發送執行pipeline的指令,這種方式更優雅,但相應要做的事情更多一點,這里就不演示這種方法了,感興趣的同學可以自己研究一下。
最后,我們需要設置git的地址,其中的授信設置,和上面說的Master到Node的授信設置一致
設置完畢后,一旦你的git倉庫收到新的提交,就會觸發這個pipeline的運行,以下這張圖是上面Jenkinsfile例子的運行狀態,可以看到當運行到Sanity check這一步時,需要你手動觸發是否執行后面的操作。
其他
項目地址:https://github.com/changdaye/jenkins-docker-demo/
步驟圖形化插件介紹: https://wiki.jenkins.io/display/JENKINS/Pipeline+Stage+View+Plugin