如何在通过 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"
但实际上并没有设置描述。
知道如何实现吗?
我找到的其他解决方案,但我不是很满意:
- Changing Jenkins Build Name & Description through API in JAVA - 这也是一个 "post trigger solution" 无法可靠地工作,就像在
之后设置描述一样
- Modifying Jenkins Description for a build - 我想我可以建立一个检查,并且只在描述为空时修改描述,这样我就不会覆盖它,但这看起来相当复杂。我想一定有更简单的解决方案,不是吗?
您始终可以拥有一个变量,并在初始调用时将构建描述传递给该变量。然后在构建结束时,将变量输出到控制台并使用 Description Setter plugin.
捕获
编辑澄清:
- 安装Description Setter plugin.
- 在Job Configuration中,配置一个String参数,命名为“MyDescription”,默认留空。
- 在构建步骤的某处,“执行Shell”或“执行Windows批处理命令 " 输入
echo Desc: $MyDescription
或 echo 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 的人,我正在尝试:
- https://wiki.jenkins-ci.org/display/JENKINS/Build+Name+Setter+Plugin
- https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin
Postbuild 插件更强大,但需要 Groovy 修补和 perms。
我有同样的需求 - 在构建开始后立即设置构建描述。
请注意 Build Description Setter 插件被激活为 post-build action 这对我来说太晚了。
我解决它的方法是通过对作业配置和 Python 脚本(但可以使用任何语言)进行微小更改:
- 在作业配置中添加 UUID 参数
- 创建了一个脚本来提交和设置描述
脚本执行如下:
- 提交构建时,生成一个 uuid 值(唯一,对吗?)并填充 UUID 参数
- 轮询 Jenkins 作业(通过 REST API 获取其 JSON),循环所有 运行 构建,找到我的(通过 UUID 的已知值)。通过超时限制轮询,所以我们不会永远挂起
- 使用 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);
}
我正在尝试设置我正在触发的构建的构建描述,因为我正在启动构建,但到目前为止我还没有成功。
我遇到了一个解决方案 (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"
但实际上并没有设置描述。
知道如何实现吗?
我找到的其他解决方案,但我不是很满意:
- Changing Jenkins Build Name & Description through API in JAVA - 这也是一个 "post trigger solution" 无法可靠地工作,就像在 之后设置描述一样
- Modifying Jenkins Description for a build - 我想我可以建立一个检查,并且只在描述为空时修改描述,这样我就不会覆盖它,但这看起来相当复杂。我想一定有更简单的解决方案,不是吗?
您始终可以拥有一个变量,并在初始调用时将构建描述传递给该变量。然后在构建结束时,将变量输出到控制台并使用 Description Setter plugin.
捕获编辑澄清:
- 安装Description Setter plugin.
- 在Job Configuration中,配置一个String参数,命名为“MyDescription”,默认留空。
- 在构建步骤的某处,“执行Shell”或“执行Windows批处理命令 " 输入
echo Desc: $MyDescription
或echo 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 的人,我正在尝试:
- https://wiki.jenkins-ci.org/display/JENKINS/Build+Name+Setter+Plugin
- https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin
Postbuild 插件更强大,但需要 Groovy 修补和 perms。
我有同样的需求 - 在构建开始后立即设置构建描述。
请注意 Build Description Setter 插件被激活为 post-build action 这对我来说太晚了。
我解决它的方法是通过对作业配置和 Python 脚本(但可以使用任何语言)进行微小更改:
- 在作业配置中添加 UUID 参数
- 创建了一个脚本来提交和设置描述
脚本执行如下:
- 提交构建时,生成一个 uuid 值(唯一,对吗?)并填充 UUID 参数
- 轮询 Jenkins 作业(通过 REST API 获取其 JSON),循环所有 运行 构建,找到我的(通过 UUID 的已知值)。通过超时限制轮询,所以我们不会永远挂起
- 使用 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);
}