Prefácio
Jenkins é uma ferramenta popular de integração contínua de código aberto que é amplamente utilizado no desenvolvimento do projeto e possui funções como construção automatizada, teste e implantação.
Recentemente, participei do desenvolvimento da plataforma de teste integrada da empresa e encontrei muitos problemas no desenvolvimento. A iteração de duas semanas está prestes a ser concluída. Vou usar este blog para registrar os problemas no desenvolvimento da referência dos leitores.
A empresa possui muitos aplicativos, por isso precisamos entender como criar esses aplicativos em Jenkins. Eu participei de dois tipos de aplicativos comandantes, um é a classe de big data e o outro é o aplicativo Scala do nosso grupo de arquitetura de servidores.
1. Aplicativo de big data
A configuração é a seguinte:
O arquivo XML correspondente ao arquivo de configuração: obtenha o arquivo de configuração XML através de Crul: http: //host/job/tar_py_dwx_dev/config.xml
<Project> <Ações/> <Description/> <tepdependências> false </keepDependences> <Properts> <com.dabsquared.gitlabjenkins.connection.gitlabConnectionProperty plugin = "[email protected]"> <gitlabconnection/</com.dabsquared.gitlabjenkins.connection.gitlabconnectionProperty> <budson.plugins.promoted__builds.jobPropertyImpl plugin = "PROMOLIDLIDRILDSBILDS. Dev </string> </ActiveProcessNames> </dudson.plugins.promott__builds.jobpropertyimpl> </properties> <scm plugin = "[email protected]"> <Figversion> 2 </figversion> <USERRemoteConfigs> <hudson.plugins.git.userrem oteconfig> <url> ssh: //[email protected]: 10022/bigdata/dwx.git </url> <redencieSid> 84F4Be19-EA8D-4271 -8cfb-42af8f507285 </redencieSid> </dudson.plugins.git.usermoteconfig> </aserremoteConfigs> <freames> <budson.plugins.git.branchspec> <name>/desenvolve </name </hudson.plugins.git.branchspec> <name> S> <OroneRatesubModuleConfigurações> Falso </DOGERATERATESUBMODULECONFIGURAÇÕES> <SubmoduleCfg/> <Extensions/</scm> <DesclitedNode>! MacMini </setworkedNode> <bloRaam> false </canroam> <misabled> false </DISA BLED> <BlockBuildWhendowNStreambuilding> False </BlockBuildWlendOwnstreambuilding> <BlockBuildWhenUpStreambuilding> Falso </BlockBuildWhenUpStreambuilding> <triggers> <hudson.Triggers.ScTrigger> <spp> h/5 *</spec><ignorePostCommitHooks>false</ignorePostCommitHooks></hudson.triggers.SCMTrigger></triggers><concurrentBuild>false</concurrentBuild><builders><hudson.tasks.Shell><command>project=dwx1 cd ${WORKSPACE} tar zcvf $ {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> </bilmers> <publishers/> <BuildWrappers/<Project>
As informações obtidas do XML não correspondem ao arquivo de configuração na figura.
Os scripts de promoção não podem ser obtidos no arquivo de configuração XML. Neste momento, há um problema. Esta API não pode obter os scripts de promoção. Ao mesmo tempo, isso também traz grandes desafios ao nosso trabalho. Isso também significa que a implantação do aplicativo Commander não pode ser realizada através desse método e a configuração de Jenkins através do método da plataforma pode ser operada diretamente.
No entanto, depois de consultar as APIs relevantes, não podemos encontrar o conteúdo relevante. Após esforços incessantes, finalmente encontramos a API relacionada ao plug-in de criação de promoção
Query: http: //host/job/jobname/promotion/process/promotionname/config.xml
Essa interface pode obter seu arquivo XML, mas não pode adicionar ou modificar o arquivo de configuração.
Eu encapsulei alguns métodos para isso:
/** * @author chenlang * data 2018/5/7 */ @slf4jpublic Classe Jenkinspromotionutils {private Static final String sub_path_promotion_coommand = "/hudson.plugins.promoted__builds.promotionprocess";; String final estática privada sub_path_build = "/BuildSteps"; String final estática privada sub_path_builder_shell_command = "/hudson.tasks.shell/command"; String final estática privada PATH_PROMOTION_COMMAND = SUB_PATH_PROMOTION_COMAND + SUB_PATH_BUILD + SUB_PATH_BUILDER_SHELL_COMMAND; String estática privada create_promotion_json = "{'Propriedades': {'stapleler-class-bag': 'true', 'hudson-plugins-prromoted_builds-jobpropertyImpl': {'promoções': {'ActiveItems': {'name': '%s ',' isVisible ':' ',' ícone ':' Star-Gold ',' HasassignedLabel ': false,' atribuídoLabelString ':' ',' Condições ': {' stapleler-class-bag ':' true '}}}}} "; String final estática privada content_type = "Application/x-www-corm-urlencoded"; public static void updateProMotionshell (documento JobConfigDocument, String JobName, JenkinsProMotionClient JenkinsProMotionClient, String Promotionshell, String Path) lança IoException, DocumentException {if (stringUtils.isblank (promovionShell)) {retorn; } String promoçãoName = getPromotionName (JobConfigDocument, Path); Documento documento = jenkinspromotionClient.getJobProMotionxml (JobName, PromotionName); Document.SelectSingLenode (PATH_PROMOTION_COMAND) .SETTEXT (Promotionshell); jenkinspromotionClient.UpDateJob (JobName, PromotionName, document.asxml ()); } public static void CreatePromOtionshell (documento JobConfigDocument, String tmpjobname, String JobName, String Promotionshell, String Path, JenkinsProMotionClient jenkinspromotionClient) lança IoException, DocumentException {if (stringutils.isblank (PromotionShell)) } String promoçãoName = getPromotionName (JobConfigDocument, Path); Documento documento = jenkinspromotionClient.getJobProMotionxml (tmpjobname, promoçãoName); Document.SelectSingLenode (PATH_PROMOTION_COMAND) .SETTEXT (Promotionshell); Mapa <string, string> map = maps.newhashmap (); map.put ("content-type", content_type); map.put ("json", string.format (create_promotion_json, promoçãoname); tente {jenkinspromotionClient.createJob (JobName, mapa); } catch (Exceção e) {log.error ("falhou ao iniciar uma promoção" + e); } jenkinspromotionClient.CreateJob (JobName, PromotionName, document.asxml ()); } public static string getPromotionName (documento JobConfigDocument, String Path) {return jobConfigDocument.SelectSingLenode (PATH) .getText (); }} pacote cn.caijiajia.phoenix.service.jenkins; importação com.offbytwo.jenkins.client.jenkinshttpclient; importar com.offbytwo.jenkins.client.util.encodinuils; importd.dom4j.comcept; importação ou troca; org.dom4j.documentHelper; importar org.springframework.beans.factory.annotation.autowired; importar org.springframework.tereotype.component; importar java.io.ioexception; importar java.util.map; /** * @Author Chenlang * Data 2018/5/4 */ @ComponentPublic Classe JenkinsPromotionClient {@AUTOWIRED PRIVADO JenkinshttpClient jenkkinshttpclient; public JenkinsProMotionClient () {} / *** Obtenha o arquivo de configuração de promoção do trabalho** @param jobName Nome do trabalho* @param promoçãoName de promoção Nome* @return* @throws ioexception* / public document Ioxception, documenting getJobPromotionXML (String JobName, Stringname) SlowSoxception, IoException, Ioxception, Ioxception, GetJOBPromotionXML (String JobName, StringName) Slows) DocumentHelper.ParseText (this.getJobxml (JobName, PromotionName)); } / ** * Atualize trabalho * * @param jobName * @param promoçãoName * @param jobxml * @throws ioexception * / public void updatejob (string jobName, string promoçãoname, string jobxml) lança ioexception {this.jenkinShttppClient.post_xml ( "/config.xml", jobxml, true); }/** * Adicione script de trabalho * * @param jobName * @param jobxml * @throws ioexception */public void CreateJob (String JobName, String PromotionName, String Jobxml) Throws IoException {this.jenkinShTtttt.Post_xml (this.tojobasaseur {this.jenkinShttttt.Post_xml (this.tojobasaseur {this.jenkinShTtttt.Post_xml (this.tojobasaseur {this.jenkinShTtttt.Post_Xml (this.tojobasaseur {this.JenkinShTttT.Post_xml (this.tojobasase jobxml, verdadeiro); }/** * Adicione um trabalho de promoção * * @param jobName * @param mapa * @throws ioexception */public void CreateJob (String JobName, mapa mapa) lança ioexception {this.jenkinshttpclient.post_form ("/job" + codinguils.encode, jobname) + " } private String getJobxml (String JobName, String PromotionName) lança IoException {return this.jenkinshttpclient.get (this.tojobbaseurl (JobName, PromotionName) + "/config.xml"); } String privada toJobBaseUrl (String JobName, String PromotionName) {return "/job/" + codingUtils.encode (JobName) + "/Promoção/Process/" + PromotionName; } / ** * Construção de scripts de promoção * @param jobName * @param promoçãoname * @param versão * @param isfirstbuild * @throws ioexception * / public void build (string jobname, string promoçãoname, versão inteira, versão boolean isfirstbuild) {string promovionName, versão inteira, isfirbuild) {serigername (isfirbuild) {serigername, serige this.jenkinShttpClient.post ("/job/"+codingUtils.encode (JobName)+"/"+versão+"/promoção/forcepromotion? name ="+promoçãoname+"& json =%7b%7d & submit = promoção da força"); } else {this.jenkinShttpClient.post ("/job/"+codingUtils.encode (JobName)+"/"+versão+"/promoção/"+promoçãoname+"/build? json =%7b%7d & submit = reexecute promoção"); }}}O método encapsula a adição de configuração, exclusão, modificação e consulta do plug-in de construção, bem como a construção do script de promoção.
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.