ฉันจะทริกเกอร์งานอื่นจาก jenkins pipeline (jenkinsfile) ด้วย GitHub Org Plugin ได้อย่างไร


156

ฉันจะเรียกสร้างงานอื่นจากภายในได้Jenkinsfileอย่างไร

ฉันคิดว่างานนี้เป็นที่เก็บอื่นภายใต้องค์กร githubเดียวกันซึ่งมีไฟล์ Jenkins ของตัวเองอยู่แล้ว

ฉันต้องการทำเช่นนี้เฉพาะในกรณีที่ชื่อสาขาเป็นหลักเนื่องจากไม่สมเหตุสมผลที่จะเรียกใช้การสร้างดาวน์สตรีมของสาขาท้องถิ่นใด ๆ

อัปเดต:

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

ถึงกระนั้นเมื่อดำเนินการฉันได้รับข้อผิดพลาด

ไม่พบงานที่กำหนดพารามิเตอร์ชื่อ some-downtream-job-name

ฉันแน่ใจว่างานนี้มีอยู่ในเจนกินส์และอยู่ในโฟลเดอร์องค์กรเดียวกันกับงานปัจจุบัน Jenkinsfileมันเป็นงานที่มีของตัวเองอีก

โปรดทราบว่าคำถามนี้เป็นคำถามเฉพาะสำหรับGitHub Organization Pluginซึ่งสร้างและดูแลงานโดยอัตโนมัติสำหรับแต่ละที่เก็บและสาขาจากองค์กร GitHub ของคุณ

คำตอบ:


139

ครั้งแรกของทั้งหมดก็จะเสียสล็อตผู้บริหารที่จะตัดขั้นตอนในbuild nodeตัวดำเนินการต้นน้ำของคุณจะไม่ได้ใช้งานโดยไม่มีเหตุผล

ประการที่สองจากโครงการหลายสาขาคุณสามารถใช้ตัวแปรสภาพแวดล้อมBRANCH_NAMEเพื่อทำให้ตรรกะมีเงื่อนไขในสาขาปัจจุบัน

ประการที่สามjobพารามิเตอร์ใช้ชื่องานแบบสัมบูรณ์หรือแบบสัมพัทธ์ หากคุณตั้งชื่อโดยไม่มีคุณสมบัติพา ธ นั่นจะอ้างถึงงานอื่นในโฟลเดอร์เดียวกันซึ่งในกรณีของโปรเจ็กต์หลายสาขาจะหมายถึงสาขาอื่นของที่เก็บเดียวกัน

ดังนั้นสิ่งที่คุณตั้งใจจะเขียนน่าจะเป็น

if (env.BRANCH_NAME == 'master') {
    build '../other-repo/master'
}

2
ขอบคุณ! หากมีการเปลี่ยนแปลงใด ๆ คุณก็รู้วิธีทริกเกอร์
บิวด์

50
ตรวจสอบSnippet Generator :build job: '../other-repo/master', wait: false
Jesse Glick

3
มีวิธีใดในการเรียกขั้นตอนการสร้างด้วยชื่อสาขาแบบไดนามิกหรือไม่ สิ่งที่ต้องการbuild job: '../other-repo/$BRANCH_NAME'ที่$BRANCH_NAMEเป็นตัวแปรสภาพแวดล้อมเจนกินส์ที่เกี่ยวข้องกับสาขาที่ทำงานโครงการ Multibranch?
msteppe91

3
หาก${BRANCH_NAME}พร้อมใช้งานเป็นตัวแปรสภาพแวดล้อมการแทนที่สตริงอย่างง่ายจะทำ อย่าลืมเปลี่ยนไปใช้"จาก'สำหรับยกสตริงของคุณ เช่นbuild job: "../other-repo/${BRANCH_NAME}"
Cinderhaze

5
ลิงก์ API สำหรับbuild job: jenkins.io/doc/pipeline/steps/pipeline-build-step
Katie

131

นอกเหนือจากคำตอบข้างต้น: ฉันต้องการเริ่มงานด้วยพารามิเตอร์ง่ายๆที่ส่งผ่านไปยังท่อที่สองและพบคำตอบในhttp://web.archive.org/web/20160209062101/https://dzone.com/ refcardz / ต่อเนื่องจัดส่งกับเจนกินส์เวิร์กโฟลว์

ฉันจึงใช้:

stage ('Starting ART job') {
    build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}

11
ต้องฝังงานสร้างในขั้นตอน (เริ่มต้นด้วยเวอร์ชัน 0.5)
rhoerbe

6
BUILD_NUMBER ของงาน Jenkins ที่เรียกใช้โดยbuildคำสั่งส่งคืนหรือไม่ จะเข้าถึง BUILD_NUMBER ในขั้นตอนใดขั้นตอนหนึ่งต่อไปนี้ได้อย่างไร ใครรู้ว่าคำสั่งนั้นถูกบันทึกไว้ที่ไหน?
user909481

5
มันเป็นbuild job: 'freestyle', parameters: [ string(name: 'param1', value:'test_param'), string(name:'dummy', value: "${index}")]ปัจจุบันจากjenkins.io/doc/pipeline/examples/#jobs-in-parallel
BartBiczBoży

แต่วิธีการใช้พารามิเตอร์เหล่านี้ผ่านในงานที่ 2
Gentle

2
สิ่งที่น่าสนใจ build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]] ไม่ได้ผลสำหรับฉัน แต่: build job: 'RunArtInTest', parameters: [string(name: 'systemname', value: "${VALUE}")] ทำงาน
Alberto C

25

คำสั่งbuildในไปป์ไลน์มีไว้เพื่อทริกเกอร์งานอื่น ๆ ในเจนกินส์

ตัวอย่างบน github

งานต้องมีอยู่ในเจนกินส์และสามารถเป็นพาราเมตไตรได้ สำหรับสาขาฉันเดาว่าคุณสามารถอ่านได้จาก git


3
ฉันพยายามเพิ่มbuild job: 'jobnameแต่ฉันได้รับข้อผิดพลาดนี้No parameterized job named jobname foundและฉันมั่นใจได้ว่ามีงานชื่อนี้ในระดับเดียวกันในโฟลเดอร์องค์กร
sorin

1
ใช่มีงาน แต่งานนั้นไม่มีการกำหนดพารามิเตอร์ ฉันพยายามทำความเข้าใจวิธีกำหนดพารามิเตอร์งานที่สร้างโดยปลั๊กอินองค์กร GitHub
yiwen

6
รูปแบบชื่องานคือbuild job: "${ORGANISATION_NAME}/${REPO_NAME}/master"
Sahil Ahuja

2
@SahilAhuja /ที่ทั้งหมดโดยพลการและขึ้นอยู่กับรูปแบบเจนกินส์ของคุณและถ้าหากคุณต้องการที่จะใช้เส้นทางที่แน่นอนคุณต้องเริ่มต้นด้วย เส้นทางสัมพัทธ์ใช้ได้ดี ปัญหาของ Sorin น่าจะเป็นเพราะการเรียกงานbuildเป็นงานหลายสาขาซึ่งหมายถึงเส้นทางที่jobnameจะพยายามสร้างสาขาjobnameของงานเดียวกัน จะต้องเป็น../jobname/branchnameแทน
Michael Mrozek

ใช้งานได้ดี แต่จะเกิดอะไรขึ้นหากไม่มีสาขาที่ระบุ
Jaime Alcántara Arnela

24

คุณสามารถใช้build jobขั้นตอนจากJenkins Pipeline (ข้อกำหนดขั้นต่ำของ Jenkins: 2.130)

นี่คือ API ฉบับเต็มสำหรับbuildขั้นตอน: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

วิธีใช้build:

  • job: ชื่องานต่อเนื่องที่จะสร้าง อาจเป็นงานท่ออื่น แต่โดยทั่วไปแล้วจะเป็นงานฟรีสไตล์หรือโครงการอื่น ๆ
    • ใช้ชื่อง่ายๆถ้างานอยู่ในโฟลเดอร์เดียวกันกับงานท่อส่งต้นน้ำนี้
    • คุณสามารถใช้เส้นทางสัมพัทธ์แทนเช่น../sister-folder/downstream
    • หรือคุณสามารถใช้เส้นทางสัมบูรณ์เช่น/top-level-folder/nested-folder/downstream

ทริกเกอร์งานอื่นโดยใช้สาขาเป็นพารามิเตอร์

ที่ บริษัท ของฉันสาขาของเราหลายแห่งมี "/" คุณต้องแทนที่อินสแตนซ์ของ "/" ด้วย "% 2F" (ตามที่ปรากฏใน URL ของงาน)

ในตัวอย่างนี้เรากำลังใช้เส้นทางสัมพัทธ์

    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
            }
        }
    }

ทริกเกอร์งานอื่นโดยใช้หมายเลขบิลด์เป็นพารามิเตอร์

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))
    ]

ทริกเกอร์งานจำนวนมากพร้อมกัน

ที่มา: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/

ข้อมูลเพิ่มเติมเกี่ยวกับ Parallel ที่นี่: 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)
        }
    }

หรืออีกทางหนึ่ง:

    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
                    }
                }
            }
    }

3

ใช้ปลั๊กอิน build jobสำหรับงานนั้นเพื่อทริกเกอร์งานอื่น ๆ จากไฟล์ jenkins คุณสามารถเพิ่มตรรกะที่หลากหลายให้กับการดำเนินการของคุณเช่นอ็อพชันแบบขนานโหนดและเอเจนต์และขั้นตอนในการทริกเกอร์งานภายนอก ฉันให้ตัวอย่างตำราอาหารที่อ่านง่ายสำหรับสิ่งนั้น

1. ตัวอย่างสำหรับการทริกเกอร์งานภายนอกจากไฟล์ jenkins พร้อมตัวอย่างเงื่อนไข:

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

2. ตัวอย่างที่เรียกใช้งานหลายงานจากไฟล์ jenkins ด้วยเงื่อนไขตัวอย่าง:

 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')
     ]
    }
}

แต่วิธีการรับและใช้พารามิเตอร์ในงานที่ 2
Gentle

2
@ อ่อนโยน. คุณสามารถเข้าถึงพารามิเตอร์ที่ผ่านมาเป็นพารามิเตอร์ระบบชื่อ
Pankaj Shinde
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.