DevOps 基於Walle的小型持續集成實戰(五)基於Walle發佈Java應用

本章用於講解如何在walle下構建和運行JavaWeb。主要包含SpringBoot,ScalaAkkaWeb應用,以Java -jar和Docker運行兩種方式(Tomcat方式不講,大家自行研究)

新建項目

項目中心 > 項目管理 > 新建項目

以下是一份配置好的項目表

分組 項目 參考 備註
基本配置 項目名稱 dev-我的JavaDemo項目 隨便填寫,名稱不要太長(不好看),最好把環境卸載最前,例如dev(開發環境)
基本配置 環境 開發環境 提前在環境管理配置好即可
基本配置 Git Repo [email protected]:xxx/java-demo.git Git倉庫地址
目標集羣 目標集羣 192.168.0.122 提前配置服務器管理
目標集羣 目標集羣部署路徑 /data/walle-build/java-demo 實際運行的環境
目標集羣 目標集羣部署倉庫 /data/skong-run 會存放多個版本編譯後的項目
目標集羣 目標集羣部署倉庫版本保留數 5 可以回滾的版本數

配置腳本

Java生態下基本腳本大致一致,無細微差別

基本腳本

任務配置 - 部署包含文件

包含方式

docker-compose.yml
target/${SERVER_NAME}.jar

該方式用於描述從源碼包到發佈包中,排除/包含的內容。一般java使用target即可

任務配置 - 自定義全局變量
# 運行目錄
JAVA_HOME=/data/walle-java
RUN_ROOT=/data/walle-run
SERVER_NAME=java-demo
MVN_HOME=/usr/local/maven3
PORT=2223

【SpringBoot to Docker】

任務配置 - 高級任務-Deploy前置任務
pwd
/usr/local/maven3//bin/mvn -v
任務配置 - 高級任務-Deploy後置任務
${MVN_HOME}/bin/mvn clean compile package -Dmaven.test.skip=true -DartifactId=${SERVER_NAME}
# cp target/${SERVER_NAME}.jar .
sed -i 's/${container_port}/'${PORT}'/g' docker-compose.yml 
sed -i 's/${container_name}/'${SERVER_NAME}'/g' docker-compose.yml 
任務配置 - 高級任務-Release前置任務
docker-compose -p ${SERVER_NAME}  -f ${WEBROOT}/docker-compose.yml down || echo "服務不存在"
docker stop ${SERVER_NAME} || echo "服務不存在"
docker rm ${SERVER_NAME} || echo "服務不存在"
rm -rf ${WEBROOT}
任務配置 - 高級任務-Release後置任務
docker-compose -p ${SERVER_NAME}  up -d
echo "服務啓動完成"
項目 - Maven pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
         
    <build>
        <finalName>${artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.skong.main.DevelopToolApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <includeScope>system</includeScope>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  • 此處配置了finalName=${artifactId},用於可自定義生成的包名稱
  • 此處使用了org.springframework.boot進行打包,mainClass設置執行的main方法
項目 - docker-compose.yml配置
version: '2'
services:
  web:
    # 鏡像:版本
    image: openjdk:8-jdk
    container_name: ${container_name}
    ports:
      - "${container_port}:${container_port}"
    volumes:
         - ./target/${container_name}.jar:/usr/local/${container_name}.jar
         - /etc/localtime:/etc/localtime
    command: /bin/bash -c "echo "Asia/Shanghai" > /etc/timezone && java -Dserver.port=${container_port} -jar /usr/local/${container_name}.jar"
  • 映射宿主機./target下的文件${container_name}.jar,到/usr/local/${container_name}.jar
  • 映射宿主機的時區到容器
  • 啓動命令設置時區到上海,隨後調用啓動參數java -jar,此處可以設置更多的啓動參數
  • 此處的參數傳遞方式較差(linux變量替換),可以尋求更好的參數傳遞方式

【ScalaAkka to Docker】

任務配置 - 高級任務-Deploy前置任務
pwd
/usr/local/maven3//bin/mvn -v
任務配置 - 高級任務-Deploy後置任務
${MVN_HOME}/bin/mvn clean scala:compile compile package -Dmaven.test.skip=true -DartifactId=${SERVER_NAME}
# cp target/${SERVER_NAME}.jar .
sed -i 's/${container_host}/'${HOST}'/g' docker-compose.yml 
sed -i 's/${container_port}/'${PORT}'/g' docker-compose.yml 
sed -i 's/${container_name}/'${SERVER_NAME}'/g' docker-compose.yml 
任務配置 - 高級任務-Release前置任務
docker-compose -p ${SERVER_NAME}  -f ${WEBROOT}/docker-compose.yml down || echo "服務不存在"
docker stop ${SERVER_NAME} || echo "服務不存在"
docker rm ${SERVER_NAME} || echo "服務不存在"
rm -rf ${WEBROOT}
任務配置 - 高級任務-Release後置任務
docker-compose -p ${SERVER_NAME}  up -d
echo "服務啓動完成"
項目 - Maven pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
         
    <build>
        <finalName>${artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.skong.main.DevelopToolApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <shadedArtifactAttached>true</shadedArtifactAttached>
                            <shadedClassifierName>allinone</shadedClassifierName>
                            <artifactSet>
                                <includes>
                                    <include>*:*</include>
                                </includes>
                            </artifactSet>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>reference.conf</resource>
                                </transformer>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <manifestEntries>
                                        <Main-Class>com.main.Boot</Main-Class>
                                    </manifestEntries>
                                </transformer>
                            </transformers>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <includeScope>system</includeScope>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

如爲SpringBoot混合編譯,則單獨加上scala編譯即可

<plugin>
                <groupId>org.scala-tools</groupId>
                <artifactId>maven-scala-plugin</artifactId>
                <version>2.15.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
  • 此處配置了finalName=${artifactId},用於可自定義生成的包名稱
  • 此處使用了org.springframework.boot進行打包,mainClass設置執行的main方法
項目 - docker-compose.yml配置
version: '2'
services:
  web:
    # 鏡像:版本
    image: openjdk:8-jdk
    container_name: ${container_name}
    ports:
      - "${container_port}:${container_port}"
    volumes:
         - ./target/${container_name}.jar:/usr/local/${container_name}.jar
         - /etc/localtime:/etc/localtime
    command: /bin/bash -c "echo "Asia/Shanghai" > /etc/timezone && java -Dserver.port=${container_port} -jar /usr/local/${container_name}.jar"
  • 映射宿主機./target下的文件${container_name}.jar,到/usr/local/${container_name}.jar
  • 映射宿主機的時區到容器
  • 啓動命令設置時區到上海,隨後調用啓動參數java -jar,此處可以設置更多的啓動參數
  • 此處的參數傳遞方式較差(linux變量替換),可以尋求更好的參數傳遞方式

【SpringBoot to Jar】

任務配置 - 高級任務-Deploy前置任務
pwd
/usr/local/maven3//bin/mvn -v
任務配置 - 高級任務-Deploy後置任務
${MVN_HOME}/bin/mvn clean scala:compile compile package -Dmaven.test.skip=true -DartifactId=${SERVER_NAME}
# cp target/${SERVER_NAME}.jar .
任務配置 - 高級任務-Release前置任務
curl -X POST 127.0.0.1:${PORT}/shutdown || echo "服務不存在"
rm -rf ${WEBROOT}
任務配置 - 高級任務-Release後置任務
java -Dserver.port=${PORT} -jar
echo "服務啓動完成"

其他

上線通知

需要的話開啓

上線單是否開啓審覈

需要的話開啓,會在審覈後才能實際發佈構建單

環境準備

研發環境

上訴內容完成後,是無法進行構建發版的。編譯發版都是基於walle的docker容器,python下完成的。該環境下無java和maven變量

我們有兩個方式解決 宿主機映射 or 重新打包鏡像

此處只講解宿主機映射的方式(更推薦重新打包鏡像)

我們在宿主機安裝完成maven,java,node等環境,然後修改walle的docker-compose即可

# docker version:  18.06.0+
# docker-compose version: 1.23.2+
# OpenSSL version: OpenSSL 1.1.0h
version: "3.7"
services:
  python:
    image: alenx/walle-python:2.1
    container_name: walle-python
    hostname: walle-python
    env_file:
      # walle.env需和docker-compose在同級目錄
      - ./walle.env
    command: bash -c "ln -sf /data/skong-tool/node-v10.5.0-linux-x64/bin/node /usr/bin/node && ln -sf /data/skong-tool/node-v10.5.0-linux-x64/bin/npm /usr/bin/npm &&  cd /opt/walle_home/ && /bin/bash admin.sh migration &&  python waller.py "
    expose:
      - "5000"
    volumes:
      - /opt/walle_home/plugins/:/opt/walle_home/plugins/
      - /opt/walle_home/codebase/:/opt/walle_home/codebase/
      - /opt/walle_home/logs/:/opt/walle_home/logs/
      - /data/walle-build/:/walle/skong-build/
      - /data/walle-java/:/walle/skong-java/
      - /usr/local/maven3/:/usr/local/maven3/
      - /data/walle-run/:/data/walle-run/
      - /usr/bin/netstat:/usr/bin/netstat/
      - /root/.ssh:/root/.ssh/
      - /data/skong-tool/node-v10.5.0-linux-x64/:/data/walle-tool/node-v10.5.0-linux-x64/

進入從宿主機進入python,查看mvn,java,linux是否可用

服務連接

連接git

配置git ssh在宿主機(docker-compose-python,映射了ssh目錄),保證能免密碼拉去代碼即可

  • 否則在部署時候,獲取不到git版本,無法拉去代碼
連接服務器

配置服務器的 ssh在宿主機,保證能免密碼登錄各服務器即可

  • 否則在部署時候,無法連接需要部署的服務器

部署發佈

部署管理 - 新建上線單

選擇環境和分支即可,回到列表頁,點擊上線查看詳情,再次點擊詳情頁上線即可開始發佈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章