Jenkins: 建立第一個 Pipeline

clipboard.png

流水線視圖能夠很直觀地看到每一步執行的時間和進度,方便追蹤部署過程當中的每個環節。node

搭建 jenkins 參考 上一篇文章git

工做流

本文目的是搭建一個簡單的 pipeline,當 git 倉庫有提交時,builder server 進行構建和測試,完成以後 deploy server 進行部署。github

本地 -> SCM: 提交代碼
SCM -> Build Server: 觸發 jenkins 任務
Build Server: 啓動 pipeline
Build Server -> Deploy Server: 部署服務
  • SCM Source Code Management,如 github
  • Build Server jenkins 所在機器,負責構建
  • Deploy Server 線上服務所在機器

新建 Task

首先建立一個 Task,而後選擇流水線模板web

clipboard.png

clipboard.png

配置

Pipeline

clipboard.png

在這裏能夠配置 pipeline 的腳本,definition 能夠選擇 Pipeline scriptPipeline script from SCMdocker

選擇前者後,jenkins 腳本須要在下方填寫,當任務啓動後,jenkins 會執行這裏配好的命令;選擇後者後,任務啓動後,jenkins 會去執行 SCM 倉庫下配置的 script path 下的腳本。shell

一句話說,二者區別在於腳本是寫在 jenkins 配置裏,仍是寫在你的代碼倉庫裏。因此修改腳本的時候在 jenkins 裏配就行,方便調試,沒問題以後使用 SCM 管理更好。npm

編寫 pipeline script

以 node 服務舉例,部署過程分爲四步:segmentfault

  1. Build: 在 build server 上 npm install
  2. Test: 在 build server 上進行測試
  3. Deploy: 在 deploy server 上部署

這個腳本以下,須要將 [user] 和 [ip] 替換成 deploy server 的登陸用戶和 ip:api

pipeline {
        agent any
        stages {
                stage('Build') {
                        steps {
                                sh "npm install"
                        }
                }
                stage('Test') {
                        steps {
                                sh "npm test"
                        }
                }
                stage('Deploy') {
                        steps {
                                sh """
                                ssh -o stricthostkeychecking=no [user]@[ip] "
                                   source /etc/profile
                                   cd /root/projects/my-api-server
                                   git pull
                                   npm install
                                   pm2 reload wool-digger-api
                                "
                                """
                        }
                }
        }
}

固然這是一個很粗糙的構建方式,能夠稍後查看 使用 docker 進行改造bash

主要概念有

  • agent 指示 Jenkins 分配一個執行器和工做空間來執行下面的Pipeline
  • stage 表示這個 Pipeline 的一個執行階段,對應流水線中各個環節
  • steps 表示在這個 stage 中每個步驟

sh 命令用來執行一條 shell 語句。 這個配置文件被執行後:

首先 jenkins 會在工做區(通常來講在 ~/.jenkins/workspace/)下拉取配置倉庫指定分支的代碼

pull 成功後進行 npm install(Build)

build 成功以後進行 npm test(Test)

test 成功後遠程執行一段腳本,即登陸 deploy server 並 cd 到服務目錄,而後進行服務的更新重啓操做。

npm/pm2 not found 的問題

注意上面 Deploy 中有一行 source /etc/profile,這是 login shellno-login shell 的不一樣。

若是使用 ssh 登陸再執行命令和腳本,用戶會得到 login shell,shell 首先會加載 /etc/profile 文件,而後依次嘗試 ~/.bash_profile~/.bash_login~/.profile

而若是直接使用 ssh 遠程執行命令和腳本,如上面的 ssh -o,它不會去執行 /etc/profile 文件,而會去用戶的 HOME 目錄檢查 .bashrc 並加載。因此在 /etc/profile 中設置的 path 不會生效。若是 nvm 在此文件中,那麼 node、npm、pm2 等等就找不到了。

解決方法能夠在 shell 腳本中先手動加載配置文件。

Build Triggers

clipboard.png

在這裏能夠配置 pipeline 觸發的類型

Github hook trigger fro GITScm polling

啓動該項後能夠經過 GitHub 的 webhook 來觸發,參考 Github Plugin 文檔

這裏說一下最簡單的配置,即手動配置。

在 Jenkins -> 系統管理 -> 系統設置中,能夠找到 Git 配置,點擊右邊的問號按鈕,能夠看到默認的 jenkins hook 地址。

clipboard.png

clipboard.png

通常來講默認都是 $JENKINS_BASE_URL/github-webhook/。拿到這個地址後,添加到 github 的 webhook 中。

clipboard.png

注意 這個地址是沒有項目信息的,由於 github 調用這個 hook 地址時,會把倉庫信息傳過去,因此就只剩在 jenkins 中把 pipeline 和這個 git 倉庫關聯起來。這須要在 pipeline 中選擇 Pipeline script from SCM 並填寫 git 地址。

輪詢 SCM

啓動該項後,jenkins 將定時對 SCM 倉庫進行輪詢,當倉庫有新提交時,會自動觸發 pipeline。

Schedule 填寫規則與 crond 相似,如 H/5 * * * * 表明每 5 分鐘查詢一次。詳細規則能夠點擊右邊的問號。

啓動

點擊 當即構建,或去倉庫提交一個 commit(若是配置了 github hook),或提交一個 commit 並等待(若是配置了輪詢 SCM),而後就能看到咱們的第一個 pipeline 啓動了!

相關文章
相關標籤/搜索