Java项目部署-03-teamcity-cicd-docker镜像流水线方式部署

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 时:

  1. 审查 TeamCity 数据目录位置
  2. 选择数据库类型(评估可使用内置数据库)
  3. 接受许可协议
  4. 创建管理员账户

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方式也是一样,哪里亮了点哪里

举个例子:

相关推荐
认真的酒窝3 小时前
自己动手开发编译器(十一)语义分析
java·开发语言
wbs_scy5 小时前
Linux C++ 高并发编程:线程池全链路深度解析,从原理到手撕实现
java·开发语言
JAVA面经实录9175 小时前
Linux 常用命令完整知识体系
java·linux·开发语言·汇编
Full Stack Developme6 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
程序员老油条8 小时前
WSL2 + Docker Desktop:Windows 下的完美 Java 开发环境
java·windows·docker·wsl2
shushangyun_10 小时前
2026智能采购商城系统选型指南:如何引领企业数字化采购升级
java·大数据·数据库·人工智能·机器学习
她说..10 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
学渣超10 小时前
记一次分布式事务数据不一致的排查之旅:从超时到索引,层层剥茧
java·后端·架构
掉鱼的猫10 小时前
Agent Harness 实战指南:构建生产级 AI Agent 的"马具"框架
java·llm·aigc
带刺的坐椅10 小时前
Agent Harness 实战指南:构建生产级 AI Agent 的"马具"框架
java·ai·llm·agent·solon-ai