Java项目部署-03-TeamCity CI/CD流水线方式部署
1. 前言
在前面的章节中,我们介绍了手动部署和脚本化部署的方式。本文将详细介绍使用 TeamCity 2024.12.3 搭建 CI/CD 流水线,实现 Java 项目的自动化构建、测试和部署。
技术栈说明:本文基于 TeamCity 2024.12.3、JDK 17 和 Maven 3.9,所有配置均基于官方文档及版本发布说明,可直接用于生产环境。
TeamCity 是 JetBrains 出品的持续集成工具,具有以下优势:
- Web 界面比jenkins好看
2. 环境准备
2.1 服务器环境
| 组件 | 版本要求 | 说明 |
|---|---|---|
| TeamCity | 2024.12.3 | CI/CD 服务器 |
| Java | JDK 17(推荐) | 构建运行环境 |
| Git | 2.0+ | 代码仓库 |
| Maven | 3.9.x | 构建工具 |
| Docker | 20.0+ | 容器化部署(可选) |
2.2 JDK 17 支持说明
TeamCity 2024.12.3 对 Java 的支持如下:
- 支持的 Java 版本:OpenJDK 和 Oracle Java 8(8u16或更高版本)至 21(32位或64位),建议使用 64 位 Java
- 捆绑 JDK :TeamCity 服务器 Windows 安装程序和服务器 Docker 镜像附带捆绑了 Amazon Corretto 64位 Java 17
- 构建代理 :TeamCity 代理 Windows 安装程序和代理 Docker 镜像同样附带捆绑了 Amazon Corretto 64位 Java 17
⚠️ 重要提示:官方已明确将在未来版本中停止支持 Java 8。如果您使用的是非捆绑版本的 Java 8,强烈建议将服务器迁移到更新版本的 Java(如 Java 11 或 17)。
3. TeamCity 安装
3.1 系统要求
TeamCity 服务器可以在任何最新版本的 Windows、Linux 或 macOS 上运行。确保系统已安装兼容的 Java 版本,并且 JAVA_HOME 环境变量指向 Java 安装目录。
3.2 Docker 方式安装(推荐)
TeamCity Docker 镜像已捆绑 Amazon Corretto 64位 Java 17,无需额外配置:
bash
# 创建数据目录
mkdir -p /opt/teamcity/data
mkdir -p /opt/teamcity/logs
# 运行 TeamCity 2024.12.3 容器
docker run -d \
--name teamcity \
-p 8111:8111 \
-v /opt/teamcity/data:/data/teamcity_server/datadir \
-v /opt/teamcity/logs:/opt/teamcity/logs \
-e TEAMCITY_SERVER_OPTS="-Dteamcity.server.allowNonLocalhostLogin=true" \
jetbrains/teamcity-server:2024.12.3
3.3 Linux 传统安装方式
bash
# 下载 TeamCity 2024.12.3
wget https://download.jetbrains.com/teamcity/TeamCity-2024.12.3.tar.gz
# 解压
tar -xzf TeamCity-2024.12.3.tar.gz -C /opt/
# 确保系统已安装 JDK 17
java -version
# 输出示例:openjdk version "17.0.10" 2024-01-16 LTS
# 启动 TeamCity 服务器和捆绑的构建代理
cd /opt/TeamCity/bin
./runAll.sh start
3.4 Windows 安装方式
运行下载的 .exe 文件,遵循 TeamCity 设置向导:
- 选择安装目录
- 选择 TeamCity 服务器和代理是否以 Windows 服务方式运行
- 配置端口(默认服务器端口 8111,代理端口 9090)
安装完成后,可通过 http://localhost:8111 访问 TeamCity Web 界面。
3.5 首次启动配置
当首次在浏览器中启动 TeamCity 时:
- 审查 TeamCity 数据目录位置
- 选择数据库类型(评估可使用内置数据库)
- 接受许可协议
- 创建管理员账户
4. 创建项目与构建配置
4.1 从仓库 URL 创建项目
TeamCity 支持从仓库 URL 自动创建项目,这是最简便的方式:


配置git地址有两种方式:
1.配置http地址,输入你的用户名密码
2.配置ssh地址,输入密钥
- 生成ED25519无密码SSH密钥
- 执行密钥生成命令,不设置密钥密码,指定密钥文件名:
java
ssh-keygen -t ed25519 -N "" -f ~/.ssh/tc_gitea_key
执行输出日志
ssh
Generating public/private ed25519 key pair.
Your identification has been saved in /home/etc/.ssh/tc_gitea_key
Your public key has been saved in /home/etc/.ssh/tc_gitea_key.pub
The key fingerprint is:
SHA256:0dZ+REQkJNBWcCp/2LOsTI9Bsk3YimckeNELzeVmrzo etc@localhost.localdomain
The key's randomart image is:
+--[ED25519 256]--+
| .o++=+= |
| + +o= o |
| o *.B . . |
| . o @ = . |
| . o S * * . |
| . + B + + |
| . = = o |
| oE+ = |
| ..+ . |
+----[SHA256]-----+
查看密钥目录文件权限
切换至ssh目录并列出文件:
cd ~/.ssh
ls -l
目录文件列表
总用量 12
-rw------- 1 etc etc 1191 1月 16 14:33 authorized_keys
-rw------- 1 etc etc 419 7月 1 09:05 tc_gitea_key
-rw-r--r-- 1 etc etc 107 7月 1 09:05 tc_gitea_key.pub
查看公钥内容(复制到Gitea后台)
ssh
cat tc_gitea_key.pub
公钥完整内容
ssh
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG19BUCi5DFgACVfvm0rnTzQ9GNHLelDuaFhT6rXy7JG etc@localhost.localdomain
私钥内容
ssh
cat tc_gitea_key
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACBtfQVAouQxYAAlX75tK5080PRjRy3pQ7mhYU+q18uyRgAAAKBkzxopZM8a
KQAAAAtzc2gtZWQyNTUxOQAAACBtfQVAouQxYAAlX75tK5080PRjRy3pQ7mhYU+q18uyRg
AAAEAcxRZaMlDv8Jmc/C3130fYn/cekVvMd1EQGJpRFJ6x3W19BUCi5DFgACVfvm0rnTzQ
9GNHLelDuaFhT6rXy7JGAAAAGWV0Y0Bsb2NhbGhvc3QubG9jYWxkb21haW4BAgME
-----END OPENSSH PRIVATE KEY-----
把私钥的完整内容放到一个文件里面(文件不要有后缀)
把这个文件上传到teamcity


上传完之后点击确认就不会报错了,就进入到了以下页面

你想构建哪一个分支就修改对应的分支名称

页面上也会看到我们的agent(工作的智能体)

点击parameter,看看我们的jdk环境和maven啥的是否正确

如果不正确可以自己安装

也可以自定义上传

也可以在build step里面点击maven构建步骤进去会看到maven自定义路径填写,填写你服务器上面的maven全路径就可以了

jdk同理往下翻就可以看到
4.2 构建步骤样例
首先在代码的根目录写一个Dockerfile

整体构建步骤概览

step1:选择maven方式clean 打包

step2:检查jar包是否打包成功
选择command line方式,脚本如下直接粘贴进去
sh
# 进入 target 目录(Maven 打包输出目录)
cd target
# 检查是否存在 jar 包
if ls *.jar 1> /dev/null 2>&1; then
echo "✅ 检查成功:jar 包已生成!"
ls -lh *.jar # 打印 jar 包信息,方便看结果
else
echo "❌ 错误:未找到任何 jar 包!构建停止!"
exit 1 # 退出并标记构建失败
fi

step3:打包镜像-build image
脚本如下,直接粘贴进去
sh
# 查看当前目录(确认路径正确)
pwd
ls -la
# 检查 Dockerfile 是否存在,不存在则报错退出
if [ ! -f "Dockerfile" ]; then
echo "❌ 错误:当前目录未找到 Dockerfile 文件,构建终止!"
exit 1
fi
echo "✅ 已找到 Dockerfile,开始构建镜像..."
# 构建 Docker 镜像(镜像名:git-flow,标签:latest)
docker build -t git-flow:latest .
# 查看镜像是否生成
docker images | grep git-flow

step4:推送到阿里云镜像仓库备份(或者你们公司有harber)
脚本直接粘贴(这里要注意哦,需要配置密码%ALIYUN_PWD%--在parameter里面配置就行)
sh
# 登录阿里云个人版 ACR(你的专属地址)
docker login --username=没有感情的二叔 -p %ALIYUN_PWD% crpi-hu53hh31tmegajyi.cn-beijing.personal.cr.aliyuncs.com
# 给镜像打标签(你的完整镜像名)
docker tag git-flow:latest crpi-hu53hh31tmegajyi.cn-beijing.personal.cr.aliyuncs.com/my-teamcity-dev/git-flow:latest
docker tag git-flow:latest crpi-hu53hh31tmegajyi.cn-beijing.personal.cr.aliyuncs.com/my-teamcity-dev/git-flow:0.0.1-SNAPSHOT
# 推送镜像
docker push crpi-hu53hh31tmegajyi.cn-beijing.personal.cr.aliyuncs.com/my-teamcity-dev/git-flow:latest
docker push crpi-hu53hh31tmegajyi.cn-beijing.personal.cr.aliyuncs.com/my-teamcity-dev/git-flow:0.0.1-SNAPSHOT

step5:从仓库拉下来镜像启动
脚本直接粘贴:
sh
docker login --username=没有感情的二叔 -p %ALIYUN_PWD% crpi-hu53hh31tmegajyi.cn-beijing.personal.cr.aliyuncs.com
docker pull crpi-hu53hh31tmegajyi.cn-beijing.personal.cr.aliyuncs.com/my-teamcity-dev/git-flow:latest
docker stop git-flow || true
docker rm git-flow || true
docker run -d \
--name git-flow \
-p 8899:8899 \
--restart=always \
crpi-hu53hh31tmegajyi.cn-beijing.personal.cr.aliyuncs.com/my-teamcity-dev/git-flow:latest

step6:钉钉通知
脚本直接粘贴(别忘了配置dingdingurl的参数,在parameter里面配置)
钉钉机器人具体怎么弄自己去网上查吧,不可能嘴对嘴都喂你
sh
#!/bin/sh
# 配置信息
url='%dingdingurl%'
programe="技术管理平台"
server="tptest.cloudpivot.cn"
# 获取上一步的执行结果(0=成功,非0=失败)
exit_code=$?
# 发送钉钉通知
sendDingtalk() {
curl -s "$1" \
-H 'Content-Type: application/json' \
-d "{
\"msgtype\": \"text\",
\"text\": {
\"content\": \"$2\"
},
\"isAtAll\": true
}"
}
# 根据结果发送不同消息
if [ $exit_code -eq 0 ]; then
# 成功消息
msg="✅ 部署成功通知
项目名称:${programe}
服务地址:${server}
状态:部署完成,运行正常"
else
# 失败消息
msg="❌ 部署失败通知
项目名称:${programe}
服务地址:${server}
状态:构建/部署过程出错,请检查日志"
fi
# 执行发送
sendDingtalk "$url" "$msg"
# 把真实的错误码返回给构建系统,不影响构建失败状态
exit $exit_code

配置完成也就差不多了,然后点击run他就会自动拉取你配置的分支代码,自动执行这几个步骤了,如果钉钉没通知,可能就是失败了,需要去页面看日志

由上述内容可以自行修改成
- 部署到k8s,你提前写好deploy.yml,配置步骤里面配置
sh
cd %system.teamcity.build.checkoutDir%
cd deploy
sh app_tp_deploy.sh
sh front_tp_deploy.sh
- 直接nohup java -jar的话就直接构建步骤里面进入jar文件夹执行
上述内容可以自行修改灵活变动
比如不用command line 而使用docker方式也是一样,哪里亮了点哪里
举个例子:
