解决了什么问题?


疾速ci cd ;


团队合作效率更高,更快的集成,更快的交付;走gitops模式;







支流的CICD过程:





teamcity的架构:

装置形式


docker的形式装置疾速

装置server端

mkdir -p /data/teamcity_server/datadir  /data/teamcity/logsdocker run -it --name teamcity-server \-v /data/teamcity_server/datadir:/data/teamcity_server/datadir \-v /data/teamcity_server/logs:/opt/teamcity/logs \-p 8111:8111 \jetbrains/teamcity-server:EAP

而后失去拜访的url,前面装置客户端的时候须要用到。


比方这里是: http://172.31.12.168:8111




数据库抉择选用默认的hsqldb,这里只有挂载的目录不丢,重新安装之后数据也是存在的;

装置client端

mkdir -p /data/teamcity_agent/confchmod -R 777 /data/teamcity_agent/confdocker run -it -e SERVER_URL="http://172.31.12.168:8111"  \    -v /data/teamcity_agent/conf:/data/teamcity_agent/conf  \    jetbrains/teamcity-agent:EAP


能够装置多个;


然而业余版本的限定了3个,所以为了前期的遍历,最多不超过3个客户端吧!


装置结束之后须要在server端对agent进行受权能力应用。


间接备注即可退出到客户端池。





而后即可退出到服务端的客户端池子。构建的工作的执行即可依照并行度为3进行执行。






也能够物理化部署,不会有docker内核的问题。


这个地位能够下载物理版本的客户端安装包。联合文档批改配置参数即可;

次要批改的是服务端server的地址和客户端的利用名称;
地位:/data/team_agent4/conf/buildAgent.properties


启动指令: ./bin/agent.sh start

而后在服务端受权即可应用。

应用初体验


一个后端工程的CI和CD过程:
上面是实际过程:





创立工程





而后贴入你的 gitlab或者github仓库地址;


填写一个有只读权限的账号和明码。


配置CICD形成脚本

1 后端打jar包

2 打后端docker镜像

3 前端npm打包



4 前端镜像制作

5 推送前端和后端镜像到镜像仓库

6 公布到k8s环境

7 动员钉钉告诉到我的项目群

整体的kotlin代码

package _Self.buildTypesimport jetbrains.buildServer.configs.kotlin.v2019_2.*import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.MavenBuildStepimport jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.dockerCommandimport jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.mavenimport jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.nodeJSimport jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.scriptimport jetbrains.buildServer.configs.kotlin.v2019_2.triggers.vcsobject Build : BuildType({    name = "appBuild"    description = "构建"    allowExternalStatus = true    artifactRules = "app-tp/start/target/app-tp.jar => app-tp.jar"    publishArtifacts = PublishMode.SUCCESSFUL    vcs {        root(HttpGitlabH3yunComHermesSystemAppTpGitRefsHeadsMaster)        showDependenciesChanges = true    }    steps {        maven {            name = "打jar包"            goals = "clean install -Dmaven.test.skip=true -U"            pomLocation = "app-tp/pom.xml"            runnerArgs = "-Dmaven.test.failure.ignore=true"            workingDir = "app-tp"            userSettingsSelection = "我的nexus配置"            localRepoScope = MavenBuildStep.RepositoryScope.MAVEN_DEFAULT            isIncremental = true            jdkHome = "%env.JDK_18%"            dockerImagePlatform = MavenBuildStep.ImagePlatform.Linux            dockerPull = true        }        dockerCommand {            name = "制作后端docker镜像"            commandType = build {                source = file {                    path = "app-tp/app.Dockerfile"                }                namesAndTags = "registry.cn-shenzhen.aliyuncs.com/cloudpivot/app-tp:tptest"                commandArgs = "--pull"            }        }        nodeJS {            name = "前端npm打包"            shellScript = """                cd front-tp                npm install                npm run build            """.trimIndent()            dockerPull = true        }        dockerCommand {            name = "制作前端docker镜像"            commandType = build {                source = file {                    path = "front-tp/front.Dockerfile"                }                namesAndTags = "registry.cn-shenzhen.aliyuncs.com/cloudpivot/front-tp:tptest"                commandArgs = "--pull"            }        }        script {            name = "登录推送到近程镜像仓库"            scriptContent = """                docker login -u="aaaa" -p xxxxyun registry.cn-shenzhen.aliyuncs.com                                echo "推送到近程仓库"                docker push registry.cn-shenzhen.aliyuncs.com/cloudpivot/app-tp:tptest                docker push registry.cn-shenzhen.aliyuncs.com/cloudpivot/front-tp:tptest                                echo "删除本地镜像===节约磁盘空间===="                docker images | grep app-tp | awk '{print ${'$'}3 }' | xargs docker rmi                docker images | grep front-tp | awk '{print ${'$'}3 }' | xargs docker rmi            """.trimIndent()        }        script {            name = "更新k8s环境"            scriptContent = """                cd %system.teamcity.build.checkoutDir%                cd deploy                sh app_tp_deploy.sh                sh front_tp_deploy.sh            """.trimIndent()        }        script {            name = "推送钉钉告诉到我的项目群"            scriptContent = """                url='https://oapi.dingtalk.com/robot/send?access_token=b0dc2aee487a842dd5648566ade86xxxxxxx'                programe=技术治理平台                server=tptest.cloudpivot.cn                content=%teamcity.build.branch%                buildInfo=%vcsroot.useAlternates%                                 function sendDingtalk(){                    curl ${'$'}{1} \                       -H 'Content-Type: application/json' \                       -d "                      {\"msgtype\": \"text\",                         \"text\": {                            \"content\": \"音讯内容:我的项目-${'$'}{2},域名-${'$'}{3},分支-${'$'}{4} 更新内容-${'$'}{5}\"                         },                         \"isAtAll\": true,                       }"                }                                sendDingtalk ${'$'}{url} ${'$'}{programe} ${'$'}{server} ${'$'}{content} ${'$'}{content} ${'$'}{buildInfo}            """.trimIndent()        }    }    triggers {        vcs {            branchFilter = "+:refs/heads/test"        }    }})

小结


teamcity业余版本限度3个执行客户端,100个构建配置,适宜小型团队;




用户体验比拟好,界面比拟难看。


自动检测代码变动,进行构建;(能够大大提高CI效率)



比方推送了一个批改到某个分支,间接就公布到了集成测试环境了。



pk


(开发结束一个性能,而后合并到集成测试分支,再到CICD零碎点公布,碰到问题再惊起一滩鸥鹭)






更优雅。

钉钉音讯告诉


拉一个钉钉群,减少一个机器人:











残缺之后,即可拿到告诉token:


https://oapi.dingtalk.com/robot/send?access_token=c30f5008258474da14e65d3141536953b79df3bf3ab64f33a583e83165b19665

筹备的shell脚本:

url='https://oapi.dingtalk.com/robot/send?access_token=c30f5008258474da14e65d3141536953b79df3bf3ab64f33a583e83165b19665'programe=技术治理平台server=tptest.cloudpivot.cncontent='程序中断' function sendDingtalk(){    curl ${1} \       -H 'Content-Type: application/json' \       -d "      {\"msgtype\": \"text\",         \"text\": {            \"content\": \"音讯内容:我的项目-${2},服务地址-${3},更新内容-${4}\"         },         \"isAtAll\": true,       }"}sendDingtalk ${url} ${programe} ${server} ${content}


理论例子:

url='https://oapi.dingtalk.com/robot/send?access_token=b0dc2aee487a842dd5648566ade86e2217dac868c0ffdcab5138cb7eab163978'programe=技术治理平台server=tptest.cloudpivot.cncontent=%teamcity.build.branch%buildInfo=%vcsroot.useAlternates% function sendDingtalk(){    curl ${1} \       -H 'Content-Type: application/json' \       -d "      {\"msgtype\": \"text\",         \"text\": {            \"content\": \"音讯内容:我的项目-${2},域名-${3},分支-${4} 更新内容-${5}\"         },         \"isAtAll\": true,       }"}sendDingtalk ${url} ${programe} ${server} ${content} ${content} ${buildInfo}


告诉成果截图:

资料


使用手册: (必看英文资料)


https://www.jetbrains.com/help/teamcity/2021.1/configure-and-run-your-first-build.html


teamcity之旅 (必看中文资料)
https://developer.aliyun.com/article/738443


腾讯云搭建teamcity过程:(特权容器解决docker agent无奈打镜像的问题
https://blog.csdn.net/sD7O95O/article/details/88264986

钉钉机器人告诉文档:
https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq

程序启动之后通过shell告诉到钉钉群:
https://blog.csdn.net/weixin_37836950/article/details/107924910

原创不易,关注诚可贵,转发价更高!转载请注明出处,让咱们互通有无,共同进步,欢送沟通交流。