วิธีกำหนดค่า Git post Commit hook


128

จะเรียกงานสร้างจากระยะไกลจาก Jenkins ได้อย่างไร
วิธีกำหนดค่า Git post Commit hook?

ความต้องการของฉันคือเมื่อใดก็ตามที่มีการเปลี่ยนแปลงในที่เก็บ Git สำหรับโปรเจ็กต์หนึ่ง ๆ มันจะเริ่มสร้างเจนกินส์สำหรับโปรเจ็กต์นั้นโดยอัตโนมัติ

ในส่วนการสร้างทริกเกอร์ของเจนกินส์ฉันเลือกการสร้างทริกเกอร์จากระยะไกล
ใน.gitไดเร็กทอรีจะมีไดเร็กทอรี hooks ที่เราต้องกำหนดค่าโพสต์คอมมิตไฟล์
ฉันสับสนวิธีทริกเกอร์บิวด์จากที่นั่น (ฉันรู้ว่าบางส่วนเราควรใช้คำสั่ง curl)


curl cmbuild.aln.com/jenkins/view/project name/job/myproject/buildwithparameters?Branch=feat-con

ฉันได้วางคำสั่งนี้ในไดเร็กทอรี git server hooks ของฉัน (โพสต์คอมมิต hook)
เมื่อใดก็ตามที่การเปลี่ยนแปลงเกิดขึ้นในที่เก็บมันกำลังเรียกใช้งานบิวด์อัตโนมัติ

ฉันต้องการตรวจสอบในชุดการเปลี่ยนแปลงว่าในไฟล์ java อย่างน้อยหนึ่งไฟล์นั้นควรเริ่มการสร้างหรือไม่
สมมติว่าผู้พัฒนาเปลี่ยนเฉพาะไฟล์ xml หรือไฟล์คุณสมบัติที่ build ไม่ควรเริ่มทำงาน
นอกจากxmlนี้สมมติว่า.javaไฟล์อยู่ที่นั่นการสร้างควรเริ่มต้น


ฉันได้แก้ไขคำตอบเพื่อตอบคำถามส่วนที่สองของคุณแล้ว
VonC

คำตอบ:


166

ดังที่ได้กล่าวไว้ใน " Polling must die: trigger Jenkins builds from a git hook " คุณสามารถแจ้งให้เจนกินส์ทราบถึงคอมมิตใหม่:

ด้วยปลั๊กอิน Gitล่าสุด1.1.14 (ที่ฉันเพิ่งเปิดตัวตอนนี้) ตอนนี้คุณสามารถทำสิ่งนี้ได้มากขึ้น> ได้อย่างง่ายดายเพียงดำเนินการคำสั่งต่อไปนี้:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>

การดำเนินการนี้จะสแกนงานทั้งหมดที่กำหนดค่าไว้เพื่อตรวจสอบ URL ที่ระบุและหากมีการกำหนดค่าด้วยการสำรวจด้วยก็จะเริ่มการสำรวจทันที (และหากพบว่ามีการเปลี่ยนแปลงที่คุ้มค่ากับการสร้างงานสร้างจะถูกทริกเกอร์ )

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

ในฐานะที่เป็นที่กล่าวถึงนี่ให้แน่ใจว่าจะใช้ที่อยู่ที่เหมาะสมสำหรับเซิร์ฟเวอร์เจนกินส์ของคุณ:

เนื่องจากเรากำลังเรียกใช้ Jenkins เป็นเว็บเซิร์ฟเวอร์แบบสแตนด์อโลนบนพอร์ต 8080 URL ควรจะไม่มีสิ่ง/jenkinsนี้:

http://jenkins:8080/git/notifyCommit?url=git@gitserver:tools/common.git

เพื่อเสริมสร้างจุดสุดท้ายนั้นpthaเพิ่มในความคิดเห็น :

มันอาจจะชัดเจน แต่ฉันมีปัญหากับ:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. 

URLพารามิเตอร์ควรจะตรงกับสิ่งที่คุณมีในพื้นที่เก็บข้อมูล URLของงานของคุณเจนกินส์
เมื่อคัดลอกตัวอย่างฉันละทิ้งโปรโตคอลในกรณีของเราssh://แต่ก็ไม่ได้ผล


คุณยังสามารถใช้เบ็ดหลังการรับแบบง่ายๆเช่นใน " Push based builds using Jenkins and GIT "

#!/bin/bash
/usr/bin/curl --user USERNAME:PASS -s \

http://jenkinsci/job/PROJECTNAME/build?token=1qaz2wsx

กำหนดค่างาน Jenkins ของคุณให้สามารถ“ Trigger builds จากระยะไกล” และใช้โทเค็นการตรวจสอบสิทธิ์ ( 1qaz2wsxในตัวอย่างนี้)

อย่างไรก็ตามนี่เป็นสคริปต์เฉพาะโครงการและผู้เขียนได้กล่าวถึงวิธีการสรุป
วิธีแก้ปัญหาแรกนั้นง่ายกว่าเนื่องจากไม่ได้ขึ้นอยู่กับการพิสูจน์ตัวตนหรือโครงการเฉพาะ


ฉันต้องการตรวจสอบในชุดการเปลี่ยนแปลงว่ามีไฟล์ java อย่างน้อยหนึ่งไฟล์หรือไม่ที่ควรเริ่มการสร้าง
สมมติว่านักพัฒนาเปลี่ยนเฉพาะไฟล์ XML หรือไฟล์คุณสมบัติจากนั้นบิลด์ไม่ควรเริ่มทำงาน

โดยทั่วไปบิลด์สคริปต์ของคุณสามารถ:

  • ใส่โน้ต 'build' (ดูgit notes) ในการโทรครั้งแรก
  • ในการโทรตามมาคว้ารายการกระทำระหว่างHEADของผู้สมัครสาขาของคุณสำหรับการสร้างและกระทำการอ้างอิงโดยgit notes'สร้าง' ( ):git show refs/notes/buildgit diff --name-only SHA_build HEAD
  • สคริปต์ของคุณสามารถแยกวิเคราะห์รายการนั้นและตัดสินใจว่าจำเป็นต้องดำเนินการต่อไปหรือไม่
  • ในกรณีใด ๆ สร้าง / ย้ายของคุณgit notes' build' HEADเพื่อ

พฤษภาคม 2559: cwhsuชี้ให้เห็นในความคิดเห็น url ที่เป็นไปได้ต่อไปนี้:

คุณสามารถใช้curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKENหากคุณตั้งค่าการกำหนดค่าทริกเกอร์ในรายการของคุณ

http://i.imgur.com/IolrOOj.png


มิถุนายน 2559 Polarettoชี้ให้เห็นในความคิดเห็น :

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

repository=${PWD%/hooks}; 
repository=${repository##*/} 

แล้วใช้มันเช่น:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository

สวัสดี von อย่างที่คุณพูดในการโทรครั้งแรกฉันต้องใส่บันทึกการสร้างการโทรครั้งแรกของฉันคือการอ่านไฟล์. java เมื่อใดก็ตามที่นักพัฒนาพุชการเปลี่ยนแปลงใน git repo ฉันยังใหม่กับสิ่งเหล่านี้ทั้งหมดนั่นคือเหตุผลที่ฉันถามทุกขั้นตอน โปรดอย่ารังเกียจและฉันต้องทำงานนี้ให้เสร็จ
phanikumar Raja

สิ่งนี้มีประโยชน์มากสำหรับฉัน ฉันเขียน Git hook ด้วยความช่วยเหลือของหัวข้อนี้ พวก Tnx!
Kirill Bazarov

ฉันต้องเพิ่มการโทร curl ในไฟล์หลังการรับซึ่งยังไม่ชัดเจนจากคำตอบนี้ มีประโยชน์มากต่อไป!
Magnilex

1
@IgorGanapolsky ในโฟลเดอร์ hooks ของ repo เปล่าของคุณซึ่งได้รับyourRepo.git/hooks/post-receive
คอมมิต

2
มันอาจจะเป็นที่เห็นได้ชัด curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>แต่ผมมีปัญหาเกี่ยวกับ: URLพารามิเตอร์ควรจะตรงกับสิ่งที่คุณมีในพื้นที่เก็บข้อมูล URLของงานของคุณเจนกินส์ เมื่อคัดลอกตัวอย่างฉันทิ้งโปรโตคอลในกรณีของเราssh: //และไม่ได้ผล
ptha

17

หวังว่านี่จะช่วยได้: http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

เป็นเพียงเรื่องของการใช้curlเพื่อเรียกงานเจนกินส์โดยใช้ git hooks ที่คอมไพล์ให้มา
คำสั่ง

curl http://localhost:8080/job/someJob/build?delay=0sec

ทำงานเจนกินส์ได้someJobชื่อของงานเจนกินส์อยู่ที่ไหน

ค้นหาhooksโฟลเดอร์ในโฟลเดอร์. git ที่ซ่อนอยู่ เปลี่ยนชื่อpost-commit.sampleไฟล์เป็นpost-commit. เปิดด้วย Notepad ลบ: Nothingบรรทัดและวางคำสั่งด้านบนลงในนั้น

แค่นั้นแหละ. เมื่อใดก็ตามที่คุณทำการคอมมิต Git จะทริกเกอร์คำสั่งโพสต์คอมมิตที่กำหนดไว้ในไฟล์


หลังจากทำการคอมมิตจากเครื่อง dev แล้วจะมีการเรียกโพสต์รับไม่ใช่โพสต์คอมมิต ตรวจสอบโดยใส่ข้อความบันทึกในตะขอทั้งสอง ฉันอ่านเอกสารผิดหรือเปล่ามันควรจะเป็นโพสต์คอมมิตที่ถูกเรียกหรือไม่?
Shirish Hirekodi

@Shirish: แปลกดี บางทีคุณอาจกำลังทำอะไรบางอย่างที่แตกต่างออกไป
นาวา

นี่คือการสร้างสำเร็จเมื่อฉันผลักดันการเปลี่ยนแปลงครั้งสุดท้ายกระทำ แต่ไม่สร้างเมื่อฉันยอมรับการเปลี่ยนแปลง ... ???

3

ดังที่คำตอบก่อนหน้านี้ได้แสดงตัวอย่างว่าเบ็ดแบบเต็มอาจมีลักษณะอย่างไรนี่คือรหัสของเบ็ดหลังรับที่ใช้งานได้ของฉัน:

#!/usr/bin/python

import sys
from subprocess import call

if __name__ == '__main__':
    for line in sys.stdin.xreadlines():
        old, new, ref = line.strip().split(' ')
        if ref == 'refs/heads/master':
            print "=============================================="
            print "Pushing to master. Triggering jenkins.        "
            print "=============================================="
            sys.stdout.flush()
            call(["curl", "-sS", "http://jenkinsserver/git/notifyCommit?url=ssh://user@gitserver/var/git/repo.git"])

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


1
คุณผูกสคริปต์ Python นี้เข้ากับ Jenkins ได้อย่างไร? หรือคุณเรียกใช้เพียงครั้งเดียว?
IgorGanapolsky

เจนกินส์ไม่รู้เกี่ยวกับเบ็ดนี้ส่วนหลักคือการโหลด url alertCommit บนเซิร์ฟเวอร์เจนกินส์ซึ่งจะทำให้เกิดการสำรวจ ฉันคิดว่าการสำรวจถูกเปิดใช้งาน แต่ไม่มีกำหนดการทางฝั่งเจนกินส์
Zitrax

สคริปต์ python นี้อยู่ที่ไหน? ฉันถือว่าคุณผูกมันเข้ากับการติดตั้งคอมไพล์ของคุณเพื่อติดตามการกระทำ ...
IgorGanapolsky

1
คำตอบล่าช้า - แต่ตำแหน่งสคริปต์จะอยู่บนเซิร์ฟเวอร์ git ใน hooks / post-received อ่านเกี่ยวกับ git hooks เพื่อเรียนรู้เพิ่มเติม
Zitrax

3

ฉันต้องการเพิ่มคำตอบข้างต้นว่าจะยากขึ้นเล็กน้อยหากเปิดใช้งานการอนุญาตของเจนกินส์

หลังจากเปิดใช้งานฉันได้รับข้อความแสดงข้อผิดพลาดว่าผู้ใช้ที่ไม่ระบุชื่อต้องการสิทธิ์ในการอ่าน

ฉันเห็นวิธีแก้ปัญหาที่เป็นไปได้สองวิธี:

1: เปลี่ยนตะขอเป็น:

curl --user name:passwd -s http://domain?token=whatevertokenuhave

2: การตั้งค่าการอนุญาตตามโครงการ

โซลูชันเดิมมีข้อเสียที่ฉันต้องแสดง passwd ของฉันในไฟล์ hook ไม่สามารถยอมรับได้ในกรณีของฉัน

อย่างที่สองใช้ได้กับฉัน ในการตั้งค่าการตรวจสอบสิทธิ์ส่วนกลางฉันต้องเปิดใช้งาน Overall> Read for Anonymous user ในโปรเจ็กต์ฉันต้องการทริกเกอร์ฉันต้องเปิดใช้งานงาน> สร้างและงาน> อ่านสำหรับ Anonymous

นี่ยังไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์แบบเพราะตอนนี้คุณสามารถดูโครงการใน Jenkins ได้โดยไม่ต้องเข้าสู่ระบบ อาจมีวิธีแก้ปัญหาที่ดีกว่านี้โดยใช้วิธีการเดิมด้วยการเข้าสู่ระบบ http แต่ฉันยังไม่เข้าใจ

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