devops实践: teamcity实现持续集成

解决了什么问题?

快速ci cd ;

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

devops实践: teamcity实现持续集成

主流的CICD过程:

devops实践: teamcity实现持续集成

teamcity的架构:

devops实践: teamcity实现持续集成

安装方式

docker的方式安装快速

安装server端

mkdir -p /data/teamcity_server/datadir  /data/teamcity/logs

docker 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/conf
chmod -R 777 /data/teamcity_agent/conf

docker 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进行授权才能使用。

devops实践: teamcity实现持续集成

直接备注即可加入到客户端池。

devops实践: teamcity实现持续集成

devops实践: teamcity实现持续集成

然后即可加入到服务端的客户端池子。构建的任务的执行即可按照并行度为3进行执行。

devops实践: teamcity实现持续集成

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

devops实践: teamcity实现持续集成

这个位置可以下载物理版本的客户端安装包。结合文档修改配置参数即可;

主要修改的是服务端server的地址和客户端的应用名称;
位置:/data/team_agent4/conf/buildAgent.properties

devops实践: teamcity实现持续集成

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

然后在服务端授权即可使用。

使用初体验

一个后端工程的CI和CD过程:
下面是实践过程:

devops实践: teamcity实现持续集成

创建工程

devops实践: teamcity实现持续集成

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

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

devops实践: teamcity实现持续集成

配置CICD构成脚本

1 后端打jar包

devops实践: teamcity实现持续集成

2 打后端docker镜像

devops实践: teamcity实现持续集成

3 前端npm打包

devops实践: teamcity实现持续集成

4 前端镜像制作

devops实践: teamcity实现持续集成

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

devops实践: teamcity实现持续集成

6 发布到k8s环境

devops实践: teamcity实现持续集成

7 发动钉钉通知到项目群

devops实践: teamcity实现持续集成

整体的kotlin代码

package _Self.buildTypes

import jetbrains.buildServer.configs.kotlin.v2019_2.*
import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.MavenBuildStep
import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.dockerCommand
import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.maven
import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.nodeJS
import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script
import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.vcs

object 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效率)

devops实践: teamcity实现持续集成

比如推送了一个修改到某个分支,直接就发布到了集成测试环境了。

devops实践: teamcity实现持续集成

pk

(开发完毕一个功能,然后合并到集成测试分支,再到CICD系统点发布,碰到问题再惊起一滩鸥鹭)

更优雅。

钉钉消息通知

拉一个钉钉群,增加一个机器人:

devops实践: teamcity实现持续集成

devops实践: teamcity实现持续集成

devops实践: teamcity实现持续集成

完整之后,即可拿到通知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.cn
content='程序中断'

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.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}

通知效果截图:

devops实践: teamcity实现持续集成

材料

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

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

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

Original: https://www.cnblogs.com/snidget/p/15622586.html
Author: 李福春
Title: devops实践: teamcity实现持续集成

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/589459/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 一致性hash原理 看这一篇就够了

    ​ 在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一…

    Java 2023年6月7日
    076
  • JBoss部署项目log4j配置会造成死锁问题,浏览器访问一直pending状态

    今天将项目部署到JBoss服务器上,部署成功后,浏览器访问页面一直在等待响应。 看到造成死锁的原因是因为log4j往控制台上打印信息时候,于是修改了项目的log4j配置文件,修改为…

    Java 2023年6月7日
    077
  • JavaScript学习

    一、什么是JavaScript JavaScript世界上最流行的脚本语言 一个合格的后端人员,必须精通JavaScript 二、快速入门 2.1、引入JavaScript 内部引…

    Java 2023年6月8日
    078
  • 浅谈限流组件的应用和设计原则

    做业务的同学都知道,在现实情况中,往往会出现流量暴增的情况。这些流量可能来自于黑客的爬虫,也可能来自于节日大促,或者其他一些渠道。当然业界都有对策,比如反爬、熔断、降级、限流等等不…

    Java 2023年6月16日
    071
  • Kubernetes-Ingress

    1. 简介 Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。 Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。 I…

    Java 2023年6月7日
    064
  • nginx出现 “414 request-uri too large”

    在请求查询的时候使用了Get方法,由于拼接的url过长,导致nginx出现了”414 request-uri too large”错误。 出现这种问题可以按…

    Java 2023年5月30日
    060
  • docker

    P1.docker镜像无法删除(检索关键词:无法删除) 现象:删除提示:Error:No such image:x…

    Java 2023年6月16日
    062
  • SSM整合_年轻人的第一个增删改查_删除

    写在前面 SSM整合_年轻人的第一个增删改查_基础环境搭建SSM整合_年轻人的第一个增删改查_查找SSM整合_年轻人的第一个增删改查_新增SSM整合_年轻人的第一个增删改查_修改S…

    Java 2023年6月5日
    086
  • Fizz企业级微服务API网关进阶系列教程-服务编排处理列表数据(下)-字段重命名&字段移除

    ​ 概述 服务编排是Fizz网关提供的一个强大的功能,能够基于现有的业务微服务通过在线配置的方式快速的生成一个聚合接口,减少中间层胶水代码以及降低编码投入。在服务编排中支持使用函数…

    Java 2023年6月9日
    076
  • 深入MySQL(二):MySQL的数据类型

    对于MySQL中的数据类型的选择,不同的数据类型看起来可能是相同的效果,但是其实很多时候天差地别。本章从MySQL中的 常用类型出发,结合 类型选择的常见错误,贯彻MySQL的常用…

    Java 2023年6月7日
    097
  • 升级java11后,maven命令打包报错

    一、问题 升级java11后,maven命令打包报错: mvn clean package -Dmaven.test.skip=true [ERROR] Failed to exe…

    Java 2023年5月29日
    064
  • Bean的原始版本与最终版本不一致?记一次Spring IOC探索之旅

    前言 在这个信息技术发展迅速的时代,万万没想到,Spring自2003年发展至今,仍是技术选型中的 首选,某些项目甚至有 Spring&…

    Java 2023年5月29日
    073
  • Java8新特性-方法引用

    方法引用的使用场景 我们用Lambda表达式来实现匿名方法。但有些情况下,我们用Lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作,在这种情况下…

    Java 2023年6月8日
    068
  • Java基础 变量名的开头可以使用$

    JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code packag…

    Java 2023年5月29日
    058
  • VMware-ESXI上挂载U盘到某台虚拟机上

    第一步:在目标虚拟机上添加USB 控制器,右键单击目标虚拟机,选中”编辑设置”。如图 添加USB 控制器,单击”下一步” 选择控制器…

    Java 2023年5月30日
    083
  • 报错One record is expected, but the query result is multiple records

    总结:出现这种情况,显而易见,就是查询的数据在数据库中不止一条,而我调用的selectOne方法,返回值是一个User对象,导致报错 点击查看错误代码 LambdaQueryWra…

    Java 2023年6月15日
    067
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球