一、问题
我们平时开发项目,使用Maven或者Idea部署,尽可能是要做到自动化。一般情况下,做成自动化的方式有多种,下面简述我比较常用的3种。
二、解决方案一:
(1)配置发部:使用IDEA自带的Artifacts功能,先打开【File】菜单下的【Project Structure】菜单,点到【Artifacts】,按自己的项目类型添加一个类别,比如SpringBoot项目,可以添加为【JavaEE Application Exploded】项,起个名称,然后在要发部的右侧的【Available Element】列表列出的微服务或者主模块上,右击选择【Put Into Output Root】,然后点击【Apply】并点击【OK】保存。
(2)执行发部:配置完后,执行IDEA主菜单顶部的【Build】-【Build Artifacts...】-【Rebuild All】,编译完成后,将自动发部到项目根目录下的out/artifacts/xxx目录下。
(3)发部运行:发部运行的方式,有很多种,比如最简单的方法之一是,使用IDEA自带的【Tools】-【Deployment】-【Deployment】中配置远程FTP服务器,或者配置SSH连接,用于一键发部文件到生产环境上指定目录下。然后配置一个Dockerfile和一个start.sh角本,并通过"docker build -t myapp:v1 ."命令事先部署部署一个DockerSwarm或者Docker程序。把程序文件映射到远程服务器的物理磁盘上。然后通过前面的IDEA的配置配置到FTP该目录。这样就可以一键自动发部项目了。缺点是一般IDEA的配置不会提交到GIT里,所以如果有同事需要发部,还得使用你的电脑,或者他自己电脑上也做相同的配置,来发部项目。
FROM openjdk:8-jre
MAINTAINER songxingzhu
WORKDIR /app
ADD ./ /app/
ENV JAVA_OPTS "-Xms400m -Xmx3g"
ENV spring.profiles.active test
ENV file.encoding UTF-8
EXPOSE 8081
RUN chmod 777 /app/start.sh
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
ENTRYPOINT ["/app/start.sh"]
二、解决方案二:
(1)配置发部:在要发部的模块的pom.xml中,添加下列代码:
<build> <finalName>service-webapi</finalName> <sourceDirectory>src/main/java</sourceDirectory> <resources> <!-- 控制资源文件的拷贝 --> <resource> <directory>src/main/resources</directory> <targetPath>${project.build.directory}</targetPath> </resource> </resources> <plugins> <!-- 设置源文件编码方式 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.dcits.webapi.WebApiApplication</mainClass> </manifest> </archive> </configuration> </plugin> <!-- 拷贝依赖的jar包到lib目录 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!-- ${project.build.directory}是maven变量,内置的,表示target目录,如果不写,将在跟目录下创建/lib --> <outputDirectory>${project.build.directory}/lib</outputDirectory> <!-- excludeTransitive:是否不包含间接依赖包,比如我们依赖A,但是A又依赖了B,我们是否也要把B打进去 默认打进去--> <excludeTransitive>false</excludeTransitive> <!-- 复制的jar文件去掉版本信息 --> <stripVersion>false</stripVersion> </configuration> </execution> </executions> </plugin> <!-- 解决资源文件的编码问题 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.3</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- 打包source文件为jar文件 --> <plugin> <artifactId>maven-source-plugin</artifactId> <version>2.1</version> <configuration> <attach>true</attach> <encoding>UTF-8</encoding> </configuration> <executions> <execution> <phase>compile</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
(2)执行发部:在项目目录下,执行 mvn package 即可,编译完后,代码会出现在相应的模块的/target/目录下 。如果要跳过测试,可以在父模块或者相应的模块的pom.xml中,添加下列内容,即可实现:
<!--编译插件--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> <skip>true</skip> </configuration> </plugin> <!--跳过测试--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skipTests>true</skipTests> </configuration> </plugin>
(3)发部运行:同上。
三、解决方案三:
方案三,使用Gitlab的CICD(需要Gitlab安装gitlab-runner)或者使用Jenkins,结合Docker来做。因为平时做的最多客户一般都不太愿意提供服务器部署Kubernetes,所以我一般会用Docker Swarm来做,简单方便又轻量级。使用CICD的DevOps模式比较推荐,团队每个人只要Merge一下代码到指定分支,即可完成自动化编译、测试、发部部署,因为也不复杂,我这里时间紧张就不描述了。
四、解决方案四:
方案四,配置IDEA+Docker实现。在IDEA中默认安装了Docker插件,因此可以直接在Dockerfile执行运行,并配置一下Dockerfile的镜像编译命令和远程Docker中开启远程访问即可。