DevOps-基于Walle的小型持续集成实战五基于Walle发布Java应用

32次阅读

共计 7880 个字符,预计需要花费 20 分钟才能阅读完成。

本章用于讲解如何在 walle 下构建和运行 JavaWeb。主要包含 SpringBoot,ScalaAkkaWeb 应用,以 Java -jar 和 Docker 运行两种方式(Tomcat 方式不讲,大家自行研究)

新建项目

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

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

分组 项目 参考 备注
基本配置 项目名称 dev- 我的 JavaDemo 项目 随便填写,名称不要太长(不好看),最好把环境卸载最前,例如 dev(开发环境)
基本配置 环境 开发环境 提前在环境管理配置好即可
基本配置 Git Repo git@gitlab.xxx.com:xxx/java-demo.git Git 仓库地址
目标集群 目标集群 192.168.0.122 提前配置服务器管理
目标集群 目标集群部署路径 /data/walle-build/java-demo 实际运行的环境
目标集群 目标集群部署仓库 /data/walle-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.walle.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.walle.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/walle-tool/node-v10.5.0-linux-x64/bin/node /usr/bin/node && ln -sf /data/walle-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/walle-build/
      - /data/walle-java/:/walle/walle-java/
      - /usr/local/maven3/:/usr/local/maven3/
      - /data/walle-run/:/data/walle-run/
      - /usr/bin/netstat:/usr/bin/netstat/
      - /root/.ssh:/root/.ssh/
      - /data/walle-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 在宿主机,保证能免密码登录各服务器即可

  • 否则在部署时候,无法连接需要部署的服务器

部署发布

部署管理 – 新建上线单

选择环境和分支即可,回到列表页,点击上线查看详情,再次点击详情页上线即可开始发布

正文完
 0