مقدمة
Jenkins هي أداة تكامل مستمر مفتوح المصدر شهيرة تستخدم على نطاق واسع في تطوير المشروع ولديها وظائف مثل البناء الآلي والاختبار والنشر.
في الآونة الأخيرة ، شاركت في تطوير منصة الاختبار المتكاملة للشركة وواجهت العديد من المشكلات في التطوير. التكرار لمدة أسبوعين على وشك الانتهاء. سأستخدم هذه المدونة لتسجيل المشكلات في تطوير مرجع القراء.
لدى الشركة العديد من التطبيقات ، لذلك نحتاج إلى فهم كيفية بناء هذه التطبيقات في جنكينز. لقد شاركت في نوعين من تطبيقات القائد ، والآخر هو فئة البيانات الكبيرة ، والآخر هو تطبيق Scala لمجموعة بنية الخادم الخاصة بنا.
1. تطبيق البيانات الكبيرة
التكوين كما يلي:
ملف XML المقابل لملف التكوين: الحصول على ملف تكوين XML من خلال CRUL: http: //host/job/tar_py_dwx_dev/config.xml
<Project> <Actions/> <Description/> <KeepDependencies> false </keepdependencies> <Properties> <com.dabsquared.gitlabjenkins.connection.gitlabConnectionProperty البرنامج المساعد = "[email protected]"> <GitlabConnection/</com.dabsquared.gitlabjenkins.connection.gitlabConnectionProperty> <hudson.plugins.promoted__builds.jobpropertyimpl = "[email protected] dev </string> </uctiveprocessnames> </hudson.plugins.promoted__builds.jobpropertyimpl> </spressions> <scm البرنامج المساعد = "[email protected]"> <isconfversion> 2 </configversion> <UserremoteConfigs> <hudson.plugins.git.userrem oteconfig> <Url> ssh: //[email protected]: 10022/bigdata/dwx.git </url> <اعتماد مؤلفات> 84f4be19-ea8d-4271 -8CFB-42AF8F507285 </CENSERNIDSID> </hudson.plugins.git.userremoteconfig> </userremoteconfigs> <ranches> <Hudson.plugins.git.branchspec> <name>/تطوير </name> </hudson.git.git.branch.branch.branch.git.branchSpec> es> <DogenerysubModuleConfigurations> false </dogenerysubmoduleConfigurations> <submodulecfg/> <extensions/</cmm> <isnsficedNode>! macmini </issidednode> <canroam> false </canroam> </isplated> كاذب bled> <blovBuildWhendOwnStreamBuilding> false </blockbuildwhendownstreambuilding> <blovbuildwhenupstreambuilding> false </blockbuildwhenupstreambuilding> <triggers> <hudson.triggers.scmtrigger> <spct> h/5 *</spct> <rathorePostCommithooks> false </ignorePostCommithooks> </hudson.triggers.scmtrigger> </triggers> $ {project} .tar.gz * aws s3 cp $ {project} .tar.gz s3: $ {project} .tar.gz </sompl> </hudson.tasks.shell> </builders> <publishers/> <buildWrappers/> <project>
لا تتوافق المعلومات التي تم الحصول عليها من XML مع ملف التكوين في الشكل.
لا يمكن الحصول على البرامج النصية الترويجية في ملف تكوين XML. في هذا الوقت ، هناك مشكلة. لا يمكن لـ API الحصول على البرامج النصية الترويجية. في الوقت نفسه ، يجلب هذا أيضًا تحديات كبيرة لعملنا. وهذا يعني أيضًا أنه لا يمكن تحقيق نشر تطبيق Commander من خلال هذه الطريقة ويمكن تشغيل تكوين Jenkins من خلال طريقة النظام الأساسي مباشرة.
ومع ذلك ، بعد الاستعلام عن واجهات برمجة التطبيقات ذات الصلة ، لا يمكننا العثور على المحتوى ذي الصلة. بعد الجهود التي لا تفسد ، وجدنا أخيرًا واجهة برمجة التطبيقات المتعلقة بملابس الإنشاء الترويج
الاستعلام: http: //host/job/jobname/promotion/process/promotionname/config.xml
يمكن لهذه الواجهة الحصول على ملف XML الخاص به ، ولكن لا يمكنه إضافة أو تعديل ملف التكوين.
لقد غلفت بعض الطرق لهذا:
/** * Author Chenlang * Date 2018/5/7 */ @slf4jpublic class JenkinsPromotionUtils {private static final string sub_path_promotion_coommand = "/hudson.plugins.promoted__builds.promotionprocess" ؛ Static Final Final Sub_Path_Build = "/BuildSteps" ؛ Static Final String Sub_Path_Builder_shell_Command = "/Hudson.tasks.shell/Command" ؛ Private Static Final String 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': {'promotions': {'ActiveItems': {'name': '٪ s '،' ISVisible ':' '،' icon ':' Star-Gold '،' HasassignedLabel ': false ،' issidedLabelString ':' '،' ظروف ': {' Stapler-class-bag ':' true '}}}}}}} "؛ private Static Final String content_type = "application/x-www-form-urlencoded" ؛ public static update updatepromotionshell (document jobconfigdocument ، string jobname ، JenkinSpromotionClient JenkinsPromotionClient ، string promotionshell ، string path) يلقي ioException ، documentException {if (stringutils.isblank (promotionshell)) {return ؛ } string promotionName = getPromotionName (JobConfigDocument ، path) ؛ وثيقة المستند = JenkinsPromotionClient.getJobpromotionxml (JobName ، PropertionName) ؛ document.selectsinglenode (path_promotion_command) .settext (الترويج) ؛ JenkinsPromotionClient.updatejob (JobName ، PropertionName ، document.asxml ()) ؛ ) } string promotionName = getPromotionName (JobConfigDocument ، path) ؛ وثيقة المستند = JenkinSpromotionClient.getJobPromotionxml (TMPJobName ، الترويج) ؛ document.selectsinglenode (path_promotion_command) .settext (الترويج) ؛ الخريطة <string ، string> map = maps.newhashmap () ؛ map.put ("نوع المحتوى" ، content_type) ؛ map.put ("json" ، string.format (create_promotion_json ، propertionName)) ؛ حاول {JenkinSpromotionClient.createJob (JobName ، Map) ؛ } catch (استثناء e) {log.error ("فشل عند بدء ترقية" + e) ؛ } jenkinspromotionclient.createjob (JobName ، propertionName ، document.asxml ()) ؛ } السلسلة الثابتة العامة getPromotionName (مستند JobConfigDocument ، مسار السلسلة) {return jobconfigdocument.selectsinglenode (path) .getText () ؛ }} حزمة cn.caijiajia.phoenix.service.jenkins ؛ استيراد com.offbytwo.jenkins.client.jenkinshttpclient ؛ import com.offbytwo.jenkins.client.util.encodingutils org.dom4j.documentHelper ؛ استيراد org.springframework.beans.factory.annotation.autowired ؛ استيراد org.springframework.stereotype.component ؛ import java.io.ioException ؛ import java.util.map ؛ /** * Author Chenlang * Date 2018/5/4 */ @ComponentPublic Class JenkinSpromotionClient {Auutowired Jenkinshttpclient JenkinshttpClient ؛ Public JenkinsPromotionClient () {} / *** احصل على ملف تكوين ترويج الوظيفة** param name jobname اسم* param propertionName اسم الترويج* reghrows ioexception* / المستند العام getjobpromotionxml (string jobname) documentHelper.Parsetext (this.getJobxml (JobName ، PropertionName)) ؛ } / ** * تحديث الوظيفة * * param jobname * param propertionName * param jobxml * throws ioException * / public void updatejob (string jobname ، string promotionnam "/config.xml" ، jobxml ، true) ؛ }/** * أضف برنامج نصي الوظيفة * * param jobname * param jobxml * throws ioException */public void createJob (string jobname ، string properiOnname ، string jobxml) remows ioException JobXML ، صحيح) ؛ }/** * أضف مهمة للترويج * * param jobname * param map * throws ioException */public void createJob (string jobname ، map map) يلقي ioException {this.jenkinshttpclient.post_form ("/" + encodingUtils.encode (Jobname)/" } سلسلة خاصة getjobxml (سلسلة jobname ، string promotionName) يلقي ioException {return this.jenkinshttpclient.get (this.tojobbaseurl (JobName ، propertionName) + "/Config.xml") ؛ } سلسلة خاصة tojobbaseurl (string jobname ، string promotionName) {return "/job/" + chigodingUtils.encode (JobName) + "/propertion/process/" + propertionName ؛ } / ** * بناء البرامج النصية الترويجية * param jobname * param propertionName * param الإصدار * param isfirstbuild * throws ioException * / public void build (string jobname ، string promitionNam this.jenkinshttpclient.post ("/job/"+chigodingUtils.encode (JobName)+"/"+version+"/propervion/forcepromotion؟ name ="+propertionName+"& json = ٪ 7b ٪ 7d & prisond = provess propration") ؛ } آخر {this.jenkinshttpclient.post ("/job/"+chigodingUtils.encode (JobName)+"/"+version+"/"+promotionName+"/build؟ json = ٪ 7b ٪ 7d & sridance = repreading represion") ؛ }}}تغلف الطريقة إضافة التكوين والحذف والتعديل والاستعلام عن المكونات الإضافية للبناء ، وكذلك بناء البرنامج النصي الترويجي.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.