ชำระเงิน git repos หลายรายการในพื้นที่ทำงาน Jenkins เดียวกัน


127

ใช้ปลั๊กอิน Jenkins 1.501 และ Jenkins Git 1.1.26

ฉันมี 3 git repos ที่แตกต่างกันแต่ละรายการมีหลายโครงการ

ตอนนี้ฉันต้องการเช็คเอาต์โปรเจ็กต์ทั้งหมดจาก 3 git repos ไปยังพื้นที่ทำงานเดียวกันบนทาสเจนกินส์ ฉันได้กำหนดแต่ละ git repo ใน: การจัดการซอร์สโค้ด: SCM หลายรายการ แต่ทุกครั้งที่ตรวจสอบ repo repo ก่อนหน้า (และโครงการที่เกี่ยวข้อง) จะถูกลบ

ฉันได้อ่านสิ่งนี้:

http://jenkins.361315.n4.nabble.com/multiple-git-repos-in-one-job-td4633300.html

แต่มันไม่ได้ช่วยจริงๆ ฉันได้พยายามระบุโฟลเดอร์เดียวกันภายใต้Local subdirectory สำหรับ repo (ทางเลือก)สำหรับ repos ทั้งหมด แต่ให้ผลลัพธ์เหมือนกัน

หากสิ่งนี้เป็นไปไม่ได้เลยโดยใช้ Jenkins ฉันเดาว่าอาจใช้ขั้นตอน / สคริปต์ก่อนสร้างเพื่อย้ายโครงการไปยังตำแหน่งที่ถูกต้อง ไม่ใช่ตัวเลือกในการแก้ไขการกำหนดค่าการสร้างของโครงการ

คำตอบ:


69

การตรวจสอบมากกว่าหนึ่ง repo ในพื้นที่ทำงานเดียวไม่สามารถทำได้ด้วยปลั๊กอิน Jenkins + Git

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

ก่อนหน้านี้ปลั๊กอิน Multiple SCM สามารถช่วยแก้ปัญหานี้ได้ แต่ตอนนี้เลิกใช้แล้ว จากหน้าปลั๊กอิน SCM หลายรายการ: "ผู้ใช้ควรย้ายไปที่https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Pluginไปป์ไลน์นำเสนอวิธีที่ดีกว่าในการตรวจสอบ SCM หลายรายการและได้รับการสนับสนุนโดย Jenkins ทีมพัฒนาหลัก”


เหตุใดแนวทางแรกจึงมีปัญหา การแยกงานดูเหมือนเป็นการปฏิบัติที่ดี
CurtainDog

1
เป็นแนวทางปฏิบัติที่ดีโดยทั่วไป แต่เมื่อคุณต้องการการชำระเงินหลายครั้งในการบำรุงรักษาสถานที่ทางกายภาพเดียวกันกลายเป็นเรื่องที่น่ากังวล ตัวอย่างเช่นหากคุณต้องการสร้างโครงสร้างสาขาคุณจะต้องโคลนงาน 4 งานจากนั้นเปลี่ยนเส้นทางสำหรับแต่ละงาน แน่นอนว่ามีปลั๊กอินที่ช่วยในเรื่องนี้ แต่ง่ายกว่าเพียงแค่ชำระเงินไปยังเส้นทางที่สัมพันธ์กันจากงานเดียว จากนั้นคุณสามารถโคลนได้มากเท่าที่คุณต้องการโดยไม่ต้องเปลี่ยนการตั้งค่า
CIGuy

1
คุณต้องเปลี่ยนจากคำตอบที่ถูกต้องเนื่องจากไม่เกี่ยวข้องอีกต่อไป
Dvir669

2
ไปป์ไลน์ต้องการให้คุณเรียนรู้ DSL ใหม่ซึ่งค่อนข้างมากเกินไปสำหรับงานง่ายๆ (ตรวจสอบโค้ดจากที่เก็บข้อมูลหลายแห่ง) ที่เราต้องการให้ทำ ติดกับปลั๊กอิน SCM หลายตัวจนกว่า GUI ที่เหมาะสมจะปรากฏขึ้นรอบ ๆ DSL ไปป์ไลน์ของ Jenkins ฉันสามารถรายงานว่ามันใช้งานได้ดีกับ Jenkins 2.17
Burak Arslan

2
ฉันเพิ่งพบปัญหาเดียวกันกับหลาย repos ตอนนี้ฉันใช้ปลั๊กอิน Pipeline แม้ว่าฉันจะสงสัยพอ ๆ กับ @BurakArslan เกี่ยวกับ DSL ใหม่ จริงๆแล้วมันไม่ได้แย่อย่างที่ฉันคิดและมาพร้อมกับตัวสร้างข้อมูลโค้ดที่ดีพอสมควร หลังจากใช้งานเพียง 2 ชั่วโมงตอนนี้ฉันชอบแนวทางนี้มากเพราะในที่สุดฉันก็สามารถคอมมิตสคริปต์บิลด์ไปป์ไลน์เพื่อคอมไพล์ร่วมกับโค้ดที่เหลือได้
เบ็น

81

ด้วยปลั๊กอิน SCM หลายตัว:

  • สร้างรายการที่เก็บที่แตกต่างกันสำหรับแต่ละที่เก็บที่คุณต้องชำระเงิน (โปรเจ็กต์หลักหรือโปรเจ็กต์อ้างอิง

  • สำหรับแต่ละโปรเจ็กต์ในเมนู "ขั้นสูง" (เมนู "ขั้นสูง" ที่สองจะมีปุ่มสองปุ่มที่ชื่อ "ขั้นสูง" สำหรับแต่ละที่เก็บ) ค้นหาฟิลด์ข้อความ "ไดเร็กทอรีย่อยภายในสำหรับ repo (ไม่บังคับ)" คุณสามารถระบุไดเร็กทอรีย่อยที่นั่นในไดเร็กทอรี "พื้นที่ทำงาน" ที่คุณต้องการคัดลอกโปรเจ็กต์ไป คุณสามารถแมประบบไฟล์ของคอมพิวเตอร์ที่กำลังพัฒนาของฉันได้

ไม่มี "เมนูขั้นสูงที่สอง" อีกต่อไป แต่สิ่งที่ต้องทำคือใช้ปุ่ม "เพิ่ม" (ในส่วน "พฤติกรรมเพิ่มเติม") และเลือก "ชำระเงินไปยังไดเรกทอรีย่อย"

  • หากคุณกำลังใช้ ant เนื่องจากตอนนี้ไฟล์ build.xml ที่มีบิลด์เป้าหมายไม่ได้อยู่ในไดเร็กทอรีรูทของเวิร์กสเปซ แต่อยู่ในไดเร็กทอรีย่อยคุณต้องสะท้อนสิ่งนั้นในคอนฟิกูเรชัน "Invoke Ant" ในการดำเนินการดังกล่าวใน "Invoke ant" ให้กด "Advanced" และกรอกข้อความอินพุต "Build file" รวมถึงชื่อของไดเร็กทอรีย่อยที่ build.xml อยู่

หวังว่าจะช่วยได้


3
สิ่งนี้จะต้องล้าสมัย ในขณะที่เขียนข้อมูลโค้ด GIT ปลั๊กอิน SCM หลายรายการไม่มีเส้นทางย่อยที่เป็นทางเลือก
Alexei

12
ในแต่ละที่เก็บจะมีรายการแบบเลื่อนลงที่เรียกว่า "เพิ่ม" ในนั้นคุณจะพบตัวเลือก "ชำระเงินไปยังไดเรกทอรีย่อย" ซึ่งทำหน้าที่เหมือนกัน
Gary Ye

1
ฉันทำตามคำแนะนำของคุณด้วยปลั๊กอิน SCM และ git หลายตัว แต่ฉันมีปัญหาตลกอีกอย่าง ดูเหมือนว่าจะไม่ต้องการชำระเงินสาขาเดียวกันอย่างถูกต้อง (พัฒนา) สำหรับที่เก็บที่แตกต่างกัน มันพยายามเช็คเอาต์คอมมิตโดยแฮช (ซึ่งใช้ได้เฉพาะในที่เก็บแรกเท่านั้น) มีความคิดเกี่ยวกับวิธีแก้ไขปัญหานี้อย่างไร
Lefteris

ปัญหาใหญ่ที่สุดของปลั๊กอิน SCM หลายตัวคือ "ทริกเกอร์ประเภทโพสต์คอมมิตใช้งานไม่ได้ในขณะนี้ (อย่างน้อยก็สำหรับการโค่นล้ม) ดังนั้นจึงจำเป็นต้องกำหนดค่าการโพลประเภท" cron ""
grayaii

1
ไปป์ไลน์ต้องการให้คุณเรียนรู้ DSL ใหม่ซึ่งค่อนข้างมากเกินไปสำหรับงานง่ายๆ (ตรวจสอบโค้ดจากที่เก็บข้อมูลหลายแห่ง) ที่เราต้องการให้ทำ ติดกับปลั๊กอิน SCM หลายตัวจนกว่า GUI ที่เหมาะสมจะปรากฏขึ้นรอบ ๆ DSL ไปป์ไลน์ของ Jenkins ฉันสามารถรายงานว่ามันใช้งานได้ดีกับ Jenkins 2.17
Burak Arslan

41

เนื่องจากปลั๊กอิน SCM หลายตัวถูกเลิกใช้งาน

ด้วยJenkins Pipelineทำให้สามารถเช็คเอาต์ git repos หลาย ๆ ตัวและหลังจากสร้างโดยใช้ gradle

node {   
def gradleHome

stage('Prepare/Checkout') { // for display purposes
    git branch: 'develop', url: 'https://github.com/WtfJoke/Any.git'

    dir('a-child-repo') {
       git branch: 'develop', url: 'https://github.com/WtfJoke/AnyChild.git'
    }

    env.JAVA_HOME="${tool 'JDK8'}"
    env.PATH="${env.JAVA_HOME}/bin:${env.PATH}" // set java home in jdk environment
    gradleHome = tool '3.4.1' 
}

stage('Build') {
  // Run the gradle build
  if (isUnix()) {
     sh "'${gradleHome}/bin/gradle' clean build"
  } else {
     bat(/"${gradleHome}\bin\gradle" clean build/)
  }
}
}

คุณอาจต้องการพิจารณาใช้โมดูลย่อย gitแทนไปป์ไลน์ที่กำหนดเองเช่นนี้


ขอบคุณ!!! dirบล็อกเป็นกุญแจสำคัญที่ฉันไม่สามารถคิดออกว่าทำไมฉันเป็นเพียงคนเดียวที่ได้เห็น repo มากที่สุดล่าสุด-โคลนในพื้นที่งานของฉัน
bonh

แนวคิดของ "การเปลี่ยนแปลง" พิจารณาอย่างไรภายใต้ SCM หลายรายการ เป็นเพียงผลรวมของการเปลี่ยนแปลงที่เห็นจาก repos ทั้งหมดที่ประกอบกันเป็นงานหรือไม่? จะเป็นการดีที่จะแยกรายการออกจากแต่ละรายการถ้าเป็นไปได้23 changes from repo XXX, 3 changes from repo YYYหรือสิ่งที่กะทัดรัดกว่านี้ตามบรรทัดเหล่านั้น
jxramos

20

ฉันใช้ปลั๊กอิน SCM หลายตัวร่วมกับปลั๊กอิน Git สำเร็จกับเจนกินส์


3
ขอบคุณเยี่ยมมากฉันสามารถใส่เส้นทาง bitbucket 2 เส้นทางลงในส่วนที่เก็บได้และตอนนี้ฉันจะบอกสาขา "พัฒนา" การชำระเงิน repo 1 และสาขา "การแก้ไข" สำหรับการชำระเงิน repo 2 ได้อย่างไร ฉันเห็นสาขาที่จะสร้างส่วนในเจนกินส์ฉันจะตั้งค่าชื่อที่เก็บและ Refsec ในตัวระบุสาขาได้อย่างไร (ว่างสำหรับ 'ใด ๆ ') เพื่อให้แต่ละสาขาสามารถตรวจสอบสาขาที่เกี่ยวข้องที่ฉันต้องการได้อย่างไร หรือฉันกำลังทำอยู่และฉันควรคลิกบูลีนที่มีข้อความว่า "Multiple SCMs"
pelos

@pelos คุณสามารถหาวิธีแก้ปัญหาได้หรือไม่?
Govind

ในขณะนี้เราไม่ได้ใช้ไฟล์ yml และเราได้ทำสองขั้นตอนการทำงานที่แตกต่างกันกับงานปกติ
pelos

5

ขึ้นอยู่กับความสัมพันธ์ของที่เก็บอีกวิธีหนึ่งคือการเพิ่มที่เก็บอื่น (ที่เก็บ) เป็นโมดูลย่อย gitให้กับที่เก็บใดที่เก็บหนึ่ง โมดูลย่อย git จะสร้างการอ้างอิงไปยัง repos อื่น ๆ repos โมดูลย่อยเหล่านั้นจะไม่ถูกโคลนเว้นแต่คุณจะระบุ--recursiveแฟล็กเมื่อโคลน"superproject" (คำที่เป็นทางการ)

นี่คือคำสั่งในการเพิ่มโมดูลย่อยลงในโครงการปัจจุบัน:

git submodule add <repository URI path to clone>

เรากำลังใช้ Jenkins v1.645 และ git SCM จะทำการโคลนซ้ำสำหรับ superprojects Voila คุณจะได้รับไฟล์ superproject และไฟล์ repo ที่ขึ้นต่อกัน (โมดูลย่อย) ทั้งหมดในไดเร็กทอรีของตนเองในพื้นที่ทำงานของ Jenkins เดียวกัน

ไม่รับรองว่านี่เป็นแนวทางที่ถูกต้องแต่เป็นแนวทาง


5

เจนกินส์: SCM หลายรายการ - เลิกใช้แล้ว GIT Plugin - ใช้ไม่ได้กับหลาย repos

การเขียนสคริปต์ / ไปป์ไลน์เป็นรหัส - เป็นหนทางที่จะไป


2

ฉันก็มีปัญหานี้เช่นกัน ฉันแก้ไขโดยใช้ Trigger / call builds ในโครงการอื่น ๆ สำหรับแต่ละที่เก็บฉันเรียกโครงการดาวน์สตรีมโดยใช้พารามิเตอร์

โครงการหลัก:

This project is parameterized
String Parameters: PREFIX, MARKETNAME, BRANCH, TAG
Use Custom workspace: ${PREFIX}/${MARKETNAME}
Source code management: None

จากนั้นสำหรับแต่ละที่เก็บฉันเรียกโครงการดาวน์สตรีมดังนี้:

Trigger/call builds on other projects: 
Projects to build: Linux-Tag-Checkout
Current Build Parameters
Predefined Parameters: REPOSITORY=<name>

โครงการดาวน์สตรีม: Linux-Tag-Checkout:

This project is parameterized
String Parameters: PREFIX, MARKETNAME, REPOSITORY, BRANCH, TAG
Use Custom workspace:${PREFIX}/${MARKETNAME}/${REPOSITORY}-${BRANCH}
Source code management: Git
git@<host>:${REPOSITORY}
refspec: +refs/tags/${TAG}:refs/remotes/origin/tags/${TAG}
Branch Specifier: */tags/${TAG} 

1

การตรวจสอบมากกว่าหนึ่ง repo ในพื้นที่ทำงานเดียวเป็นไปได้ด้วย Jenkins + Git Plugin (อาจเป็นเฉพาะในเวอร์ชันล่าสุดเท่านั้น)

ในส่วน "Source-Code-Management" อย่าเลือก "Git" แต่เป็น "Multiple SCMs" และเพิ่มที่เก็บ git หลาย ๆ

ตรวจสอบให้แน่ใจว่าในทั้งหมดยกเว้นรายการเดียวที่คุณเพิ่มเป็น "พฤติกรรมเพิ่มเติม" การดำเนินการ "ตรวจสอบไปยังไดเรกทอรีย่อย" และระบุไดเรกทอรีย่อยแต่ละรายการ


ฉันเชื่อว่าด้วยวิธีนี้คุณกำลังใช้ปลั๊กอิน SCM หลายตัวแทนที่จะใช้ปลั๊กอิน vanilla Git
Robert

0

เรากำลังใช้git-repoเพื่อจัดการที่เก็บ GIT หลายแห่งของเรา นอกจากนี้ยังมีปลั๊กอิน Jenkins Repoที่อนุญาตให้ชำระเงินทั้งหมดหรือบางส่วนของที่เก็บที่จัดการโดย git-repo ไปยังพื้นที่ทำงานของ Jenkins เดียวกัน


คุณแก้ปัญหาที่ถามในคำถามนี้อย่างไร? ฉันได้ติดตั้งปลั๊กอินที่คุณพูดถึงและอ่านเกี่ยวกับ repo และปลั๊กอินแล้ว แต่ฉันไม่เห็นวิธีตั้งค่า Jenkins ให้โคลนสอง repos เพื่อดำเนินการในโครงการเดียว ...
GreenAsJade

ในการใช้ Repo จำเป็นต้องสร้างที่เก็บพิเศษซึ่งจะมีเฉพาะไฟล์รายการเท่านั้น ในไฟล์นี้คุณระบุข้อมูลทั้งหมดเกี่ยวกับที่เก็บอื่น รูปแบบที่แน่นอนของไฟล์ manifest อธิบายไว้ในไฟล์ docs / manifest-format.txt ของโครงการ git-repo ( gerrit.googlesource.com/git-repo/+/master/docs/… ) เมื่อกำหนดค่าส่วน Jenkins Repo ของงาน - คุณระบุตำแหน่งของที่เก็บ "manifest" และเลือกชื่อไฟล์ "manifest" (คุณอาจมีหลายไฟล์) ที่เก็บทั้งหมดที่ระบุในไฟล์ Manifest จะถูกโคลน
vladisld
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.