Работата на Дженкис надолу по веригата не успява да намери артефакти нагоре по веригата

Настройката се използва за изграждане и внедряване в Adobe AEM.

Главното задание за компилация изтегля от хранилището на git, компилира и пакетира, изпълнява тестовете и след това задейства задания надолу по веригата, които трябва да използват изградените пакети от заданието нагоре по веригата.

Проблемът е, че заданието надолу по веригата е неуспешно със съобщението:

Unable to access upstream artifacts area /var/lib/jenkins/jobs/PROJECTNAME-Master-Branch/builds/2014-10-22_11-33-46/archive. Does source project archive artifacts?

Струва ми се, че по някакъв начин приставката CopyArtifacts, задействана от заданието надолу по веригата, търси артефактите на грешно място. Правилното местоположение би било

/var/lib/jenkins/jobs/PROJECTNAME-Master-Branch/workspace/PROJECTNAME-*/**/*.jar,/var/lib/jenkins/jobs/PROJECTNAME-Master-Branch/workspace/PROJECTNAME-*/**/*.zip

Но след това се оплаква

java.io.IOException: Expecting Ant GLOB pattern, but saw '/var/lib/jenkins/jobs/PROJECTNAME-Master-Branch/workspace/PROJECTNAME-*/**/*.jar,/var/lib/jenkins/jobs/PROJECTNAME-Master-Branch/workspace/PROJECTNAME-*/**/*.zip'. See http://ant.apache.org/manual/Types/fileset.html for syntax

Заданието надолу по веригата копира артефакти от друг проект и след това изграждането беше или „Изграждане нагоре по веригата, което задейства това задание“ или „Копиране от работното пространство на последната завършена компилация“. И никой не работи.

Някакви идеи?


person Dex    schedule 23.10.2014    source източник
comment
Вие не архивирате артефактите, преди да се опитате да ги използвате   -  person Slav    schedule 23.10.2014
comment
Освен това се опитвате да използвате абсолютни пътища, когато те трябва да са относителни към $WORKSPACE или към архивирано местоположение   -  person Slav    schedule 23.10.2014


Отговори (3)


TL;DR

Опитвате се да използвате артефакти, без първо да ги архивирате.
Опитвате се да използвате абсолютни пътеки, но те трябва да са относителни към $WORKSPACE и/или „архивно местоположение“.

Пълен отговор

Вие разбирате погрешно концепцията за "Артефакти", свързана с Дженкинс.

Какво представляват артефактите на Дженкинс

Артефактите са файлове, които са специално запазени след изграждането с помощта на действието Архивиране на артефактите след изграждането.

Когато компилацията се изпълнява, тя работи в рамките на:
$WORKSPACE, което във файловата система обикновено се намира в рамките на
$JENKINS_HOME/jobs/$JOB_NAME/workspace
Вътре там можете да имате вашите папки за плащане на SCM, файлове за временна компилация, окончателни компилирани файлове, двоични файлове и т.н.

Съдържанието на $WORKSPACE е нестабилно, никога не трябва да разчитате на него извън времевата рамка за компилация (а задачите надолу по веригата са извън времевата рамка за компилация). Съдържанието на $WORKSPACE може да е различно между различните главни/подчинени възли, то може да бъде изтрито по всяко време от администратора или от SCM актуализация/почистване/чекиране.

Също така е важно да разберете, че има само един $WORKSPACE за цялата работа.

Но сега обърнете внимание на вашата История на компилациите, има няколко записа в този списък, посочени с номер на компилация (#) и клеймо за дата и час. Те се съхраняват под:
$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID
като $BUILD_ID е клеймото за дата и час на компилацията, като 2014-10-22_11-33-46

$WORKSPACE съдържа информация, свързана с текущата или последната (и проблемът е: никога не можете да сте сигурни дали е „текуща“ или „последна“) компилация;
Папката builds съдържа запис на всички минали (запазени) изпълнения на компилации (това съставлява списъка История на компилации отляво), на компилация.

По подразбиране той съдържа само това, от което се нуждае самият Дженкинс: копие на build.xml, информация за регистър на промените, регистрационен файл на конзолата. Когато отидете на URL http://$JENKINS_URL/job/$JOB_NAME/[nn]/, където [nn] е числов номер за изграждане/изпълнение на задача (#), той чете тази информация от папката builds във файловата система.

За да запазите артефактите на дадена компилация (за да избегнете презаписването им от следващата компилация, изтриването на работното пространство или просто за достъп до по-стари компилации), трябва да Архивирате артефактите (със същото действие след компилацията с същото заглавие). Когато архивирате артефактите, вие посочвате кои файлове в $WORKSPACE искате да запазите. Когато Дженкинс извърши архивирането, той ще постави тези файлове (запазвайки пътеките [спрямо $WORKSPACE] запазени) в:
$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/.
По този начин можете да имате множество набори от артефакти, запазени за предишни компилации, а не само за „най-новите /последно“ от $WORKSPACE.

За пълнота ще спомена, че "постоянните връзки" на Дженкинс, като http://$JENKINS_URL/job/$JOB_NAME/lastSuccessfulBuild и /lastFailedBuild и т.н., всъщност са символни връзки във файловата система към една от запазените builds/$BUILD_ID папки.

И накрая, вие контролирате колко изпълнения на компилации и колко артефакти се запазват (могат да бъдат конфигурирани отделно) чрез отметката „Изхвърляне на стари компилации“ в конфигурацията на заданието. По подразбиране всички се запазват, но ако започнете да запазвате артефакти, трябва да помислите за капацитета на пространството на твърдия диск.

Решения на вашия проблем

И така, с информацията по-горе и разглеждайки вашите съобщения за грешка, сега трябва да видите, че плъгинът Копиране на артефакти правилно търси артефакти в секцията /archive/ на компилация.

Трябва също така да забележите, че плъгинът Копиране на артефакти не ви позволява да изберете „текуща компилация“, когато избирате от коя компилация да копирате. Има постоянни връзки (като „последна успешна“ или „последна компилация“) и конкретни номера на компилации, всички от които се превеждат като запазени компилации под $JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/

Дори „Изграждане нагоре по веригата, което задейства тази задача“ ще се свърже към конкретен $BUILD_ID.

Във всяка от опциите по-долу

Конфигурацията за Архивиране на артефакти е свързана с $WORKSPACE.
Конфигурацията за Копиране на артефакти е свързана с „архивно местоположение“, което е $JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/.
От „Копиране на артефакти“ е спрямо „архивно местоположение“, а „архивно местоположение“ е спрямо $WORKSPACE, тогава за всички интензивни цели относителните пътища на двете конфигурации могат да бъдат еднакви и спрямо $WORKSPACE

Опция 1

  • First Archive the Artifacts with the post-build action, otherwise you have nothing to copy from.
    1. If you have your files in the root of $WORKSPACE, it should be:
      PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.zip
      (Note, not full paths in here)
  • Then use Upstream Build that triggered this job for Copy Artifacts selection.
    1. For Artifacts to copy field use either:
      • ** or blank to copy all archived artifacts, or
      • PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.zip (същото като секцията за архивиране)

Вариант 2

Ако не искате да архивирате, можете да използвате $WORKSPACE директно с Copy from workspace of latest completed build, все пак трябва да се уверите, че нито една втора компилация нагоре не може да се изпълнява, докато се изпълнява компилация надолу по веригата, в противен случай рискувате да получите частичен файл от частично изграждане, тъй като, както беше обяснено по-горе, $WORKSPACE е непостоянен.

  • Отново, за стъпката Копиране на артефакти под полето Артефакти за копиране използвайте път спрямо $WORKSPACE, който е:
    PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.zip

Вариант 3

Ако наистина искате да копирате цялото РАБОТНО ПРОСТРАНСТВО между различни задачи, използвайте едно от двете

person Slav    schedule 23.10.2014
comment
Аз например (и съм сигурен, че има много други) оценявам подробностите ти Слав (и резюме)! - person Ashley Aitken; 06.09.2015

Поправката може да е следната проста: деактивирайте или премахнете Приставката за компресиране на артефакти и рестартирайте Jenkins.

Това заобиколно решение е изведено от дългогодишен доклад за грешка: „Приставката за копиране на артефакти“ трябва да поддържа ArtifactManager.

person Juuso Ohtonen    schedule 24.04.2017

Решението е относно конфигурацията на строителя.

Основната причина се крие в конфигурацията на заданието надолу по веригата. След като бъде избрано „Копиране от работното пространство на последната завършена компилация“ за компилацията, която да бъде копирана, и пътят на артефактите за копиране е зададен на относителен път, като име на проект-//.jar ,projectname-//.zip, тогава изграждането е успешно.

Освен това, в конфигурацията на родителското задание, заданието надолу по веригата трябва да бъде разрешено за CopyArtifact и полето Projects за разрешаване на артефакти за копиране трябва да указва заданието надолу по веригата.

Редактиране: Сега виждам, че сте отговорили междувременно. Страхотен отговор и като цяло изяснява някои от въпросите, които имах.

Единственото неясно нещо за опция 1 е, че архивирането на файловете става след приключване на основната задача.

Waiting for the completion of projectname-Deploy
projectname-Deploy #19 completed. Result was SUCCESS
Waiting for the completion of projectname-Deploy
projectname-Deploy #20 completed. Result was SUCCESS
Build step 'Trigger/call builds on other projects' changed build result to SUCCESS
Strings match run condition: string 1=[lab2b], string 2=[both]
Run condition [Strings match] preventing perform for step [BuilderChain]
Archiving artifacts 

След като промених подхода към втория вариант, той проработи за мен, но бих искал да разбера и първия вариант.

person Dex    schedule 24.10.2014
comment
Въз основа на вашия журнал вие задействате изграждане надолу по веригата от стъпка на изграждане, докато архивирането е действие след изграждането. Действията след изграждането винаги се извършват след приключване на всички стъпки на изграждане и в донякъде предварително определен ред. За да заобиколите това, имате нужда от Всяка стъпка на компилация и добавки за Flexible Publish. Използвайки последното, можете да конфигурирате действие след изграждане първо да архивирате, а след това да задействате изграждане надолу по веригата. - person Slav; 25.10.2014
comment
@Slav Подходът Any Build Step работи ли за вас? Не работих за мен: Стъпка на условно изграждане #1 архивира артефактите, а Стъпка на условно изграждане #2 задейства друго изграждане, изчакващо да завърши. Обаче артефактите не са налични за компилацията надолу по веригата, тъй като компилацията нагоре се изпълнява. Така че и двете задачи се провалят. - person Juuso Ohtonen; 21.02.2019
comment
@JuusoOhtonen, съжалявам, мина известно време и в момента нямам нищо подобно, което да опитам. Късмет - person Slav; 22.02.2019