Как да получа достъп до данни за средата на git в плъгин на jenkins, използвайки тръбопровод

Бих искал да получа git commit хеша на текущата компилация от плъгин (тоест в Java клас, който разширява hudson.tasks.Recorder).

Това работи за проект за свободен стил:

EnvVars env = run.getEnvironment(listener);
String hash = env.get("GIT_COMMIT");

Въпреки това, в тръбопроводните проекти променливата на средата GIT_COMMIT очевидно не е зададена, така че хешът става нулев. Това е вярно дори за декларативен тръбопровод, където стъпката за проверка на scm е имплицитна.

Има ли алтернативен начин за получаване на хеша на ангажимента в тръбопроводен проект?

Редактиране: За да поясня, това се отнася до получаване на git commit хеш от кода на Java в плъгин на Jenkins, а не в groovy/Jenkinsfile. Изглежда, че променливата на средата няма да съществува, когато плъгинът се използва в задания за конвейер, така че търся заобиколно решение.


person Gutskalk    schedule 08.10.2018    source източник


Отговори (2)


Имах много подобен проблем - ето как го реших. Номерът е да го направите във вашия StepExecution клас, тъй като той има достъп до StepContext - тогава можете да получите набора от променливи на средата от там. Кодът е като този:

public class MyExecution extends SynchronousNonBlockingStepExecution<ReturnType> {
    ...

    @Override
    protected ReturnType run() throws Exception {
        try {
            StepContext context = getContex();
            EnvVars env = context.get(EnvVars.class);
            ...
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }

    ...
}
person Aleks G    schedule 15.11.2018
comment
Звучи така, че това може да работи - но по-често срещаният (мисля) начин за създаване на плъгин с поддръжка на конвейер е да се използва BuildStep, който имплементира SimpleBuildStep, и изобщо да не се използва плъгинът за работен поток. Вашият метод работи само ако отидете по пътя на работния поток-плъгин. - person Gutskalk; 16.11.2018
comment
Между другото, опитахте ли да получите достъп до специфични за SCM променливи на средата по този начин? - person Gutskalk; 16.11.2018
comment
@Gutskalk Имам стъпки, продължаващи от org.jenkinsci.plugins.workflow.steps.Step. След това стъпката изисква изпълнение, което в моя случай се простира от SynchronousNonBlockingStepExecution. Вътре в това изпълнение мога да използвам кода, който показах. Не съм опитвал сам да получа информация за scm. Подозирам, че бихте могли да получите Run от там, след което да използвате getParent върху него за достъп до самата работа - и от задачата трябва да можете да получите SCM подробности. - person Aleks G; 16.11.2018

Опитайте да използвате променлива currentBuild. Той съдържа поле changeSets, което съдържа подробности за списъка с ангажименти.

От документа:

changeSets

списък с набори от промени, идващи от различни SCM проверки; всеки има вид и е списък с ангажименти; всеки комит има commitId, timestamp, msg, автор и засегнати файлове, всеки от които има editType и път;

person Thiru    schedule 09.10.2018
comment
Нямам достъп до нито една променлива currentBuild. Трябва да направя това от метода perform на SimpleBuildStep - само по този начин плъгинът ще работи с конвейерни задания. В този метод за изпълнение имам достъп до изпълнение (hudson.model.Run), но не и изграждане (hudson.model.Build). Виждам, че компилациите (но не се изпълняват) имат метод getChangeSet(), но дори оттам не мога да видя как да получа хеша на комита. - person Gutskalk; 09.10.2018