目錄javascript
一、Spinnaker 介紹html
Spinnaker 是 Netflix 的開源項目,是一個持續交付平臺,它定位於將產品快速且持續的部署到多種雲平臺上。Spinnaker 經過將發佈和各個雲平臺解耦,來將部署流程流水線化,從而下降平臺遷移或多雲品臺部署應用的複雜度,它自己內部支持 Google、AWS EC二、Microsoft Azure、Kubernetes和 OpenStack 等雲平臺,而且它能夠無縫集成其餘持續集成(CI)流程,如 git、Jenkins、Travis CI、Docker registry、cron 調度器等。簡而言之,Spinnaker 是致力於提供在多種平臺上實現開箱即用的集羣管理和部署功能的平臺。java
Spinnaker 官網 文檔能夠了解到,Spinnaker 主要包含兩大塊內容,集羣管理和部署管理。node
集羣管理主要用於管理雲上的資源,它分爲如下幾個塊:git
部署管理功能用於建立一個持續交付流程,它可分爲管道和階段兩大部分。github
部署管理的核心是管道,在Spinnaker的定義中,管道由一系列的階段(stages)組成。管道能夠人工觸發,也能夠配置爲自動觸發,好比由 Jenkins Job 完成時、Docker Images 上傳到倉庫時,CRON 定時器、其餘管道中的某一階段。同時,管道能夠配置參數和通知,能夠在管道一些階段上執行時發送郵件消息。Spinnaker 已經內置了一些階段,如執行自定義腳本、觸發 Jenkins 任務等。web
Spinnaker 支持精細的部署策略,好比 紅/黑(藍/綠)部署,多階段環境部署,滾動紅/黑策略,canary 發佈等。用戶能夠爲每一個環境使用不一樣部署策略,好比,測試環境可使用紅/黑策略,生產環境使用滾動紅/黑策略,它封裝好了必須的步驟,用戶不須要複雜操做,就能夠實現企業級上線。redis
二、環境、軟件準備sql
Spinnaker 安裝在 官網文檔 中寫的很詳細,可使用一種全新的 CLI 工具 halyard,它幫助管理員更容易地安裝,配置以及升級用於生產環境的 Spinnaker 實例,可是支持的是 Ubuntu 環境,並且部分資源依賴國外地址,SO 我嘗試了一下,因爲網絡的緣由,安裝過程當中沒有可以繼續下去。。。 因此,這裏我選擇了 Spinnaker GitHub 安裝 Development 版本,配置雖然稍複雜一些,可是做爲初試階段,可以跑起來也是不錯的。Development 版本目前只在 Ubuntu 14.04 LTS 和 Mac OS X 10.11 上測試過,因爲手頭沒有現成的 Ubuntu 環境,就直接在本機 Mac OS 上嘗試安裝一下吧。docker
注意:Development 版本安裝,須要獲取 GitHub 源碼編譯安裝,其中還須要拉取各個組件模塊源碼,因此須要安裝好 Git。JDK八、Redis、Cassandra、Packer 是安裝 Spinnaker 組件時須要依賴的。Jenkins 非必須安裝,這裏我下邊須要演示集成 Jenkins,因此使用 Docker 快速安裝一下。下邊會詳細介紹每一個組件的做用,以及安裝方式。
三、安裝 Development Spinnaker
安裝 Spinnaker 以前,有必要詳細描述一下 Spinnaker 架構所依賴的各個組件。
以上組件除了核心組件外,一些組價可選擇配置是否啓動,好比不作權限管理的話,Fiat 就能夠不啓動,不集成其餘 CI 的話,那就能夠不啓動 Igor 組件等。這些均可以在配置文件中配置,下邊會說到。Development 版本,各個組件獨立服務運行,有各自的服務端口,且各個組件都有本身的獨立的項目 GitHub 地址。
好了,講了這麼多 Spinnaker 相關的東西了,接下來開始安裝 Spinnaker。
3.1 配置依賴環境
Spinnaker 平臺須要依賴部分環境,因此爲了防止下邊安裝過程當中出現錯誤,能夠提早安裝一下。
一、因爲 Spinnaker 核心服務是由 SpringBoot 框架寫的,因此須要安裝 JDK8 二、Spinnaker 須要使用 Redis 存儲數據,因此也須要安裝。 三、Cassandra 是非關係型數據庫存儲,默認 Front50 組件和 Echo 組件配置使用該存儲,也須要安裝。 四、Packer 是開源的支持多平臺建立鏡像工具,rosco 組件配置使用該工具,也須要安裝。
以上依賴環境能夠去官網下載安裝,我這裏本機 JDK8 環境已經安裝,其餘的由於本機是 Mac OS 環境,那麼我選擇使用 homebrew 安裝,很是方便。
$ brew install redis cassandra packer
安裝完畢後,咱們啓動 redis 和 cassandra,packer 不須要啓動,Spinnaker 能夠鏈接調用便可。
3.2 配置並安裝 Spinnaker
# clone Spinnaker 代碼
$ mkdir /Users/wanyang3/spinnaker $ cd /Users/wanyang3/spinnaker $ git clone https://github.com/spinnaker/spinnaker.git ... # clone Spinnaker 其餘個組件代碼 $ mkdir build $ cd build $ ../spinnaker/dev/refresh_source.sh --pull_origin ...
說明一下,Spinnaker 項目裏面包含核心配置文件,但不包含各組件代碼,因此須要建立 build
文件夾,並執行 refresh_source.sh
腳本,會依次 clone 各個組件代碼,這裏得花點時間了。執行完畢後,顯示目錄以下:
$ ls -alt /Users/wanyang3/spinnaker/build total 24 drwxr-xr-x 17 wanyang3 staff 578 11 23 14:49 . drwxr-xr-x 7 wanyang3 staff 238 11 28 15:43 .. -rw-r--r--@ 1 wanyang3 staff 6148 11 23 14:49 .DS_Store drwxr-xr-x 14 wanyang3 staff 476 11 17 14:32 citest drwxr-xr-x 45 wanyang3 staff 1530 11 17 14:46 clouddriver drwxr-xr-x 49 wanyang3 staff 1666 11 21 14:32 deck -rw-r--r-- 1 wanyang3 staff 175 11 17 16:24 dump.rdb drwxr-xr-x 32 wanyang3 staff 1088 11 17 15:14 echo drwxr-xr-x 30 wanyang3 staff 1020 11 17 14:32 fiat drwxr-xr-x 35 wanyang3 staff 1190 11 17 14:53 front50 drwxr-xr-x 25 wanyang3 staff 850 11 20 14:13 gate drwxr-xr-x 34 wanyang3 staff 1156 11 17 14:32 halyard drwxr-xr-x 24 wanyang3 staff 816 11 20 17:49 igor drwxr-xr-x 19 wanyang3 staff 646 11 22 11:57 logs drwxr-xr-x 49 wanyang3 staff 1666 11 17 15:11 orca drwxr-xr-x 25 wanyang3 staff 850 11 17 14:46 rosco drwxr-xr-x 18 wanyang3 staff 612 11 17 14:32 spinnaker-monitoring
接下來,咱們須要配置一下 Spinnaker。
$ cd /Users/wanyang3/spinnaker $ mkdir -p $HOME/.spinnaker $ touch $HOME/.spinnaker/spinnaker-local.yml $ chmod 600 $HOME/.spinnaker/spinnaker-local.yml $ cp spinnaker/config/spinnaker.yml $HOME/.spinnaker/spinnaker-local.yml # 修改配置文件 $ vim $HOME/.spinnaker/spinnaker-local.yml
注意:這裏的文件 spinnaker-local.yml
是 Spinnaker 核心配置文件,這裏能夠配置各個組件是否啓動或關閉,以及其餘參數。同時 <spinnaker_dir>/spinnaker/config/*.yaml
這些配置文件都是各個組件啓動時,須要加載的配置文件。這裏咱們暫時不作修改,保持默認狀態,下邊演示功能時在作修改。
這裏有必要在詳細說一下,經過對 spinnaker-local.yml
配置文件的分析,Spinnaker 各個組件默認啓動端口以下:
組件 |
端口 |
依賴組件 |
端口 |
---|---|---|---|
Clouddriver |
7002 |
Redis |
6379 |
Fiat |
7003 |
||
Front50 |
8080 |
Cassandra |
9042 |
Orca |
8083 |
||
Gate |
8084 |
||
Rosco |
8087 |
||
Igor |
8088 |
||
Echo |
8089 |
||
Deck |
9000 |
接下來能夠啓動 Spinnaker 服務了。
$ cd /Users/wanyang3/spinnaker/build $ ../spinnaker/dev/run_dev.sh [service]
注意:[service]
參數可指定一個或多個組件名稱,若指定則只啓動指定組件,若不指定,默認啓動全部組件,這裏咱們就不指定了,啓動全部配置開啓的組件。若是正常的話,能夠看到輸出日誌中依次啓動各個組件,而後執行 gradle 編譯,最後完成啓動 Spinnaker。
Starting clouddriver
Starting front50
Starting orca
Starting rosco
Starting echo
Starting igor
Waiting for clouddriver to start accepting requests on port 7002... ... :clouddriver-web:compileJava UP-TO-DATE :clouddriver-web:compileGroovy UP-TO-DATE :clouddriver-web:processResources UP-TO-DATE :clouddriver-web:classes UP-TO-DATE :clouddriver-web:findMainClass :clouddriver-web:bootRun ... 2017-11-28 17:34:06.440 INFO 6648 --- [ main] .d.s.w.r.o.CachingOperationNameGenerator : Generating unique operation named: getUsingGET_2 2017-11-28 17:34:06.443 INFO 6648 --- [ main] .d.s.w.r.o.CachingOperationNameGenerator : Generating unique operation named: listUsingGET_8 2017-11-28 17:34:06.445 INFO 6648 --- [ main] .d.s.w.r.o.CachingOperationNameGenerator : Generating unique operation named: listUsingGET_9 2017-11-28 17:34:06.498 INFO 6648 --- [ main] c.n.s.c.listeners.OperationsTypeChecker : Found 0 cloud provider annotations: [] 2017-11-28 17:34:06.567 INFO 6648 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 7002 (http) 2017-11-28 17:34:06.578 INFO 6648 --- [ main] com.netflix.spinnaker.clouddriver.Main : Started Main in 19.568 seconds (JVM running for 22.055)
不過這裏我發現了幾個問題。
問題一:若是咱們啓動以前未啓動 Redis 服務,那麼這裏日誌就會輸出 redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
異常了。
問題二:本機測試時並無一次啓動完全部服務,大部分能夠正常啓動,Fiat、Gate、Deck 三個組件未啓動,Fiat 未啓動能夠理解,是由於配置文件中設置默認不啓動。Gate、Deck 怎麼還得本身去手動啓動呢。。。
問題三:第一次啓動時,發現 front50 未啓動,報錯相似 Can not find keyspaces 'front50'
這樣,這是由於未在 Cassandra 中爲建立 front50
的 keyspaces。可經過以下方式查看:
$ cqlsh
Connected to Test Cluster at 127.0.0.1:9042. [cqlsh 5.0.1 | Cassandra 3.11.1 | CQL spec 3.4.4 | Native protocol v4] Use HELP for help. cqlsh> describe keyspaces; system_schema system system_traces system_auth system_distributed
能夠執行一下命令建立:
cqlsh> CREATE KEYSPACE IF NOT EXISTS front50
WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 }; cqlsh> describe keyspaces; system_schema system front50 system_traces system_auth system_distributed
後來查看了下 Spinnaker 執行腳本,發現是有執行建立該 keyspaces 的代碼的,不過好像我第一次安裝的時候並無執行。。。
$ cat /Users/wanyang3/spinnaker/spinnaker/pylib/spinnaker/change_cassandra.py ... print 'Installing cassandra keyspaces...' os.system('cqlsh -f "/opt/spinnaker/cassandra/create_echo_keyspace.cql"') os.system('cqlsh -f "/opt/spinnaker/cassandra/create_front50_keyspace.cql"') ...
要是碰到沒有執行安裝 echo 和 front50 keyspace 致使這兩個組件報錯的話,能夠手動執行一下,建立語句 Spinnaker 已經提供好了,cqlsh 客戶端執行 <spinnaker_dir>/spinnaker/cassandra/*.sql
語句建立便可。
好了,如今大部分服務已經啓動好了,可是 deck 和 gate 服務尚未啓動起來呢!分別進入到 build 目錄下 deck 和 gate 目錄,先啓動 gate 在啓動 deck,由於 deck 中請求地址是直接鏈接 gate,而後 gate 網關在對請求作轉發。
$ cd /Users/wanyang3/spinnaker/build/gate $ ./start_dev.sh
若是肯定組件是否啓動成功呢?咱們能夠簡單的 lsof -i :<port>
查看端口狀況 也能夠分別查看各個組件的日誌,看下各組件啓動時是否有異常信息。
$ ls -alt /Users/wanyang3/spinnaker/build/logs total 46168 drwxr-xr-x 19 wanyang3 staff 646 11 22 11:57 . drwxr-xr-x 17 wanyang3 staff 578 11 29 09:23 .. -rw-r--r-- 1 wanyang3 staff 89 11 28 17:33 clouddriver.err -rw-r--r-- 1 wanyang3 staff 76945 11 29 09:53 clouddriver.log -rw-r--r-- 1 wanyang3 staff 2529 11 22 11:57 deck.err -rw-r--r-- 1 wanyang3 staff 3586 11 22 11:57 deck.log -rw-r--r-- 1 wanyang3 staff 507 11 28 17:33 echo.err -rw-r--r-- 1 wanyang3 staff 3408986 11 29 09:56 echo.log -rw-r--r-- 1 wanyang3 staff 0 11 17 14:40 fiat.err -rw-r--r-- 1 wanyang3 staff 788 11 28 17:33 front50.err -rw-r--r-- 1 wanyang3 staff 62153 11 28 17:34 front50.log -rw-r--r-- 1 wanyang3 staff 450 11 27 17:05 gate.err -rw-r--r-- 1 wanyang3 staff 2192698 11 27 17:05 gate.log -rw-r--r-- 1 wanyang3 staff 89 11 28 17:33 igor.err -rw-r--r-- 1 wanyang3 staff 17736046 11 29 09:56 igor.log -rw-r--r-- 1 wanyang3 staff 89 11 28 17:32 orca.err -rw-r--r-- 1 wanyang3 staff 63183 11 28 17:33 orca.log -rw-r--r-- 1 wanyang3 staff 89 11 28 17:33 rosco.err -rw-r--r-- 1 wanyang3 staff 41101 11 28 17:33 rosco.log
接下來啓動 deck 組件,deck 啓動的話,會稍微麻煩一下,能夠參考 Deck GitHub Doc 文檔說明操做。
首先須要安裝依賴環境 node 和 yarn
$ brew install node yarn
這裏咱們是本地搭建的 develop 版本,全部服務均爲 localhost。上邊說了,deck 先須要經過鏈接本地 gate 連將請求轉發到對應組件上。因此能夠經過以下方式啓動 deck
API_HOST=http://localhost:8084 yarn run start
先稍等一會,這裏會先執行編譯,啓動完畢以後,咱們就能夠經過訪問 http://localhost:9000
訪問 Spinnaker deck 組件提供的 UI 頁面了,頁面簡潔明瞭,很是好操做。
從上圖能夠看到,Spinnaker 主要的功能已經列出來了。並且這些功能是能夠控制的,當擴展或中止了組件之後,UI 頁面也會跟着展示出來,接入簡單,可擴展性強。
四、演示 Spinnaker Pipeline
Spinnaker 的兩個核心集羣管理和部署管理,對於集羣管理這塊,它對國外經常使用的雲平臺集成的比較好,如 Google、AWS EC二、Microsoft Azure 等,由於手頭沒有相應的資源,這裏暫時無法嘗試,還要它支持 Kubernates,後期我將繼續研究它如何跟 Kubernetes 結合完成集羣管理,恰好最近在研究 Kubernetes,手頭有搭建好的 k8s 集羣。針對部署管理這塊,Spinnaker 核心爲三大塊 Pipeline、Stage、Deployment Strategies,下邊來詳細演示一下 Spinnaker 提供的強大的 Pipeline 功能。
Spinnaker 平臺,是按照 Project 項目分類,每一個項目包含多個 Application 應用,每一個應用裏面包含多個 Pipelines ,每一個 Pipeline 包含多個 Stage 階段,在每一個階段中能夠定義不一樣的 Deployment Strategies 部署策略。總體是按照這種方式來定義的,這樣既能夠很好的先按照項目分類,而後能夠根據項目中應用再次細分,最後落實到每一個應用的流程上,不一樣的流程配置不一樣的部署階段和部署策略,從而使用戶有一個很清晰的脈絡來梳理並配置本身不一樣業務的部署流程線。
4.1 建立 Project、Application
首先建立一個項目 project_test
,而後建立一個應用 app_test
,並將應用 app_test
跟 project_test
項目關聯起來。
點擊導航欄 「Projects」 -> 「Actions」 -> 「Create Project」,輸入名稱 project_test
,Application 下拉選擇項先不選,由於咱們還沒建立 Application,等建立完畢以後,在選擇配置。
點擊導航欄 「Applications」 -> 「Action」 -> 「Create Application」,輸入名稱 app_test
,選擇代碼倉庫類型,默認有三種:stash、github、bitbucket。這裏我選擇 stash,配置本身搭建的 GitLab 代碼倉庫便可,若是項目託管在 github 或 bitbucket 上,可對應選擇。下邊實例端口處填寫端口號,根據提示信息,是要填寫該應用實例端口號,最終能夠經過 IP + Port 方式訪問該實例,相似 Kubernetes 中的 Pod。
最後,將 project_test
跟 app_test
關聯起來,點擊導航欄 「Projects」 -> 「project_test」 -> 「Project Configuration」 -> 「Applications」,下拉列表中選擇 app_test
,點擊 「Save」 保存便可。
4.2 建立 Pipeline
接下來建立 Pipeline,進入 app_test
詳情頁面,點擊 「PIPELINES」,目前是沒有任何信息的,點擊 「+ Create」,彈框中選擇類型爲 Pipeline,輸入流程名稱,這裏我命名爲 first_pipeline
。由於第一次建立,下邊 「Copy From」 選擇沒出來,後續在建立時,咱們也能夠經過 「Copy From」 方式選擇已存在的 Pipeline,很是方便就複製了一個同樣配置的流程了。建立完畢後,就會出現詳細配置 Pipeline State 的頁面了。
4.3 配置 Configuration 項
剛開始這裏只有一個 Configuration 選項,能夠配置 Automated Triggers、Parameters、Notifications 等,這裏說下 Automated Triggers 和 Parameters 這兩個很是有用,咱們能夠將此視爲 Pipeline 啓動前的一些初始化配置,好比啓動須要的參數配置、自動觸發配置等,爲後續各階段提供必要的信息。
Automated Triggers 自動觸發,它提供 7 種類型的觸發方式:
基本能知足咱們平常持續集成或交付的需求,固然每個類型都須要配置相應的參數,好比 Cron 類型,須要配置執行頻率、啓動時間等。
這裏就不一一截圖列舉,能夠親自試驗一下吧,每種類型的配置參數不同,一些參數若是須要下拉選擇的時候沒有可選項,說明在啓動 Spinnaker 的時候,配置文件中沒有配置,也或者是配置的信息不完整或不正確致使。例如 Jenkins 類型,選擇 Master 的時候,若是沒有在 $HOME/.spinnaker/spinnaker-local.yml
文件中配置 Jenkins 信息的話,那麼這裏就確定不會出現可選信息了。Docker Registry 中 Registry Name 選項也是同理。同時這些觸發方式,能夠組合使用的,添加多個 Automated Triggers 組合使用,效果槓槓的。
Parameters 參數,能夠配置 Pipeline 參數,在流程啓動是,會要求輸入或選擇對應的參數,而且在後續 Stage 中能夠直接獲取使用,這是很是有必要的,咱們使用 jenkins Job 時,有構建參數選項配置,這裏若是咱們要觸發對應的 Jenkins Job,那麼能夠把對應的必要參數設置在這裏,後續 Stage 觸發 Jenkins Job 時,構建參數賦值就能夠直接經過表達式來獲取了。
好比這裏我設置 ci_version
和 branch
兩個必填參數,而且 branch
帶默認值,且可設置爲可選參數。
4.3 配置各個 Stage 項
接下來,給 Pipeline 添加 Stage 了,實際應用中就須要咱們結合本身的業務邏輯,合理添加 Stage,來達到指望的持續集成交付功能啦。這裏我作一個簡單的的功能演示,先來一個 Manual Judgment 類型 Stage,作人工判斷選擇,根據啓動者選擇的類型,在分別執行對應的 Check Preconditions 類型 Stage,作先決條件檢查,這裏得用到表達式判斷(下邊會說到表達式),最後爲每條路徑配置不一樣的類型的 Stage,這裏一條使用 Wait 類型,等待固定秒後自動到下一個Stage 或結束,另外一條選擇 Webhook 類型,調用一個 API 接口,正常返回後結束流程。下邊一步步介紹每一個 Stage 配置,最終完成整個 Pipeline。
4.3.1 配置 Manual Judgment Stage
首先建立一個 Manual Judgment 類型的 Stage,來作人工判斷選擇,顧名思義就是執行 Pipeline 到該 Stage 的時候,會等待用戶選擇配置選項,Stage 才能夠繼續執行下去。鼠標點擊 Configuration 選項,使其圖標變綠(意味着對該選中項增長下一步 Stage,後續其餘 Stage 增長 Stage 操做同樣)。點擊 「+ Add Stage」,下方區域 Type 選擇 Manual Judgment,Name 名稱我填寫 「Manual Judgment Stage」 直觀明瞭,Instructions 處填寫該 Stage 的說明信息,實際應用中,一些必要的說明信息是頗有必要的,其餘人操做該流程時好作參考提示,這裏還支持 HTML 代碼,因此我再次輸入提示信息以下:
<div>請選擇條件: <br> <ul> <li>develop environment: 開發環境,將執行 Wait Sate</li> <li>release environment:生產環境,將執行 Webhook Stage </li> </ul> </div>
這樣就算其餘人執行這個示例流程,到這一步也知道該如何選擇了吧!接下來 Judgment Inputs 判斷項,這裏我添加兩判斷項 develop environment 和 release environment,啓動 Pipeline 執行到該 Stage 時,會等待咱們選擇判斷項時,就會顯示這兩項。後續 Stage 也能夠經過表達式獲取到選擇的值,來串聯對應其餘 Stage 很實用。填寫完畢,點擊 「Save Changes」 保存便可,以下圖所示。
4.3.2 配置 Check Preconditions Stage
上邊 Manual Judgment Stage 配置了兩個 Judgment Inputs 判斷項,接下來咱們建兩個 Check Preconditions Stage 來分別對這兩種判斷項作條件檢測,條件檢測成功,則執行對應的後續 Stage 流程。點擊 「Manual Judgment Stage」 使其變綠,點擊 「+ Add Stage」,Type 選擇 Check Preconditions,Name 名稱我填寫 「Check Preconditions develop」 說明是針對條件爲 develop environment 類型的驗證,Preconditions 條件配置處點擊 「+ Add Precondition」,彈框 Edit Preconditions 以下圖。
Check 處選擇 Expression 表達式方式,而後在 Expression 文本域填寫表達式 ${ #judgment('Manual Judgment Stage') == 'develop environment' }
,說明一下,這個表達式意思就是從名稱爲 「Manual Judgment Stage」 的 Judgment Stage 獲取選擇的值是否爲 「develop environment」,若是條件匹配,則返回 true,繼續執行當前 Stage 後續 Stage 流程,不然返回 False,執行前 Stage 的後續其餘 Stage,若是未配置其餘 Stage,則流程結束。Fail Pipeline 選項,若是勾選,則匹配不成功後,則直接結束流程。根據實際須要配置,這裏我不勾選,由於該 Stage 判斷不匹配的時候,咱們還須要執行另外一個判斷 Stage 呢,可不能結束流程了。配置完畢,以下圖。
接下來配置另外一個 Check Preconditions Stage,這裏就不用在一步步建立了,能夠直接複製 「Check Preconditions develop」 ,而後修改下名稱和表達式便可,是否是很方便。點擊 「Manual Judgment Stage」 使其變綠,點擊 「+ Copy existing stage」,彈框選擇 「Check Preconditions develop」,點擊 「Copy Stage」 便可完成建立,彈框以下圖。
而後修改下 Name 爲 「Check Preconditions release」,表達式處修改成 ${ #judgment('Manual Judgment Stage') == 'release environment' }
,保存便可。配置完畢,以下圖。
4.3.3 配置 Wait Stage
配置好了 Check Preconditions Stage,接下來咱們爲 「Check Preconditions develop」 stage 配置後續 Stage,使其在驗證成功後,能夠繼續執行下去。點擊 「Check Preconditions develop」 使其變綠,點擊 「+ Add Stage」,Type 選擇 Wait,Name 名稱我填寫 「Wait Stage」,這個 Stage 什麼都不幹,等待固定時間後結束流程使用。Wait Time 設置等待秒數,這裏我設置爲30s。配置完畢,以下圖。
4.3.4 配置 Webhook Stage
接下來爲另外一個 「Check Preconditions release」 Stage 配置後續 Stage,使其在驗證成功後,能夠繼續下去。點擊 「Check Preconditions release」 使其變綠,點擊 「+ Add Stage」,Type 選擇 Webhook,Webhook URL 爲須要觸發的 URL 地址,實際應用中用處很大,能夠觸發其餘接口或者其餘流程等等,並且能夠配置解析返回值,進行狀態判斷,是否觸發成功仍是失敗,來 Fail Pipeline 或其餘操做,這裏我簡單一點,觸發 http://www.baidu.com
,Method 選擇 Http 請求方式,支持 GET、HEAD、POST、PUT、DELETE 方式,選擇了每一種方式以後,會出現對應該請求方式的其餘參數配置,這裏我選擇 GET 方式,不須要配置其餘參數。Wait for complation 等待完成配置,這下邊有詳細的解析返回值或返回狀態的配置,也能夠支持異步接口方式,好比提供一個獲取狀態 Staus 的 URL,而後配置對應信息,那麼流程執行到此時,會請求異步接口並解析,直到返回狀態匹配成功,才結束流程等,這裏示例簡單些,不配置了。配置完成後,以下圖。
4.3.5 啓動 Pipeline
好了,通過上邊一系列的配置,一個簡單的擁有 5 個 Stage 的 Pipeline 就完成了,接下來咱們啓動一下 first_pipeline
試試效果吧!回到 app_test
應用的 PIPELINES 頁面,咱們會看到咱們全部配置的 Pipeline 列表,找到對應 first_pipeline
的 Pipeline,點擊後邊 「Start Manual Execution」 按鈕,會彈出啓動確認框,若是流程 Configuration 項配置了參數或者 Trigger,這裏會一併彈出,在填入對應的值後,就能夠啓動流程了。例如該流程,咱們配置了 Parameters 參數 ci_version
和 branch
參數,因此啓動彈框以下圖。
輸入 ci_version
參數,以及選擇 branch
參數後,點擊 「RUN」 便可啓動流程啦!啓動後,咱們會發現按照以前的設計,流程會卡在第一個 Stage,等待咱們人工作判斷,這裏咱們先選擇 「develop environment」 選項,繼續到下一個 Stage 吧。
說明一下,這裏能夠鼠標懸停在第一個 Stage 上,就會顯示配置的 Judgment Input 選項,以及 Instructions 說明,也能夠點擊 「Details」 下方顯示詳細信息,在此選擇亦能夠。
選擇完畢後,流程會自動執行到下一個 Stage,流程會分別走到 「Check Preconditions develop」 和 「Check Preconditions release」 Stage,而後作條件判斷,還記得以前咱們配置的 Expression 吧,這裏就起到做用了,咱們選擇的是 「develop environment」, 那麼驗證 「Check Preconditions develop」 就會經過,直接繼續到對應的下一個 Stage。驗證 「Check Preconditions release」 失敗,那麼該節點狀態就是 STOPPED 狀態,不執行後續 Stage。
此時咱們能夠看到流程已經到了 Wait Stage 了,這一步什麼都不幹,等待 30s 流程結束。在等待過程當中,也能夠人爲跳過等待時間,鼠標懸停該 Stage 上,會彈出跳過按鈕。等待完畢後,該流程就成功結束啦!
OK,到目前爲止,Pipeline 的一條路線能夠成功執行了,接下來驗證一下,選擇 「release environment」 選項後,流程的另外一條路線執行狀況吧!過程我就不在一一描述了,直接看結果吧!
OK,一樣能夠正常運行。Spinnaker Pipeline 還有不少使用高級的用法,好比它能夠觸發 Script 腳本、執行 Job、觸發其餘 Pipeline 運行、部署項目到配置的雲平臺等等,基本可以知足咱們平常業務需求噠!並且它還在持續更新中,相信之後能更方便更高效的接入更多平臺。
五、演示 Spinnaker 集成 Jenkins
對於持續集成流程,咱們使用的比較多的開源工具 Jenkins,Spinnaker 設計中就可以很好的支持第三方工具,經過 Igor 組件就能很好的支持 Jenkins 等工具。下邊咱們就演示一下 Spinnaker 如何集成 Jenkins 工具。
5.1 搭建並配置 Jenkins
由於 Spinnaker 自己啓動時並無直接啓動一個 Jenkins 服務,因此須要咱們本身啓動一個 Jenkins 服務或 Jenkins 集羣服務,而後將 Jenkins 信息配置到 Spinnaker 配置文件中,使其能夠關聯到對應 Jenkins,而後就能夠在 Spinnaker 中盡情使用 Jenkins 服務啦!
Jenkins 服務搭建及配置,這裏我就不在詳細說了,具體能夠參考以前文章 初試Jenkins2.0 Pipeline持續集成 前半部分 Jenkins 安裝這塊,講的很詳細。這裏我用 Docker 方式在本地快速搭建一個 Jenkins 服務。
docker run -d -p 9090:8080 -p 50000:50000 -v /Users/wanyang3/jenkins_home:/var/jenkins_home jenkins
此時 Jenkins 服務就運行在本地 http://127.0.0.1:9090
上了,咱們配置管理員帳戶 admin,密碼 admin 爲了後邊配置 Spinnaker 使用。接下來咱們建立一個普通的測試 Job,名稱爲 maven_test
,參數化構建過程處咱們配置一個 ci_version
參數,目的很明顯,就是爲了接收上邊 Pipeline 啓動參數中的 ci_version
值,讓他們可以串聯起來。
而後,在源碼管理處,配置咱們的代碼倉庫地址及分支 (這裏分支也能夠配置成參數,從 Spinnaker 啓動參數中獲取哈,這裏就不演示了)。最後,咱們在配置一下構建,執行一個 shell,簡單打印一下獲取的參數,最後在執行一個 mvn clean
命令。
配置完成後,接下來就須要配置 Spinnaker config 文件,開啓對 Jenkins 的支持以及配置 Jenkins 信息。
5.2 配置 Spinnaker config 集成 Jenkins
上邊提到,Spinnaker 的配置文件爲 $HOME/.spinnaker/spinnaker-local.yml
,那麼咱們須要作一些修改。
$ vim $HOME/.spinnaker/spinnaker-local.yml ... igor: enabled: true # 這裏默認爲 false,修改成 true host: ${services.default.host} port: 8088 baseUrl: ${services.default.protocol}://${services.igor.host}:${services.igor.port} ... jenkins: enabled: ${services.igor.enabled:false} defaultMaster: name: Jenkins baseUrl: http://localhost:9090 # 配置上邊啓動的 Jenkins 服務地址 username: admin # 管理員用戶名 password: admin # 管理員密碼或管理員對應的 API Token ...
配置完成後,在 Run 一下 Spinnaker 服務,默認 Spinnaker 會檢測各組件若是已經啓動的話,將再也不重啓。固然也能夠先 Stop,而後在 Run 全部組件服務也能夠。
$ cd /Users/wanyang3/spinnaker/build $ ../spinnaker/dev/stop_dev.sh [service] $ ../spinnaker/dev/run_dev.sh [service]
注意:重啓服務後,若某些組件未啓動,須要像上邊同樣,手動啓動組件。上邊咱們設置了 Igor 爲 true,那麼會自動啓動起來,必定要保證 igor 能正常啓動,不然無法集成 Jenkins。
5.3 配置 Jenkins Stage
咱們繼續使用 first_pipeline
這個示例 Pipeline,簡單的在 Wait Stage 後邊追加一個 Jenkins Stage,讓其執行上邊配置的 Jenkins 名稱爲 maven_test
的 Job,而且將 參數 ci_version
傳遞過去。
點擊 「Wait Stage」 使其變綠,點擊 「+ Add Stage」,Type 選擇 Jenkins,Master 處選擇剛配置文件中定義的 name: Jenkins
Jenkins,這裏也能夠配置多個 Master,具體能夠參考文檔。Job 處選擇 maven_test
,默認會拉取該 Jenkins 下全部 Job。 Job Parameters 這裏就須要傳遞 ci_version
參數了,實際應用中,咱們是要動態獲取啓動參數中的參數配置,因此這裏能夠經過表達式 ${ parameters['ci_version']}
來獲取參數。Wait for results 默認勾選,等待 Jenkins 的執行結果,Jenkins 執行完畢,才結束流程。配置完成後,以下圖。
OK,配置完成。最後咱們在來啓動一下 first_pipeline
,輸入 ci_version
參數,選擇 branch
參數啓動,選擇 「develop environment」 繼續,執行完 「Check Preconditions develop」 Stage,繼續到 「Wait Stage」 等待 30s 後,執行 「Jenkins Stage」,可是執行失敗了。。。 這是爲啥? 看返回的報錯信息是 403 No valid crumb was included in the request
,緣由是 Jenkins 默認開啓防止跨站點請求僞造致使的,解決方案就是去 Jenkins —> 系統管理 —> 防止跨站點請求僞造處,去掉勾選便可。再次運行,就能夠成功運行啦!
點擊詳情中 「Build #47」 連接,查看這次 Build Log,能夠看到正常啓動並傳遞參數。
...
[maven_test] $ /bin/sh -xe /tmp/hudson9078124639399895924.sh + echo ci_version: 1.0.1 ci_version: 1.0.1 + sleep 15s + echo hello this is maven-test job trgger by spinnaker hello this is maven-test job trgger by spinnaker [maven_test] $ /var/jenkins_home/tools/.repository/bin/mvn clean [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building qd_api 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ qd_api --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.809 s [INFO] Finished at: 2017-12-04T09:00:22+00:00 [INFO] Final Memory: 5M/59M [INFO] --------------