2015-02-13 3 views
6

Я пытаюсь установить описание сборки сборки, которую я запускаю, поскольку я начинаю сборку, и мне пока не повезло.Как установить описание сборки Jenkins при запуске сборки через завиток?

я наткнулся на решение (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 - это тоже «после решения триггер», который не будет надежно работать так же, как просто установив описание после
  • Modifying Jenkins Description for a build - Я думаю, я мог бы создать чек и только изменить описание, когда оно пустое, поэтому я не переопределяю его, но это кажется довольно сложным. Я думаю, что для этого должно быть более легкое решение, нет?

ответ

9

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

Редактировать, чтобы уточнить:

  • Установите Description Setter plugin.
  • В конфигурации заданий настройте параметр String, назовите его «MyDescription», оставьте значения по умолчанию пустыми.
  • Где-то на этапах сборки, либо «Выполнить Shell» или «Выполнить Windows Batch Command» тип echo Desc: $MyDescription или echo Desc: %MyDescription%, в зависимости от вашей операционной системы.
  • На этапах после сборки выберите «Set Build Description».
    • Набор Регулярное выражение в ^Desc: (.*)
    • Set Описание в \1
  • Из триггера командной строки:

curl -v -X POST --data-urlencode "MyDescription=This is my desc" "http://[myServer]/job/[jobName]/buildWithParameters"
(что выше одна линия)

+0

К сожалению, я не могу не следуй ... не могли бы вы уточнить on: «У вас всегда может быть переменная и передать описание построения в переменную при начальном вызове»? Как мне это сделать? Просто уточнить: описание сборки должно быть разным для каждой запущенной сборки. – mac

+0

@mac уточнено в ответе – Slav

+1

Это сработало, спасибо! Хотя я должен сказать, что я понял способ «правильно» использовать параметр «причина» при запуске удаленной сборки, поэтому теперь я просто использую это вместо описания (причина также может содержать ссылку http, так же как и что трюк для меня) – mac

3

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

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

скрипт делает следующим образом:

  1. Когда submittin ga build, генерировать значение uuid (уникальное, право?) и заполнять параметр UUID
  2. Опрос работы Jenkins (получить его JSON через REST API), цикл на всех запущенных сборках, найти мой (через известное значение UUID). Ограничить опрос тайм-аут, так что мы не вешайте навсегда
  3. Используйте Jenkins Java CLI, чтобы установить описание (команда «установка сборки-описание»)

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

0

Другое решение, с "Выполнить сценарий Groovy System":

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

моя скачать:

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); 
} 
Смежные вопросы