Предисловие
Jenkins является популярным инструментом непрерывной интеграции с открытым исходным кодом, который широко используется в разработке проектов и имеет такие функции, как автоматическое строительство, тестирование и развертывание.
Недавно я участвовал в разработке интегрированной тестовой платформы компании и столкнулся с множеством проблем в разработке. Двухнедельная итерация должна быть завершена. Я буду использовать этот блог, чтобы записать проблемы в разработке для ссылки читателей.
Компания имеет много приложений, поэтому мы должны понять, как построить эти приложения в Дженкинсе. Я участвовал в двух типах Commander Applications, один из них - это класс Big Data, а другой - приложение Scala нашей группы архитектуры сервера.
1. Приложение больших данных
Конфигурация заключается в следующем:
Файл XML, соответствующий файлу конфигурации: Получите файл конфигурации XML через CRUL: http: //host/job/tar_py_dwx_dev/config.xml
<Project> <actions/> <description/> <seepDependencies> false </hovedependencies> <properties> <com.dabsquared.gitlabjenkins.connection.gitlabconnectionProperty plugin = "[email protected]"> <gitlabconnection/</com.dabsquared.gitlabjenkins.connection.gitlabconnectionproperty> <hudson.plugins.promoted__builds.jobpropertyimplemplemplemplemplemplemplemplemplemplemproperty Dev </string> </activeProcessNames> </hudson.plugins.promoted__builds.jobpropertyimpl> </свойства> <scm plugin = "[email protected]"> <configversion> 2 </configentsion> <userremoteconfigs> <hudson.plugins.git.userrem Oteconfig> <url> ssh: //[email protected]: 10022/bigdata/dwx.git </url> <credentialsid> 84f4be19-ea8d-4271 -8CFB-42AF8F507285 </credentialSID> </hudson.plugins.git.usermoteconfig> </userremoteconfigs> <phountes> <hudson.plugins.git.branchspec> <mame>*/Развивать </name> </hudson.plugins.git.branch> <mame>*/Развитие </name> </hudson.plugins.git.branch es> <gogeneratesubmoduleconfigurations> false </dogeneratesubmoduleconfigurations> <bomodulecfg/> <extensions/</scm> <sassednode>! Macmini </usdEdnode> <canroam> false </canroam> <ficabled> false </disa BLED> <BlockBuildWhendhandStreamBuilding> false </blockbuildwhendhandstreambuilding> <BlockbuildwhenupStreamBuilding> false </blockbuildwhenupstreamBuilding> <Triggers> <hudson.triggers.scmtrigger> <pept> h/5 * * * * * * * * * * * * * * * * * * *</spec> <ignorepostcommithooks> false </ignorepostcommithooks> </hudson.triggers.scmtrigger> </triggers> <condurentbuild> false </conturrentbuild> <0000> <hudson.tasks.shell> <adom $ {project} .tar.gz * aws s3 cp $ {project} .tar.gz s3: // lattebank-jenkins-build-dev/$ {job_base_name}/$ {build_number}/-cn-north-1 rm -rf $ {project} .tar.gz </command> </hudson.tasks.shell> </builders> <Publishers/> <BuildWrappers/> <Project>
Информация, полученная из XML, не соответствует файлу конфигурации на рисунке.
Сценарии продвижения не могут быть получены в файле конфигурации XML. В настоящее время есть проблема. Этот API не может получить сценарии продвижения. В то же время, это также приводит к большим проблемам для нашей работы. Это также означает, что развертывание приложения Commander не может быть реализовано с помощью этого метода, и конфигурация Jenkins с помощью метода платформы может быть непосредственно эксплуатироваться.
Однако после запроса соответствующих API мы не можем найти соответствующий контент. После неожиданных усилий мы наконец обнаружили API, связанный с плагином Promote Build
Запрос: http: //host/job/jobname/promotion/process/promotionname/config.xml
Этот интерфейс может получить свой XML -файл, но он не может добавить или изменить файл конфигурации.
Я инкапсулировал некоторые методы для этого:
/** * @author chenlang * Дата 2018/5/7 */ @slf4jpublic class jenkinspromotionutils {private Static final String 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 = "{'Свойства': {'stapler-class-bag': 'true', 'hudson-plugins-promoted_builds-jobpropertyimpl': {'ramotions': {'activeItems': {'name': '%s ',' isvisible ':' ',' icon ':' star-gold ',' hasassignedlabel ': false,' назначенное плату частная статическая конечная строка content_type = "application/x-www-form-urlencoded"; public static void updatepromotionshell (документ JobConfigDocument, String JobName, JenkinsPromotionClient JenkinsPromotionClient, String PromotionShell, String Path) Throws IOException, DocumentException {if (stringUtils.isblank (romotionshell)) {return; } String romotionname = getPromotionName (jobConfigDocument, path); Document Document = JenkinsPromotionClient.getJobPromotionXML (JobName, PromotionName); document.selectsinglenode (path_promotion_command) .settext (ramotionshell); jenkinspromotionclient.updatejob (jobname, promotionname, document.asxml ()); } public static void createPromotionshell (документ JobConfigDocument, String tmpjobName, String jobName, String PromotionShell, String Path, JenkinsPromotionClient JenkinsPromotionClient) бросает ioException, documentException {if (stringUtils.isblank (romotionshell)) {return; } String romotionname = getPromotionName (jobConfigDocument, path); Document Document = JenkinsPromotionClient.getJobPromotionXML (tmpjobName, romotionName); document.selectsinglenode (path_promotion_command) .settext (ramotionshell); Map <string, string> map = maps.newhashmap (); map.put ("content-type", content_type); map.put ("json", string.format (create_promotion_json, romotionname)); try {jenkinspromotionclient.createjob (jobname, map); } catch (Exception e) {log.error ("Не удастся при запуске акции" + e); } jenkinspromotionClient.createJob (jobname, romotionname, document.asxml ()); } public Static String getPromotionName (документ jobConfigDocument, String Path) {return jobConfigDocument.selectsingLenode (path) .getText (); }} Пакет cn.caijiajia.phoenix.service.jenkins; import com.offbytwo.jenkins.client.jenkinshtpclient; импорт com.offbytwo.jenkins.client.util.encodingutils; импорт org.dom4j.document; импорт org.dom4j.documentex; org.dom4j.documenthelper; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotyle.component; импорт java.io.ioexception; import java.util.map; /** * @author chenlang * дата 2018/5/4 */ @componentpublic class jenkinspromotionclient {@autowired private jenkinshttpclient jenkinshttpclient; public jenkinspromotionClient () {} / *** Получить файл конфигурации продвижения работы*** @param jobname Имя задания* @param promotionname name* @return* @Throws ioException* / public Document getJobPromOtionxml (String jobName, String PromotionNam DocumentHelper.parsetext (this.getJobxml (jobname, romotionname)); } / ** * Обновление задания * * @param jobname * @param promotionname * @param jobxml * @throws ioexception * / public void updatejob (string jobname, string promotionname, string jobxml) throws ioexception {job jenkinshtpclient.post_xml (this.tojobame "/config.xml", jobxml, true); }/** * Добавить скрипт задания * * @param jobname * @param jobxml * @throws ioexception */public void createJob (string jobname, string romotionname, string jobxml) throws ioexception {this.jenkinshttpclient.post_xml (this.tojobbaseurl (jobname, remotionm.xmlig. jobxml, true); }/** * Добавить задание по продвижению * * @param jobname * @param map * @throws ioexception */public void createjob (string jobname, карта карта) Throws ioexception {this.jenkinshttpclient.post_form ("/job/" + encodingutils.encode (jobname) + "/configsubmit? } частная строка getJobxml (string jobname, string promotionname) throws ioexception {return this.jenkinshttpclient.get (this.tojobaseurl (jobname, romotionname) + "/config.xml"); } private String tojobbaseurl (string jobname, string promotionname) {return "/job/" + encodingutils.encode (jobname) + "/procection/" + romotionname; } / ** * * Строительство промо -сценарии * @param jobname * @param promotionname * @param version * @param isfirstbuild * @throws ioexception * / public void build (string jobname, string romotionnam this.jenkinshttpclient.post ("/job/"+encodingutils.encode (jobname)+"/"+version+"/radiot/forcepromotion? name ="+ramotionname+"& json =%7b%7d & post = force propation"); } else {this.jenkinshttpclient.post ("/job/"+encodingutils.encode (jobname)+"/"+version+"/rametion/"+ramotionname+"/build? Json =%7b%7d & propect = execute ropotion"); }}}Метод инкапсулирует сложение, удаление, удаление, модификацию и запрос на конфигурацию, а также строительство сценария продвижения.
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.