admin

docker-compose安装配置teamcity发布java服务和docker持续集成

admin 高可用/自动化 2024-11-13 48878浏览 0

1.什么是TeamCity?

TeamCity 是一款由 JetBrains 开发的强大的持续集成(Continuous Integration,CI)和持续部署(Continuous Deployment,CD)工具。它帮助开发团队自动化构建、测试和部署过程,以确保软件项目的质量和快速交付。

TeamCity 的主要特点和优势包括:

  1. 灵活的构建配置:TeamCity 支持多种构建工具(如 Maven、Gradle、npm、MSBuild 等),可轻松集成到现有的开发工具链中。它还提供了丰富的构建配置选项,允许您根据项目需求定制构建过程。

  2. 实时构建状态和反馈:TeamCity 提供了实时的构建状态和反馈,帮助您快速发现并解决潜在问题。此外,它还支持与多种通知渠道(如邮件、Slack、HipChat 等)集成,确保团队及时了解构建过程的情况。

  3. 分布式构建:TeamCity 支持分布式构建,允许您在多台构建代理上并行执行构建任务,以提高构建速度和效率。此外,它还可以根据负载和需求自动管理构建代理,确保资源的合理分配。

  4. 丰富的插件生态:TeamCity 拥有丰富的插件生态,可以与众多第三方工具和服务集成,如版本控制系统(如 Git、SVN、Mercurial 等)、问题跟踪系统(如 Jira、YouTrack 等)以及代码审查工具(如 Codecov、SonarQube 等)。

  5. 支持多种部署方式:TeamCity 支持多种部署方式,如自动部署到云服务(如 AWS、Google Cloud、Azure 等)、容器化部署(如 Docker、Kubernetes 等)以及传统的虚拟机部署。

  6. 高度可定制和扩展:TeamCity 提供了高度可定制的用户界面,允许您根据团队和项目需求调整界面布局。此外,它还提供了丰富的 API 和扩展点,方便您开发自定义插件和集成其他工具。

  7. 良好的安全性和权限管理:TeamCity 提供了一套完善的安全性和权限管理机制,支持用户认证、角色授权以及访问控制等功能,确保您的构建过程和敏感数据得到有效保护。

2.环境搭建

在折腾之前需要理解两个概念, teamCity 和teamAgent.

  • teamCity: 管理构建代码,构建步骤, 和调度构建的服务

  • teamAgent: 真正执行构建的服务, 接受teamAgent调度管理, 可以单独安装在服务器上, 如果要构建的任务很多,可以增加很多的teamAgent.


3.安装配置teamcity

   docker-compose安装配置teamcity

[root@192 opt]# cat teamcity-agent.yml

version: '3'
services:
  teamcity-server:
    container_name: teamcity-server
    image: swr.cn-east-2.myhuaweicloud.com/helowin/teamcity-server
    privileged: true
    ports:
      - "8111:8111"
    volumes:
      - /opt/teamcity/java-all:/data/teamcity_server/java-all
      - /opt/teamcity/data:/data/teamcity_server/datadir
      - /opt/teamcity/logs:/opt/teamcity/logs
    environment:
      - TEAMCITY_SERVER_MEM_OPTS=-Xmx4g -XX:MaxPermSize=270m -XX:ReservedCodeCacheSize=350m

启动teamcity服务器

docker-compose -f teamcity.yml up -d

浏览器访问:http://192.168.9.237:8443

安装使用默认数据库,所以直接下一步即可。

t1.jpg

T2.jpg


4.安装和配置teamcity-agent (安装再本机,和server再同一台服务器)

[root@192 opt]# cat teamcity-agent.yml 

version: '3'
services:
  teamcity-agent:
    container_name: teamcity-agent
    image: swr.cn-east-2.myhuaweicloud.com/helowin/teamcity-agent:2024.07.3-linux-sudo
    privileged: true
    environment:
      - SERVER_URL=http://192.168.9.237:8111
      - AGENT_NAME=my-agent
      - DOCKER_IN_DOCKER=start
    volumes:
      - /opt/teamcity/agent/conf:/data/teamcity_agent/conf
      - /opt/teamcity/java-all:/data/teamcity_server/java-all
      - /opt/teamcity/build-all:/data/teamcity_server/build-all
      #- /var/run/docker.sock:/var/run/docker.sock


启动teamcity-agent服务

docker-compose -f teamcity-agent.yml up -d


注意:此处如果需要用teamcity进行docker build操作 一定要使用带linux-sudo后缀的镜像并配置root权限 (privileged: true),一个小问题可能能折腾一下午,踩坑经验,务必重视。

添加teamcity-agent

agent.jpg


agent-r.jpg

到此安装完成!


5.maven打包jar包并发布到服务器

在新建项目前会添加一个针对此项目的代码库地址,此处用gitee,有自己的gitlab更好

image.png

新建项目名称:

image.png

构建java项目-使用maven打包,此处使用一个开源的java blog,作为测试,具体可以参考:

编译部署开源博客系统oneblog

image.png

image.png

打包为jar包以后上传到指定服务器

image.pngimage.png

image.png

目标服务器设置启动小脚本,先判断进程是否存在,如果存在先kill再启动。

[root@localhost java_dev]# cat start.sh 

#!/bin/sh
source /etc/profile
SERVER_NAME="blog-web"
count=$(ps -ef | grep ${SERVER_NAME} | grep -v grep | awk '{print $2}' | wc -l)
if [ $count -gt 0 ]; then
        ps -ef | grep ${SERVER_NAME} | grep -v grep | awk '{print $2}' | xargs kill -9 
fi
nohup java -jar /home/java_dev/blog-web.jar &>web.log &

当前页面点击run运行或者回到项目界面执行构建

image.png

image.png

image.png

6.docker方式发布部署

上面一种方式是通过直接运行jar包,下面通过docker将jar包镜像打包并运行。

第一步.设置gitlab地址和用户密码 ( 同上)

第二步.配置mavean打jar包            (同上)

第三步.上传jar包到指定服务器        (同上)

第四步.通过docker-compose打包镜像并启动:

image.png

进入目标服务器jar包上传目录,编写Dockerfile和docker-compose.yml文件


[root@localhost java-compose-build]# cat Dockerfile 

# 环境版本

FROM swr.cn-east-2.myhuaweicloud.com/helowin/jdk1.8
MAINTAINER 88fly@163.com
# JVM调优参数等额外参数
ENV PARAMS ""
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 指定容器端口
EXPOSE 8443
# 添加本地 JAR 到容器内
ADD blog-web.jar app.jar
# 容器启动后执行的命令
ENTRYPOINT ["java", "-jar","app.jar" , "-Djava.security.egd=file:/dev/./urandom","$PARAMS"]


image.png

[root@localhost java-compose-build]# cat docker-compose.yml 

version: '3'
services:
  blog-web:
    image: swr.cn-east-2.myhuaweicloud.com/helowin/jdk1.8
    privileged: true
    build: ./
    image: blog-jar:latest
    restart: always
    container_name: blog-web
    hostname: blog-web
    volumes:
      - /home/java-compose-build/logs:/var/tmp/oneblog
    ports:
      - 8443:8443

image.png

image.png

7.用teamctiy进行docker构建

如上是通过docker-compose命令进行构建镜像,teamcity也可以直接构建docker镜像,选中dockerfile文件(此文件可以直接放置在版本库里面,拉下后maven打包后执行docker build操作)

docker-build.jpg因为我这里用的是docker方式部署,所以docker build 后,会在teamcity-agent的docker容器内再生成一个blog-web镜像,就需要使用docker push上传到镜像仓库,再目标服务器执行下拉和运行操作,每一次构建都上传镜像,资源浪费,没有直接使用docker-compose更简洁高效,此处不在演示。如果只有一台服务器,快速构建就可以尝试更多方式。

image.png

补充:maven setting文件自定义

MVN-S.jpg

触发器

image.png

需要注意的是当一个 build 配置有多个 VCS root 时,并不会为每个 VCS root 的变化触发 build,而是在检测过所有的 VCS root 后才决定是否触发一次 build。
您还可以设置每个 checkin 都触发一次 build。这需要选择"Trigger a build on each check-in"。如果您希望同一个提交者的多次提交只触发一次 build,请把"Include seral check-ins in a build if they are from the same committer"也选上。

静默期(Quiet Period)是个比较有趣的概念。设置后便不会在连续的几次 checkin 过程中触发 build (这几次连续的checkin是一个完整的过程)。通俗点讲,当检测到最后一次变更后的一段时间(默认一分钟)内没有发现新的变更才触发一次 build。

image.png

Schedule 触发器,当我们要定时触发 build 时就需要用到 Schedule 触发器

image.png

当我们希望在 TeamCity 上 build 某个个人分支时就需要通过某个分支上的变更来触发 build。Branch Remote Run 触发器可以实现这样的功能:

我们可以指定某个用户的分支。注意,这种触发器目前只支持 git 和 mercurial。



版权声明

本站《作品展示》类文章均为原创,转载必须注明出处,技术分享类文章部分来源于网络,版权归原作者所有,若侵权请留言。