TeamCity作为JetBrains旗下的CI/CD工具,凭借对开发者友好的特性(比如与IDEA深度集成)成为不少技术团队的首选。最近在帮公司迁移旧有构建系统时,我选择了Docker Compose部署方案,实测下来比传统安装方式节省了80%的初始化时间。下面就以2023.05.2版本为例,手把手带你完成全流程部署。
容器化部署最大的优势在于环境隔离和快速复制。我曾用这套配置在半小时内为三个不同项目组搭建了独立环境,每个环境都包含完整的TeamCity服务端和构建代理。先看基础架构组成:
这是我为测试环境准备的docker-compose.yml模板,特点是自动创建MySQL容器并完成初始化:
yaml复制version: '3.8'
services:
mysql:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: tc_rootpass
MYSQL_DATABASE: teamcity
MYSQL_USER: teamcity
MYSQL_PASSWORD: tc_password
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 10s
retries: 10
teamcity:
image: jetbrains/teamcity-server:2023.05.2
depends_on:
mysql:
condition: service_healthy
volumes:
- teamcity_data:/data/teamcity_server/datadir
- teamcity_logs:/opt/teamcity/logs
ports:
- "8111:8111"
environment:
TEAMCITY_DB_USER: teamcity
TEAMCITY_DB_PASSWORD: tc_password
TEAMCITY_DB_HOST: mysql
volumes:
mysql_data:
teamcity_data:
teamcity_logs:
关键配置说明:
启动命令实测有效:
bash复制docker-compose up -d
# 查看初始化日志
docker-compose logs -f teamcity
如果已有MySQL服务,配置会更简洁。这是我线上环境使用的精简版:
yaml复制version: '3.8'
services:
teamcity:
image: jetbrains/teamcity-server:2023.05.2
volumes:
- /mnt/nas/teamcity:/data/teamcity_server/datadir
ports:
- "8111:8111"
environment:
TEAMCITY_DB_USER: prod_teamcity
TEAMCITY_DB_PASSWORD: ${DB_PASSWORD} # 从.env文件读取
TEAMCITY_DB_HOST: 192.168.1.100
TEAMCITY_DB_PORT: 3306
注意几个踩坑点:
服务启动后访问http://localhost:8111,会经历几个关键步骤:
对于MySQL连接,常见报错解决方案:
初始化最后一步会要求创建超级管理员。这里有个隐藏技巧:如果勾选"Allow creating project when login",后续可以用该账号直接创建项目,省去额外授权步骤。
重要安全建议:
上周我们有个实习生误删了管理员账号,用这个方法成功恢复:
bash复制# 查找超级用户token
docker exec jetbrains-teamcity grep "Super user authentication token" /opt/teamcity/logs/teamcity-server.log
# 输出示例:
# [2023-07-15 12:00:00] Super user authentication token: 123456789 (use empty username...)
使用步骤:
这是我们正在用的备份方案,通过crontab每天凌晨执行:
bash复制# 备份数据库
docker exec teamcity-mysql mysqldump -u teamcity -ptc_password teamcity > /backups/teamcity_db_$(date +%F).sql
# 备份配置数据
tar czf /backups/teamcity_data_$(date +%F).tgz /var/lib/docker/volumes/teamcity_data
关键恢复测试:
默认配置只包含一个agent,这是我们扩展多个agent的配置片段:
yaml复制teamcity-agent1:
image: jetbrains/teamcity-agent:2023.05.2
environment:
SERVER_URL: http://teamcity:8111
volumes:
- /var/run/docker.sock:/var/run/docker.sock
teamcity-agent2:
image: jetbrains/teamcity-agent:2023.05.2
environment:
SERVER_URL: http://teamcity:8111
deploy:
resources:
limits:
cpus: '2'
memory: 4G
性能调优经验:
最近在Java项目中发现一个典型问题:Maven构建时内存溢出。解决方法是在agent环境变量中添加:
bash复制MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512m"