Como posso disparar outro trabalho a partir de um pipeline de jenkins (jenkinsfile) com o Plug-in Org do GitHub?

142

Como posso desencadear a construção de outro trabalho de dentro do Jenkinsfile?

Suponho que esse trabalho seja outro repositório da mesma organização do github , que já tenha seu próprio arquivo Jenkins.

Eu também quero fazer isso apenas se o nome da ramificação for mestre, pois não faz sentido disparar construções a jusante de ramificações locais.

Atualizar:

stage 'test-downstream'
node {
     def job = build job: 'some-downtream-job-name'
}

Ainda assim, quando executado, recebo um erro

Nenhum trabalho parametrizado chamado some-downtream-job-name foi encontrado

Estou certo de que esse trabalho existe no jenkins e está na mesma pasta da organização que a atual. É outro trabalho que tem seu próprio Jenkinsfile.

Observe que esta pergunta é específica ao plug - in da organização do GitHub, que cria e mantém automaticamente trabalhos para cada repositório e ramificação da sua organização do GitHub.

sorin
fonte

Respostas:

131

Primeiro de tudo, é um desperdício de um slot de executor envolver a buildetapa node. Seu executor upstream ficará ocioso sem motivo.

Segundo, em um projeto com várias BRANCH_NAMEramificações , você pode usar a variável de ambiente para tornar a lógica condicional na ramificação atual.

Terceiro, o jobparâmetro recebe um nome de trabalho absoluto ou relativo. Se você der um nome sem nenhuma qualificação de caminho, isso se referiria a outro trabalho na mesma pasta, o que, no caso de um projeto com várias ramificações, significaria outra ramificação do mesmo repositório.

Portanto, o que você quis escrever é provavelmente

if (env.BRANCH_NAME == 'master') {
    build '../other-repo/master'
}
Jesse Glick
fonte
2
Obrigado! Se por qualquer mudança que você também sabe sobre a forma de desencadear esta compilação sem esperar que ela termine seria double-awesome :)
Sorin
48
Verifique o gerador de trechos :build job: '../other-repo/master', wait: false
Jesse Glick 02/04
3
Existe alguma maneira de chamar a etapa de construção com um nome de filial dinâmico? Algo como build job: '../other-repo/$BRANCH_NAME'onde $BRANCH_NAMEestá a variável de ambiente Jenkins referente ao ramo que está executando o projeto Multibranch?
msteppe91
2
se ${BRANCH_NAME}estiver disponível como uma variável de ambiente, a substituição simples de cadeias funcionará. Apenas certifique-se de alternar para "from 'para citar sua string. por exemplo,build job: "../other-repo/${BRANCH_NAME}"
Cinderhaze
3
Ligação API para build job: jenkins.io/doc/pipeline/steps/pipeline-build-step
Katie
123

Além das respostas mencionadas acima: eu queria iniciar um trabalho com um parâmetro simples passado para um segundo pipeline e encontrei a resposta em https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow .

Então eu usei:

stage ('Starting ART job') {
    build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}
FrankIJ
fonte
11
O trabalho de construção tem de ser incorporado em um passo (a partir da versão 0.5)
rhoerbe
5
O BUILD_NUMBER do trabalho Jenkins invocado pelo buildcomando foi retornado? Como acessar o BUILD_NUMBER em um dos seguintes estágios? Alguém sabe onde esse comando está documentado?
User909481
4
Hoje em build job: 'freestyle', parameters: [ string(name: 'param1', value:'test_param'), string(name:'dummy', value: "${index}")]dia, de jenkins.io/doc/pipeline/examples/#jobs-in-parallel
BartBiczBoży
Mas como usar esses parâmetros passados no 2º trabalho
Suave
2
Curiosamente build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]] , não funcionou para mim, mas: build job: 'RunArtInTest', parameters: [string(name: 'systemname', value: "${VALUE}")] trabalhou
Alberto C
24

O comando buildno pipeline existe para acionar outros trabalhos no jenkins.

Exemplo no github

O trabalho deve existir em Jenkins e pode ser parametrizado. Quanto ao ramo, acho que você pode lê-lo no git

Flo
fonte
3
Tentei adicionar, build job: 'jobnamemas recebo esse erro No parameterized job named jobname founde posso garantir que existe um trabalho com esse nome no mesmo nível na pasta da organização.
sorin 30/03
1
Sim, existe um trabalho, mas esse trabalho não está parametrizado. Eu estou tentando entender como parametrizar um trabalho criado por GitHub organização plug-in embora
Yiwen
6
O formato do nome do trabalho é:build job: "${ORGANISATION_NAME}/${REPO_NAME}/master"
Sahil Ahuja
2
@SahilAhuja Isso é totalmente arbitrário e baseado no seu layout Jenkins, e se você quiser usar um caminho absoluto, precisará começar com a /. Caminhos relativos são bons; o problema de sorin provavelmente era que o chamado do trabalho buildera um trabalho de várias jobnamefiliais , o que significa que um caminho tentaria criar o ramo jobnamedo mesmo trabalho; ele precisa ser em ../jobname/branchnamevez disso
Michael Mrozek 26/03
Isso funciona bem, mas o que acontece se o ramo especificado não existir?
Jaime Alcántara Arnela
17

Você pode usar a build jobetapa do Jenkins Pipeline (requisito mínimo de Jenkins: 2.130).

Aqui está a API completa da buildetapa: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

Como usar build:

  • job: Nome de um trabalho a jusante a ser construído. Pode ser outro trabalho do Pipeline, mas mais comumente é um estilo livre ou outro projeto.
    • Use um nome simples se o trabalho estiver na mesma pasta que esse trabalho de pipeline upstream;
    • Você pode usar caminhos relativos como../sister-folder/downstream
    • Ou você pode usar caminhos absolutos como/top-level-folder/nested-folder/downstream

Acionar outro trabalho usando uma ramificação como um parâmetro

Na minha empresa, muitas de nossas filiais incluem "/". Você deve substituir quaisquer instâncias de "/" por "% 2F" (como aparece no URL do trabalho).

Neste exemplo, estamos usando caminhos relativos

    stage('Trigger Branch Build') {
        steps {
            script {
                    echo "Triggering job for branch ${env.BRANCH_NAME}"
                    BRANCH_TO_TAG=env.BRANCH_NAME.replace("/","%2F")
                    build job: "../my-relative-job/${BRANCH_TO_TAG}", wait: false
            }
        }
    }

Acionar outro trabalho usando o número da compilação como um parâmetro

build job: 'your-job-name', 
    parameters: [
        string(name: 'passed_build_number_param', value: String.valueOf(BUILD_NUMBER)),
        string(name: 'complex_param', value: 'prefix-' + String.valueOf(BUILD_NUMBER))
    ]

Acionar muitos trabalhos em paralelo

Fonte: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/

Mais informações sobre o Parallel aqui: https://jenkins.io/doc/book/pipeline/syntax/#parallel

    stage ('Trigger Builds In Parallel') {
        steps {
            // Freestyle build trigger calls a list of jobs
            // Pipeline build() step only calls one job
            // To run all three jobs in parallel, we use "parallel" step
            // https://jenkins.io/doc/pipeline/examples/#jobs-in-parallel
            parallel (
                linux: {
                    build job: 'full-build-linux', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                mac: {
                    build job: 'full-build-mac', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                windows: {
                    build job: 'full-build-windows', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                failFast: false)
        }
    }

Ou alternativamente:

    stage('Build A and B') {
            failFast true
            parallel {
                stage('Build A') {
                    steps {
                            build job: "/project/A/${env.BRANCH}", wait: true
                    }
                }
                stage('Build B') {
                    steps {
                            build job: "/project/B/${env.BRANCH}", wait: true
                    }
                }
            }
    }
Katie
fonte
3

Use o plug-in de trabalho de construção para essa tarefa para acionar outros trabalhos do arquivo jenkins. Você pode adicionar uma variedade de lógica à sua execução, como opções e etapas paralelas, de nó e agentes e para acionar tarefas externas. Dei um exemplo de livro de receitas fácil de ler para isso.

1.exemplo para acionar trabalhos externos a partir do arquivo jenkins com exemplo condicional:

if (env.BRANCH_NAME == 'master') {
  build job:'exactJobName' , parameters:[
    string(name: 'keyNameOfParam1',value: 'valueOfParam1')
    booleanParam(name: 'keyNameOfParam2',value:'valueOfParam2')
 ]
}

2.exemplo acionando vários trabalhos do arquivo jenkins com exemplo de condicionais:

 def jobs =[
    'job1Title'{
    if (env.BRANCH_NAME == 'master') {
      build job:'exactJobName' , parameters:[
        string(name: 'keyNameOfParam1',value: 'valueNameOfParam1')
        booleanParam(name: 'keyNameOfParam2',value:'valueNameOfParam2')
     ]
    }
},
    'job2Title'{
    if (env.GIT_COMMIT == 'someCommitHashToPerformAdditionalTest') {
      build job:'exactJobName' , parameters:[
        string(name: 'keyNameOfParam3',value: 'valueOfParam3')
        booleanParam(name: 'keyNameOfParam4',value:'valueNameOfParam4')
        booleanParam(name: 'keyNameOfParam5',value:'valueNameOfParam5')
     ]
    }
}
avivamg
fonte
Mas como receber e usar os parâmetros no 2º emprego
Gentil
2
@□ Gentil. Você pode acessar paramater passado como params.systemname
Pankaj Shinde