คำนำ
เจนกินส์เป็นเครื่องมือการรวมโอเพนซอร์สที่ได้รับความนิยมซึ่งใช้กันอย่างแพร่หลายในการพัฒนาโครงการและมีฟังก์ชั่นเช่นการก่อสร้างอัตโนมัติการทดสอบและการปรับใช้
เมื่อเร็ว ๆ นี้ฉันเข้าร่วมในการพัฒนาแพลตฟอร์มทดสอบแบบบูรณาการของ บริษัท และพบปัญหามากมายในการพัฒนา การวนซ้ำสองสัปดาห์กำลังจะเสร็จสิ้น ฉันจะใช้บล็อกนี้เพื่อบันทึกปัญหาในการพัฒนาสำหรับการอ้างอิงของผู้อ่าน
บริษัท มีแอพพลิเคชั่นมากมายดังนั้นเราต้องเข้าใจวิธีการสร้างแอปพลิเคชันเหล่านี้ในเจนกินส์ ฉันได้เข้าร่วมในแอปพลิเคชันผู้บัญชาการสองประเภทหนึ่งคือคลาสข้อมูลขนาดใหญ่และอีกคลาสคือแอปพลิเคชัน Scala ของกลุ่มสถาปัตยกรรมเซิร์ฟเวอร์ของเรา
1. แอปพลิเคชันข้อมูลขนาดใหญ่
การกำหนดค่ามีดังนี้:
ไฟล์ XML ที่สอดคล้องกับไฟล์กำหนดค่า: รับไฟล์กำหนดค่า XML ผ่าน CRUL: http: //host/job/tar_py_dwx_dev/config.xml
<project> <การกระทำ/> <คำอธิบาย/> <KeepDependencies> FALSE </KeepDependencies> <properties> <com.dabsquared.gitlabjenkins.connection.gitlabconnectionProperty ปลั๊กอิน = "[email protected]"> <gitlabconnection/</com.dabsquared.gitlabjenkins.connection.gitlabconnectionProperty> <hatson.plugins.promoted__builds.jobpropertyimpl dev </string> </activeprocessNames> </hudson.plugins.promoted__builds.jobpropertyimpl> </premerties> <scm plugin = "[email protected]"> <การกำหนดค่า> 2 </configversion> <userremoteConfigs> <hudson.plugins.git.userrem oteconfig> <url> ssh: //[email protected]: 10022/bigdata/dwx.git </url> <derventialSid> 84F4BE19-EA8D-4271 -8CFB-42AF8F507285 </dectialSID> </hudson.plugins.git.userRemoteConfig> </userremoteconfigs> <สาขา> <HUDSON.PLUGINS.GIT.BranchSpec> es> <DogeneratesubModuleConfigurations> FALSE </dogNerAtesubModuleConfigurations> <modulecfg/> <ENTENSIONS/</SCM> <AlexedNode>! bled> <blockbuildwhendownstreambuilding> false </blockbuildwhendownstreambuilding> <blockbuildhenupstreambuilding> false </blockbuildwhenupstreambuilding> <Triggers> *</spec> <ไม่รู้ว่า Commommithooks> false </molonderepostcommithooks> </hudson.triggers.scmtrigger> </triggers> <SoncurrentBuild> FALSE </concurrentBuild> <Builders> aws s3 cp $ {project} .tar.gz s3: // lattebank-jenkins-build-dev/$ {job_base_name}/$ {build_number}/-region cn-north-1 rm -rf $ {Project} .tar.gz </Command> </hudson.tasks.shell> </builders> <publishers/> <buildWrappers/> <project>
ข้อมูลที่ได้จาก XML ไม่สอดคล้องกับไฟล์การกำหนดค่าในรูป
สคริปต์โปรโมชั่นไม่สามารถรับได้ในไฟล์การกำหนดค่า XML ในเวลานี้มีปัญหา API นี้ไม่สามารถรับสคริปต์โปรโมชั่นได้ ในเวลาเดียวกันสิ่งนี้ยังนำความท้าทายที่ยิ่งใหญ่มาสู่การทำงานของเรา นอกจากนี้ยังหมายความว่าการปรับใช้แอปพลิเคชันผู้บัญชาการไม่สามารถรับรู้ได้ด้วยวิธีนี้และการกำหนดค่าของเจนกินส์ผ่านวิธีแพลตฟอร์มสามารถใช้งานได้โดยตรง
อย่างไรก็ตามหลังจากสอบถาม API ที่เกี่ยวข้องเราไม่สามารถค้นหาเนื้อหาที่เกี่ยวข้องได้ หลังจากความพยายามอย่างไม่หยุดยั้งในที่สุดเราก็พบว่า API ที่เกี่ยวข้องกับปลั๊กอินการสร้างโปรโมต
คำถาม: http: //host/job/jobname/promotion/process/promotionname/config.xml
อินเทอร์เฟซนี้สามารถรับไฟล์ XML ได้ แต่ไม่สามารถเพิ่มหรือแก้ไขไฟล์การกำหนดค่าได้
ฉันได้ห่อหุ้มวิธีการบางอย่างสำหรับสิ่งนี้:
/** * @author Chenlang * วันที่ 2018/5/7 */ @slf4jpublic คลาส Jenkinspromotionutils {ส่วนตัวคงที่สตริงสุดท้าย sub_path_promotion_coommand = "/hudson.plugins.promoted__builds.promotionprocess"; สตริงสุดท้ายคงที่ส่วนตัว sub_path_build = "/buildsteps"; สตริงสุดท้ายคงที่ส่วนตัว sub_path_builder_shell_command = "/hudson.tasks.shell/command"; สตริงสุดท้ายคงที่ส่วนตัว path_promotion_command = sub_path_promotion_coommand + sub_path_build + sub_path_builder_shell_command; สตริงคงที่ส่วนตัว create_promotion_json = "{'properties': {'Stapler-Class-Bag': 'True', 'Hudson-Plugins-Promoted_builds-JobPropertyimpl': {'โปรโมชั่น': {'ActialItems' ',' Isvisible ':' ',' ไอคอน ':' Star-Gold ',' HasassignedLabel ': False,' AssignedLabelString ':' ',' เงื่อนไข ': {' Stapler-Class-Bag ':' True '}}}}} "; สตริงสุดท้ายคงที่ส่วนตัว content_type = "แอปพลิเคชัน/x-www-form-urlencoded"; โมฆะสาธารณะคงที่ UpdatePromotionshell (เอกสาร JobConfigDocument, สตริง JobName, JenkinsPromotionClient JenkinspromotionClient, String Promotionshell, String Path) โยน iOexception, DocumentException {ถ้า (Stringutils.isblank } สตริงโปรโมชั่นชื่อ = getPromotionName (JobConfigDocument, PATH); เอกสารเอกสาร = JenkinsPromotionClient.getJobPromotionXML (JobName, PromotionName); document.selectsingLenode (path_promotion_command) .settext (โปรโมชั่นเชลล์); JenkinsPromotionClient.updateJob (JobName, โปรโมชั่นชื่อ, document.asxml ()); } โมฆะคงที่สาธารณะ createPromotionshell (เอกสาร JobConfigDocument, สตริง tmpjobname, สตริง JobName, สตริงโปรโมชั่นเชลล์, เส้นทางสตริง, JenkinspromotionClient JenkinspromotionClient) โยน iOexception, DocumentException } สตริงโปรโมชั่นชื่อ = getPromotionName (JobConfigDocument, PATH); เอกสารเอกสาร = JenkinsPromotionClient.getJobPromotionXML (tmpjobname, โปรโมชั่นชื่อ); document.selectsingLenode (path_promotion_command) .settext (โปรโมชั่นเชลล์); แผนที่ <สตริง, สตริง> map = maps.newhashmap (); map.put ("ประเภทเนื้อหา", content_type); map.put ("json", string.format (create_promotion_json, โปรโมชั่นชื่อ)); ลอง {JenkinsPromotionClient.CreateJob (JobName, MAP); } catch (exception e) {log.error ("ล้มเหลวเมื่อเริ่มการส่งเสริมการขาย" + e); } JenkinsPromotionClient.CreateJob (JobName, โปรโมชั่นชื่อ, document.asxml ()); } สตริงคงที่สาธารณะ getPromotionName (Document JobConfigDocument, เส้นทางสตริง) {ส่งคืน JobConfigDocument.SelectSingLenode (พา ธ ) .getText (); - แพ็คเกจ cn.caijiajia.phoenix.service.jenkins; นำเข้า com.offbytwo.jenkins.client.jenkinshttpclient นำเข้า com.offbytwo.jenkins.client.util.encodingutils; org.dom4j.documenthelper; นำเข้า org.springframework.beans.factory.annotation.autoWired; นำเข้า org.springframework.stereotype.Component; นำเข้า java.io.ioException; นำเข้า java.util.map; /** * @author Chenlang * วันที่ 2018/5/4 */ @ComponentPublic Class JenkinspromotionClient {@autowired ส่วนตัว JenkinshttpClient JenkinshttpClient; สาธารณะ JenkinsPromotionClient () {} / *** รับไฟล์กำหนดค่าโปรโมชั่นของงาน** @param JobName ชื่องาน* @param ชื่อโปรโมชั่นชื่อโปรโมชั่น* @return* @throws ioexception* / เอกสารสาธารณะ documenthelper.parsetext (this.getJobxml (JobName, โปรโมชั่นชื่อ)); } / ** * อัปเดตงาน * * @param JobName * @param โปรโมชั่นชื่อ * @param jobxml * @throws ioexception * / โมฆะสาธารณะ updatejob (สตริง JobName, สตริงโปรโมชั่นชื่อ, สตริง JobxMl) "/config.xml", jobxml, true); }/** * เพิ่มสคริปต์งาน * * @param JobName * @param Jobxml * @throws ioexception */โมฆะสาธารณะ createJob (สตริง JobName, String โปรโมชั่นชื่อสตริง, string jobxml) พ่น IOException jobxml, true); }/** * เพิ่มงานโปรโมชั่น * * @param JobName * @param Map * @throws ioexception */โมฆะสาธารณะ createJob (สตริง JobName, แผนที่แผนที่) พ่น ioexception {this.jenkinshttpclient.post_form ("/job/" + encodingutils.encode } สตริงส่วนตัว getJobxml (string jobName, สตริงโปรโมชั่นชื่อ) พ่น IOException {return this.jenkinshttpClient.get (this.tojobbaseurl (JobName, โปรโมชั่นชื่อ) + "/config.xml"); } สตริงส่วนตัว tojobbaseurl (สตริง JobName, String โปรโมชั่นชื่อ) {return "/job/" + encodingutils.encode (JobName) + "/โปรโมชั่น/กระบวนการ/" + โปรโมชั่น; } / ** * การสร้างสคริปต์โปรโมชั่น * @param Jobname * @param โปรโมชั่นชื่อ * @param เวอร์ชัน * @param isfirstbuild * @throws ioexception * / โมฆะสาธารณะสร้าง this.jenkinshttpclient.post ("/Job/"+encodingutils.encode (JobName)+"/"+เวอร์ชัน+"/โปรโมชั่น/forcePromotion? name ="+โปรโมชั่น+"& json =%7b%7d & subment = force promotion"); } else {this.jenkinshttpclient.post ("/job/"+encodingutils.encode (JobName)+"/"+เวอร์ชัน+"/โปรโมชั่น/"+โปรโมชั่นชื่อ+"/build? json =%7b%7d -วิธีการสรุปการเพิ่มการกำหนดค่าการลบการปรับเปลี่ยนและการสืบค้นของโปรโมตการสร้างปลั๊กอินรวมถึงการสร้างสคริปต์โปรโมชั่น
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com