Jenkins參數化構建 - (多任務並串聯參數傳遞)

 

業務需求:提供一個API 接口給開發同事用於傳參,而後將參數再傳給測試組的對應接口。其實這個接口就起到一個數據中轉做用,接收參數 - 轉發參數。node

實施方案:在Jenkins上新建一個Job,而後引用測試組的Job做爲子任務 (最終是測試組接收數據)。這裏就涉及到"Jenkins的多個任務並串聯參數傳遞"的配置,須要用"Parameterized Trigger Plugin",下載地址: https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Pluginpython

1)新建一個Job任務,參數化構建。新建Job任務後,勾上"參數化構建",將下面9個參數定義下。json

引用子任務,而後將上面配置的參數在引用子任務這塊,將上面的9個參數從新預約下 (predefined parameters)。 注意下面幾個配置項含義:flask

Current build parameters:  當前job的參數
predefined parameters:  預約義的參數
Build on the same mode: 和當前job在同一個node上執行。
Boolean parameters: 布爾類型的值
Parameters from properties file: 從屬性文件中加載參數。api

須要注意:下游任務必須是參數化構建任務。向下遊傳遞的參數的名稱必需要和下游任務的
參數名稱同樣 或者 參數名稱是系統環境變量的參數(the list of available environment variables) ,否則下游job接收不到該參數的值。tomcat

2) 能夠手動填寫對應參數值,點擊構建,查看下執行過程和子任務那邊的構建信息,確認參數是否正確傳過去了:bash

 如上,發現手動輸入的參數能夠成功接收並傳到子任務那邊了!app

3)使用Jenkins API接口,以POST方式進行傳參上面所參數的jenkins任務對應的API接口爲http://******:19090/job/*****_Docker_Automated_Tests/buildWithParameters?$parametes。  在終端窗口裏使用curl -X POST方式進行訪問 (單引號或雙引號均可以),訪問後,會自動觸發jenkins界面裏對應的任務執行(注意:必須是POST方式訪問,纔會自動觸發Jenkins任務構建)!curl

# curl -X POST "http://*******:19090/job/******_Docker_Automated_Tests/buildWithParameters?AGILE_COMPILE_BRANCH=master&AGILE_MODULE_NAME=******/XPS/testflow&AGILE_PRODUCT_PATH=application-d7ea6a96a9999a96bbb1e80b4289622c206a65c3-f7909295624b82a7a5fa27c3fec3554c.tar.gz_f7909295624b82a7a5fa27c3fec3554c&AGILE_COMPILE_BUILD_ID=528721&AGILE_REVISION=d7ea6a96a9999a96bbb1e80b4289622c206a65c3&AGILE_RELEASE_VERSION=1.1.5.100&AGILE_TRIGGER_USER=test&Deploy_Env=D&Deploy_App=tomcat_8899"post

而後觀察jenkins上對應任務執行過程(須要稍等一小會兒)

發現經過post方式訪問這個api接口也是能夠自動觸發並能成功傳參!因此就能夠將下面這個Jenkins API接口給開發同事,用於調用這個參數進行上面相關參數的推送了。
http://******:19090/job/*****_Docker_Automated_Tests/buildWithParameters?AGILE_COMPILE_BRANCH=編譯分支&AGILE_MODULE_NAME=模塊名稱&AGILE_PRODUCT_PATH=生產路徑&AGILE_COMPILE_BUILD_ID=編譯構建ID&AGILE_REVISION=修訂版本&AGILE_RELEASE_VERSION=發佈版本&AGILE_TRIGGER_USER=觸發器用戶&Deploy_Env=部署環境&Deploy_App=部署應用程序          (這就是給開發的API接口地址)

另外注意一點:上面在使用curl -X POST方式訪問Jenkins API接口的時候,默認沒有跟Jenkins的用戶和密碼,默認是使用anonymous用戶,即匿名用戶對這個參數化構建的Job任務有執行權限的。若是anonymous沒有對Job任務有執行權限,就須要在訪問Jenkins API接口的時候跟上用戶名和密碼信息, 即"--user username:password", 以下:

                                                    寫一個python的api接口,用於傳參                                                   

1)先安裝flask
[root@k8s-master01 ~]# yum -y install epel-release
[root@k8s-master01 ~]# yum install python-pip
[root@k8s-master01 ~]# pip install Flask
[root@k8s-master01 ~]# flask --version
Python 2.7.5
Flask 1.1.1
Werkzeug 0.15.5

2)編寫腳本
[root@k8s-master01 ~]# cd myproject/
[root@k8s-master01 myproject]# ls
app.py  run.sh

[root@k8s-master01 myproject]# cat run.sh 
#!/bin/bash
cd ./
export FLASK_APP=app.py
flask run -h 0.0.0.0
[root@k8s-master01 myproject]# cat app.py
from flask import Flask, request
import json
app = Flask(__name__)
@app.route('/send', methods=['GET'])
def send():
    try:
        print(request.args)
        #tmp = request.url
        #AGILE_COMPILE_BRANCH = request.args.get("AGILE_COMPILE_BRANCH")
    except Exception as e:
        print(e)
    return 'ok'

3)執行接口服務
[root@k8s-master01 myproject]# nohup sh run.sh &
[root@k8s-master01 myproject]# lsof -i:5000
COMMAND  PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
flask   5391 root    3u  IPv4 25337407      0t0  TCP *:commplex-main (LISTEN)

4)另打開一個終端窗口,經過這個api接口進行傳參
api接口地址爲: http://localhost:5000/send?$parametes

命令爲(有多少參數就傳多少):
[root@k8s-master01 myproject]# curl "http://localhost:5000/send?&AGILE_COMPILE_BRANCH=master&AGILE_MODULE_NAME=XPS/testflow&AGILE_PRODUCT_PATH=application-d7ea6a96a9999a96bbb1e80b4289622c206a65c3-f7909295624b82a7a5fa27c3fec3554c.tar.gz&AGILE_COMPILE_BUILD_ID=528721&AGILE_REVISION=1.1.5.100&AGILE_REVISION=d7ea6a96a9999a96bbb1e80b4289622c206a65c3&AGILE_TRIGGER_USER=test&SYSTEM_CODE=cmp&Deploy_Env=F&Deploy_App=tomcat"

5)而後在查看接口日誌,發現參數已經傳過來了
[root@k8s-master01 myproject]# cat nohup.out 
 * Serving Flask app "app.py"
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [01/Aug/2019 13:45:58] "GET /send?&AGILE_COMPILE_BRANCH=master&AGILE_MODULE_NAME=XPS/testflow&AGILE_PRODUCT_PATH=application-d7ea6a96a9999a96bbb1e80b4289622c206a65c3-f7909295624b82a7a5fa27c3fec3554c.tar.gz&AGILE_COMPILE_BUILD_ID=528721&AGILE_REVISION=1.1.5.100&AGILE_REVISION=d7ea6a96a9999a96bbb1e80b4289622c206a65c3&AGILE_TRIGGER_USER=test&SYSTEM_CODE=cmp&Deploy_Env=F&Deploy_App=tomcat HTTP/1.1" 200 -
相關文章
相關標籤/搜索