Как установить описание сборки Jenkins при запуске сборки через curl?
Я пытаюсь установить описание сборки сборки, которую я запускаю, поскольку я запускаю сборку, и мне пока не повезло.
я наткнулся на решение (добавление текста на страницу сборки, вызванной удаленным API Jenkins), и я вроде как получил его, чтобы работать таким образом (первая команда запустит сборку, вторая установит описание последней сборки):
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"
но на самом деле он не устанавливает описание.
есть идеи, как этого можно достичь?
другие решения, которые я нашел, но я не очень доволен:
- изменение имени и описания сборки Jenkins через API в JAVA - это также "решение триггера post", которое не будет работать надежно так же, как просто установка описания после
- изменение описания Дженкинса для сборки - думаю, я мог бы создать чек и изменить описание только тогда, когда оно пустое, поэтому я не переопределяю его, но это кажется довольно сложным. Я думаю, что должно быть более простое решение, нет?
5 ответов
вы всегда можете иметь переменную и передать описание сборки в переменную при первоначальном вызове. Затем в конце сборки выведите переменную на консоль и поймайте с помощью описание setter plugin.
изменить, чтобы уточнить:
- установить описание setter plugin.
- в конфигурации задания настройте Строковый параметр, вызовите его "MyDescription", оставить по умолчанию пустой.
- где-то в шагах построения, либо "Выполнить Консоли" или "Выполнить Пакетную Команду Windows" тип
echo Desc: $MyDescription
илиecho Desc: %MyDescription%
в зависимости от вашей ОС. - в шагах после сборки выберите" Установить Описание Сборки".
- Set регулярные выражения as
^Desc: (.*)
- Set описание as
- Set регулярные выражения as
- из командной строки вызвать:
curl -v -X POST --data-urlencode "MyDescription=This is my desc" "http://[myServer]/job/[jobName]/buildWithParameters"
(это выше одной строки)
У меня была такая же потребность-установить описание сборки Как только начнется сборка.
Обратите внимание, что Описание Сборки Setter плагин активируется как действие после сборки что для меня слишком поздно.
Способ, которым я решил это, - незначительное изменение конфигурации задания и скрипта Python (но может быть на любом языке):
- добавьте параметр UUID в конфигурацию задания
- создал скрипт для отправить и установить описание
скрипт делает следующее:
- при отправке сборки создайте значение uuid (уникальное, верно?) и заполнить параметр UUID
- опросите задание Дженкинса (получите его JSON через REST API), цикл на всех запущенных сборках, найдите мое (через известное значение UUID). Ограничьте опрос таймаутом, чтобы мы не зависали навсегда
- используйте Jenkins Java CLI, чтобы установить описание (команда 'set-build-description')
работает все время, за исключением случаев, когда сборка находится в очереди (нет свободных исполнителей), и тайм - аут, установленный выше, истекает-я ничего не могу сделать.
для тех, кто заинтересован в использовании пользовательского интерфейса Jenkins, я пытаюсь:
- https://wiki.jenkins-ci.org/display/JENKINS/Build+имя+сеттер + плагин
- https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild + плагин
плагин Postbuild намного мощнее, но требует Groovy возиться и perms.
другое решение, с "выполнить 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);
}