一、問題
我們平時開發項目,使用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>
<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.test.webapi.WebApiApplication</mainClass>
</manifest>
</archive>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<excludes>
<exclude>*.properties</exclude>
<exclude>*.xml</exclude>
<exclude>*.sh</exclude>
</excludes>
</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>
<outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<!-- 解決資源檔案的編碼問題 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
(2)執行發部:在項目目錄下,執行 mvn package 即可,編譯完後,代碼會出現在相應的子產品的/target/classes目錄下(發部到此目錄的原因是,這樣就不會影響IDEA的正常使用) 。如果要跳過測試,可以在父子產品或者相應的子產品的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中開啟遠端通路即可。
宋興柱(Sindrol):轉載内容,請标明出處,謝謝!源文來自 寶貝雲知識分享:https://www.dearcloud.cn