Как установить описание сборки 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"

но на самом деле он не устанавливает описание.

есть идеи, как этого можно достичь?

другие решения, которые я нашел, но я не очень доволен:

5 ответов


вы всегда можете иметь переменную и передать описание сборки в переменную при первоначальном вызове. Затем в конце сборки выведите переменную на консоль и поймайте с помощью описание setter plugin.

изменить, чтобы уточнить:

  • установить описание setter plugin.
  • в конфигурации задания настройте Строковый параметр, вызовите его "MyDescription", оставить по умолчанию пустой.
  • где-то в шагах построения, либо "Выполнить Консоли" или "Выполнить Пакетную Команду Windows" тип echo Desc: $MyDescription или echo Desc: %MyDescription% в зависимости от вашей ОС.
  • в шагах после сборки выберите" Установить Описание Сборки".
    • Set регулярные выражения as ^Desc: (.*)
    • Set описание as
  • из командной строки вызвать:

curl -v -X POST --data-urlencode "MyDescription=This is my desc" "http://[myServer]/job/[jobName]/buildWithParameters"
(это выше одной строки)


У меня была такая же потребность-установить описание сборки Как только начнется сборка.
Обратите внимание, что Описание Сборки Setter плагин активируется как действие после сборки что для меня слишком поздно.
Способ, которым я решил это, - незначительное изменение конфигурации задания и скрипта Python (но может быть на любом языке):

  • добавьте параметр UUID в конфигурацию задания
  • создал скрипт для отправить и установить описание

скрипт делает следующее:

  1. при отправке сборки создайте значение uuid (уникальное, верно?) и заполнить параметр UUID
  2. опросите задание Дженкинса (получите его JSON через REST API), цикл на всех запущенных сборках, найдите мое (через известное значение UUID). Ограничьте опрос таймаутом, чтобы мы не зависали навсегда
  3. используйте Jenkins Java CLI, чтобы установить описание (команда 'set-build-description')

работает все время, за исключением случаев, когда сборка находится в очереди (нет свободных исполнителей), и тайм - аут, установленный выше, истекает-я ничего не могу сделать.


для тех, кто заинтересован в использовании пользовательского интерфейса Jenkins, я пытаюсь:

  1. https://wiki.jenkins-ci.org/display/JENKINS/Build+имя+сеттер + плагин
  2. 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); 
}