如何在通过 curl 触发构建时设置 Jenkins 构建描述?

How can I set Jenkins build description while triggering build via curl?

我正在尝试设置我正在触发的构建的构建描述,因为我正在启动构建,但到目前为止我还没有成功。

我遇到了一个解决方案 (Adding text to the page of a build triggered by the Jenkins remote API),我有点让它以这种方式工作(第一个命令将启动构建,第二个命令将设置最后一个构建的描述):

curl -v -X POST "http://[myServer]/job/[jobName]/build"
curl -v -X POST "http://[myServer]/job/[jobName/lastBuild/submitDescription" --data-urlencode "description=test description"

但是,问题是如果我刚启动的构建排队/没有立即启动,"lastBuild" 将不会引用我刚启动的构建,而是引用它之前的构建(仍在建设中)。

所以我尝试了这样的事情:

payload='json={""description"":""test description""}'
curl -v -X POST -H "Content-Type: application/json" -d $payload "http://[myServer]/job/[jobName]/build"

但实际上并没有设置描述。

知道如何实现吗?

我找到的其他解决方案,但我不是很满意:

您始终可以拥有一个变量,并在初始调用时将构建描述传递给该变量。然后在构建结束时,将变量输出到控制台并使用 Description Setter plugin.

捕获

编辑澄清:

  • 安装Description Setter plugin.
  • 在Job Configuration中,配置一个String参数,命名为“MyDescription”,默认留空。
  • 在构建步骤的某处,“执行Shell”或“执行Windows批处理命令 " 输入 echo Desc: $MyDescriptionecho Desc: %MyDescription%,具体取决于您的 OS。
  • 在 Post-构建步骤中,select“设置构建描述”。
    • 设置正则表达式^Desc: (.*)
    • 描述设为</code></li> </ul></li> <li>从命令行触发:</li> </ul> <p><code>curl -v -X POST --data-urlencode "MyDescription=This is my desc" "http://[myServer]/job/[jobName]/buildWithParameters"
      (上面是一行)

对于那些有兴趣使用 Jenkins UI 的人,我正在尝试:

  1. https://wiki.jenkins-ci.org/display/JENKINS/Build+Name+Setter+Plugin
  2. https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin

Postbuild 插件更强大,但需要 Groovy 修补和 perms。

我有同样的需求 - 在构建开始后立即设置构建描述
请注意 Build Description Setter 插件被激活为 post-build action 这对我来说太晚了。
我解决它的方法是通过对作业配置和 Python 脚本(但可以使用任何语言)进行微小更改:

  • 在作业配置中添加 UUID 参数
  • 创建了一个脚本来提交和设置描述

脚本执行如下:

  1. 提交构建时,生成一个 uuid 值(唯一,对吗?)并填充 UUID 参数
  2. 轮询 Jenkins 作业(通过 REST API 获取其 JSON),循环所有 运行 构建,找到我的(通过 UUID 的已知值)。通过超时限制轮询,所以我们不会永远挂起
  3. 使用 Jenkins Java CLI 设置描述(命令'set-build-description')

一直工作,除非构建排队(没有免费的执行程序可用)并且上面设置的超时到期 - 我无能为力。

另一个解决方案, "Execute Groovy System script" :

def currentBuild = Thread.currentThread().executable
def FOO = build.buildVariableResolver.resolve('FOO')
currentBuild.setDescription(FOO)

我的下载:

String urlDownload = "https://dl.dropbox.com/s/ex4clsfmiu142dy/test.zip?token_hash=AAGD-XcBL8C3flflkmxjbzdr7_2W_i6CZ_3rM5zQpUCYaw&dl=1";     
DownloadManager.Request request = new  DownloadManager.Request(Uri.parse(urlDownload)); 
request.setDescription("Testando"); request.setTitle("Download"); 
request.allowScanningByMediaScanner(); 
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "teste.zip"); 
final DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
final long downloadId = manager.enqueue(request); 
final ProgressBar mProgressBar = (ProgressBar) findViewById(R.id.progressBar1); 

new Thread(new Runnable() { 

    @Override 
    public void run() { 
        boolean downloading = true; 
        while (downloading) { 
            DownloadManager.Query q = new DownloadManager.Query(); 
            q.setFilterById(downloadId); 
            Cursor cursor = manager.query(q); 
            cursor.moveToFirst(); 
            int bytes_downloaded = cursor.getInt(cursor .getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); 
            int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); 
            if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) { 
                downloading = false; 
            } 
            final double dl_progress = (bytes_downloaded / bytes_total) * 100; 
            runOnUiThread(new Runnable() { 
                @Override 
                public void run() {
                    mProgressBar.setProgress((int) dl_progress); 
                } 
            }); 
            Log.d(Constants.MAIN_VIEW_ACTIVITY, statusMessage(cursor)); 
            cursor.close(); 
        } 
    } 
}).start();

我的statusMessage方法:

private String statusMessage(Cursor c) { 
    String msg = "???"; 
    switch (c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS))) { 
        case DownloadManager.STATUS_FAILED: 
            msg = "Download failed!"; 
            break; 
        case DownloadManager.STATUS_PAUSED: 
            msg = "Download paused!"; 
            break; 
       case DownloadManager.STATUS_PENDING: 
            msg = "Download pending!"; 
            break; 
       case DownloadManager.STATUS_RUNNING: 
            msg = "Download in progress!"; 
            break; 
       case DownloadManager.STATUS_SUCCESSFUL: 
            msg = "Download complete!"; 
            break; 
       default: 
            msg = "Download is nowhere in sight"; 
            break; 
   } 
   return (msg); 
}