Merge pull request #6023 from xiangfangyang-tech/main-v4.3
chore(autotest): add mysql&pgsql&http test flow in git_action flow
This commit is contained in:
commit
2a3d1fcb78
|
@ -0,0 +1,99 @@
|
|||
version: '3.9'
|
||||
|
||||
services:
|
||||
haproxy:
|
||||
container_name: haproxy
|
||||
image: haproxy:2.3
|
||||
depends_on:
|
||||
- emqx1
|
||||
- emqx2
|
||||
volumes:
|
||||
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
|
||||
- ../../etc/certs:/usr/local/etc/haproxy/certs
|
||||
ports:
|
||||
- "18083:18083"
|
||||
# - "1883:1883"
|
||||
# - "8883:8883"
|
||||
# - "8083:8083"
|
||||
# - "5683:5683/udp"
|
||||
# - "9999:9999"
|
||||
# - "8084:8084"
|
||||
networks:
|
||||
- emqx_bridge
|
||||
working_dir: /usr/local/etc/haproxy
|
||||
command:
|
||||
- bash
|
||||
- -c
|
||||
- |
|
||||
cat /usr/local/etc/haproxy/certs/cert.pem /usr/local/etc/haproxy/certs/key.pem > /usr/local/etc/haproxy/certs/emqx.pem
|
||||
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
|
||||
|
||||
emqx1:
|
||||
restart: always
|
||||
container_name: node1.emqx.io
|
||||
image: $TARGET:$EMQX_TAG
|
||||
env_file:
|
||||
- conf.cluster.env
|
||||
volumes:
|
||||
- etc:/opt/emqx/etc
|
||||
environment:
|
||||
- "EMQX_HOST=node1.emqx.io"
|
||||
ports:
|
||||
- "11881:18083"
|
||||
# - "1883:1883"
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- |
|
||||
sed -i "s 127.0.0.1 $$(ip route show |grep "link" |awk '{print $$1}') g" /opt/emqx/etc/acl.conf
|
||||
sed -i '/emqx_telemetry/d' /opt/emqx/data/loaded_plugins
|
||||
/opt/emqx/bin/emqx foreground
|
||||
healthcheck:
|
||||
test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
|
||||
interval: 5s
|
||||
timeout: 25s
|
||||
retries: 5
|
||||
networks:
|
||||
emqx_bridge:
|
||||
aliases:
|
||||
- node1.emqx.io
|
||||
|
||||
emqx2:
|
||||
restart: always
|
||||
container_name: node2.emqx.io
|
||||
image: $TARGET:$EMQX_TAG
|
||||
env_file:
|
||||
- conf.cluster.env
|
||||
volumes:
|
||||
- etc:/opt/emqx/etc
|
||||
environment:
|
||||
- "EMQX_HOST=node2.emqx.io"
|
||||
ports:
|
||||
- "11882:18083"
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- |
|
||||
sed -i "s 127.0.0.1 $$(ip route show |grep "link" |awk '{print $$1}') g" /opt/emqx/etc/acl.conf
|
||||
sed -i '/emqx_telemetry/d' /opt/emqx/data/loaded_plugins
|
||||
/opt/emqx/bin/emqx foreground
|
||||
healthcheck:
|
||||
test: ["CMD", "/opt/emqx/bin/emqx", "ping"]
|
||||
interval: 5s
|
||||
timeout: 25s
|
||||
retries: 5
|
||||
networks:
|
||||
emqx_bridge:
|
||||
aliases:
|
||||
- node2.emqx.io
|
||||
volumes:
|
||||
etc:
|
||||
networks:
|
||||
emqx_bridge:
|
||||
driver: bridge
|
||||
name: emqx_bridge
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 172.100.239.0/24
|
||||
gateway: 172.100.239.1
|
|
@ -27,6 +27,7 @@ services:
|
|||
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
|
||||
|
||||
emqx1:
|
||||
restart: always
|
||||
container_name: node1.emqx.io
|
||||
image: $TARGET:$EMQX_TAG
|
||||
env_file:
|
||||
|
@ -51,6 +52,7 @@ services:
|
|||
- node1.emqx.io
|
||||
|
||||
emqx2:
|
||||
restart: always
|
||||
container_name: node2.emqx.io
|
||||
image: $TARGET:$EMQX_TAG
|
||||
env_file:
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
version: '3.9'
|
||||
|
||||
services:
|
||||
web_server:
|
||||
container_name: Tomcat
|
||||
build:
|
||||
context: ./http-service
|
||||
image: web-server
|
||||
networks:
|
||||
- emqx_bridge
|
|
@ -0,0 +1,15 @@
|
|||
FROM tomcat:10.0.5
|
||||
|
||||
RUN wget https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip \
|
||||
&& unzip apache-maven-3.6.3-bin.zip \
|
||||
&& mv apache-maven-3.6.3 /opt/apache-maven-3.6.3/ \
|
||||
&& ln -s /opt/apache-maven-3.6.3/ /opt/maven
|
||||
ENV M2_HOME=/opt/maven
|
||||
ENV M2=$M2_HOME/bin
|
||||
ENV PATH=$M2:$PATH
|
||||
COPY ./web-server /code
|
||||
WORKDIR /code
|
||||
RUN mvn package -Dmaven.skip.test=true
|
||||
RUN mv ./target/emqx-web-0.0.1.war /usr/local/tomcat/webapps/emqx-web.war
|
||||
EXPOSE 8080
|
||||
CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
|
|
@ -0,0 +1,65 @@
|
|||
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>emqx-web</groupId>
|
||||
<artifactId>emqx-web</artifactId>
|
||||
<version>0.0.1</version>
|
||||
<packaging>war</packaging>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<version>8.0.16</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-dbutils</groupId>
|
||||
<artifactId>commons-dbutils</artifactId>
|
||||
<version>1.7</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-logging</groupId>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
<version>1.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-dbcp</groupId>
|
||||
<artifactId>commons-dbcp</artifactId>
|
||||
<version>1.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-pool</groupId>
|
||||
<artifactId>commons-pool</artifactId>
|
||||
<version>1.6</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jakarta.servlet</groupId>
|
||||
<artifactId>jakarta.servlet-api</artifactId>
|
||||
<version>5.0.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/reousrce</directory>
|
||||
<excludes>
|
||||
<exclude>**/*.java</exclude>
|
||||
</excludes>
|
||||
</resource>
|
||||
</resources>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.8.1</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-war-plugin</artifactId>
|
||||
<version>3.2.3</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
|
@ -0,0 +1,54 @@
|
|||
package com.emqx.dao;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.sql.SQLException;
|
||||
|
||||
import org.apache.commons.dbutils.QueryRunner;
|
||||
import org.apache.commons.dbutils.handlers.ScalarHandler;
|
||||
|
||||
import com.emqx.util.EmqxDatabaseUtil;
|
||||
|
||||
public class AuthDAO {
|
||||
|
||||
public String getUserName(String userName) throws IOException, SQLException {
|
||||
QueryRunner runner = new QueryRunner(EmqxDatabaseUtil.getDataSource());
|
||||
String sql = "select password from http_user where username='"+userName+"'";
|
||||
String password =runner.query(sql, new ScalarHandler<String>());
|
||||
return password;
|
||||
}
|
||||
|
||||
public String getClient(String clientid) throws IOException, SQLException {
|
||||
QueryRunner runner = new QueryRunner(EmqxDatabaseUtil.getDataSource());
|
||||
String sql = "select password from http_user where clientid='"+clientid+"'";
|
||||
String password =runner.query(sql, new ScalarHandler<String>());
|
||||
return password;
|
||||
}
|
||||
|
||||
public String getUserAccess(String userName) throws IOException, SQLException {
|
||||
QueryRunner runner = new QueryRunner(EmqxDatabaseUtil.getDataSource());
|
||||
String sql = "select access from http_acl where username='"+userName+"'";
|
||||
String access =runner.query(sql, new ScalarHandler<String>());
|
||||
return access;
|
||||
}
|
||||
|
||||
public String getUserTopic(String userName) throws IOException, SQLException {
|
||||
QueryRunner runner = new QueryRunner(EmqxDatabaseUtil.getDataSource());
|
||||
String sql = "select topic from http_acl where username='"+userName+"'";
|
||||
String topic =runner.query(sql, new ScalarHandler<String>());
|
||||
return topic;
|
||||
}
|
||||
|
||||
public String getClientAccess(String clientid) throws IOException, SQLException {
|
||||
QueryRunner runner = new QueryRunner(EmqxDatabaseUtil.getDataSource());
|
||||
String sql = "select access from http_acl where clientid='"+clientid+"'";
|
||||
String access =runner.query(sql, new ScalarHandler<String>());
|
||||
return access;
|
||||
}
|
||||
|
||||
public String getClientTopic(String clientid) throws IOException, SQLException {
|
||||
QueryRunner runner = new QueryRunner(EmqxDatabaseUtil.getDataSource());
|
||||
String sql = "select topic from http_acl where clientid='"+clientid+"'";
|
||||
String topic =runner.query(sql, new ScalarHandler<String>());
|
||||
return topic;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
package com.emqx.dao;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.apache.commons.dbcp.BasicDataSource;
|
||||
import org.apache.commons.dbutils.QueryRunner;
|
||||
import org.apache.commons.dbutils.handlers.ColumnListHandler;
|
||||
import org.apache.commons.dbutils.handlers.ScalarHandler;
|
||||
import org.apache.commons.dbutils.handlers.columns.StringColumnHandler;
|
||||
|
||||
|
||||
public class DBUtilsTest {
|
||||
|
||||
public static void main(String args[]) throws FileNotFoundException, IOException, SQLException {
|
||||
Properties property = new Properties();//流文件
|
||||
|
||||
property.load(DBUtilsTest.class.getClassLoader().getResourceAsStream("database.properties"));
|
||||
|
||||
BasicDataSource dataSource = new BasicDataSource();
|
||||
dataSource.setDriverClassName(property.getProperty("jdbc.driver"));
|
||||
dataSource.setUrl(property.getProperty("jdbc.url"));
|
||||
dataSource.setUsername(property.getProperty("jdbc.username"));
|
||||
dataSource.setPassword(property.getProperty("jdbc.password"));
|
||||
|
||||
// 初始化连接数 if(initialSize!=null)
|
||||
//dataSource.setInitialSize(Integer.parseInt(initialSize));
|
||||
|
||||
// 最小空闲连接 if(minIdle!=null)
|
||||
//dataSource.setMinIdle(Integer.parseInt(minIdle));
|
||||
|
||||
// 最大空闲连接 if(maxIdle!=null)
|
||||
//dataSource.setMaxIdle(Integer.parseInt(maxIdle));
|
||||
|
||||
QueryRunner runner = new QueryRunner(dataSource);
|
||||
String sql="select username from mqtt_user where id=1";
|
||||
String result = runner.query(sql, new ScalarHandler<String>());
|
||||
|
||||
System.out.println(result);
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,103 @@
|
|||
package com.emqx.servlet;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.sql.SQLException;
|
||||
|
||||
import com.emqx.dao.AuthDAO;
|
||||
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.http.HttpServlet;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
|
||||
public class AclServlet extends HttpServlet {
|
||||
|
||||
@Override
|
||||
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||
// TODO Auto-generated method stub
|
||||
doPost(req, resp);
|
||||
}
|
||||
@Override
|
||||
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||
String clientid = req.getParameter("clientid");
|
||||
String username = req.getParameter("username");
|
||||
String access = req.getParameter("access");
|
||||
String topic = req.getParameter("topic");
|
||||
//String password = req.getParameter("password");
|
||||
|
||||
//step0: password is not null, or not pass.
|
||||
|
||||
AuthDAO dao = new AuthDAO();
|
||||
try {
|
||||
//step1: check username access&topic
|
||||
if(username != null) {
|
||||
String access_1 = dao.getUserAccess(username);
|
||||
String topic_1 = dao.getUserTopic(username);
|
||||
|
||||
if(access.equals(access_1)) {
|
||||
if(topic.equals(topic_1)) {
|
||||
resp.setStatus(200);
|
||||
}
|
||||
else {
|
||||
if(clientid != null){
|
||||
String access_2 = dao.getClientAccess(clientid);
|
||||
String topic_2 = dao.getClientTopic(clientid);
|
||||
if(access.equals(access_2)) {
|
||||
if(topic.equals(topic_2)) {
|
||||
resp.setStatus(200);
|
||||
}
|
||||
else {
|
||||
resp.setStatus(400);
|
||||
}
|
||||
}else {
|
||||
resp.setStatus(400);
|
||||
}
|
||||
}else {
|
||||
resp.setStatus(400);
|
||||
}
|
||||
}
|
||||
}else {//step2.1: username password is not match, then check clientid password
|
||||
if(clientid != null){
|
||||
String access_3 = dao.getClientAccess(clientid);
|
||||
String topic_3 = dao.getClientTopic(clientid);
|
||||
if(access.equals(access_3)) {
|
||||
if(topic.equals(topic_3)) {
|
||||
resp.setStatus(200);
|
||||
}
|
||||
else {
|
||||
resp.setStatus(400);
|
||||
}
|
||||
}else {
|
||||
resp.setStatus(400);
|
||||
}
|
||||
}else {
|
||||
resp.setStatus(400);
|
||||
}
|
||||
}
|
||||
}else {//step2.2: username is null, then check clientid password
|
||||
if(clientid != null){
|
||||
String access_4 = dao.getClientAccess(clientid);
|
||||
String topic_4 = dao.getClientTopic(clientid);
|
||||
if(access.equals(access_4)) {
|
||||
if(topic.equals(topic_4)) {
|
||||
resp.setStatus(200);
|
||||
}
|
||||
else {
|
||||
resp.setStatus(400);
|
||||
}
|
||||
}else {
|
||||
resp.setStatus(400);
|
||||
}
|
||||
}else {
|
||||
resp.setStatus(400);
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
package com.emqx.servlet;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.sql.SQLException;
|
||||
|
||||
import com.emqx.dao.AuthDAO;
|
||||
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.http.HttpServlet;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
|
||||
public class AuthServlet extends HttpServlet {
|
||||
|
||||
@Override
|
||||
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||
// TODO Auto-generated method stub
|
||||
doPost(req, resp);
|
||||
}
|
||||
@Override
|
||||
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||
String clientid = req.getParameter("clientid");
|
||||
String username =req.getParameter("username");
|
||||
String password = req.getParameter("password");
|
||||
|
||||
//step0: password is not null, or not pass.
|
||||
if(password == null) {
|
||||
resp.setStatus(400);
|
||||
return;
|
||||
}
|
||||
AuthDAO dao = new AuthDAO();
|
||||
try {
|
||||
//step1: check username password
|
||||
if(username != null) {
|
||||
String password_d = dao.getUserName(username);
|
||||
|
||||
if(password.equals(password_d)) {
|
||||
resp.setStatus(200);
|
||||
//200
|
||||
}else {//step2.1: username password is not match, then check clientid password
|
||||
if(clientid != null){
|
||||
String password_c = dao.getClient(clientid);
|
||||
if(password.equals(password_c)) {
|
||||
resp.setStatus(200);
|
||||
}else {
|
||||
resp.setStatus(400);
|
||||
}
|
||||
}else {
|
||||
resp.setStatus(400);
|
||||
}
|
||||
}
|
||||
}else {//step2.2: username is null, then check clientid password
|
||||
if(clientid != null){
|
||||
String password_c = dao.getClient(clientid);
|
||||
if(password.equals(password_c)) {
|
||||
resp.setStatus(200);
|
||||
}else {
|
||||
resp.setStatus(400);
|
||||
}
|
||||
}else {
|
||||
resp.setStatus(400);
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
package com.emqx.util;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.apache.commons.dbcp.BasicDataSource;
|
||||
|
||||
import com.emqx.dao.DBUtilsTest;
|
||||
|
||||
public class EmqxDatabaseUtil {
|
||||
|
||||
public static DataSource getDataSource() throws IOException {
|
||||
Properties property = new Properties();// 流文件
|
||||
|
||||
property.load(EmqxDatabaseUtil.class.getClassLoader().getResourceAsStream("database.properties"));
|
||||
|
||||
BasicDataSource dataSource = new BasicDataSource();
|
||||
dataSource.setDriverClassName(property.getProperty("jdbc.driver"));
|
||||
dataSource.setUrl(property.getProperty("jdbc.url"));
|
||||
dataSource.setUsername(property.getProperty("jdbc.username"));
|
||||
dataSource.setPassword(property.getProperty("jdbc.password"));
|
||||
|
||||
return dataSource;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
jdbc.driver= com.mysql.jdbc.Driver
|
||||
jdbc.url= jdbc:mysql://mysql_server:3306/mqtt
|
||||
jdbc.username= root
|
||||
jdbc.password= public
|
|
@ -0,0 +1,3 @@
|
|||
Manifest-Version: 1.0
|
||||
Class-Path:
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://JAVA.sun.com/xml/ns/javaee"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
|
||||
id="WebApp_ID" version="2.5">
|
||||
<display-name>emqx-web</display-name>
|
||||
<servlet>
|
||||
<servlet-name>Auth</servlet-name>
|
||||
<servlet-class>com.emqx.servlet.AuthServlet</servlet-class>
|
||||
</servlet>
|
||||
<servlet>
|
||||
<servlet-name>Acl</servlet-name>
|
||||
<servlet-class>com.emqx.servlet.AclServlet</servlet-class>
|
||||
</servlet>
|
||||
<servlet-mapping>
|
||||
<servlet-name>Auth</servlet-name>
|
||||
<url-pattern>/auth</url-pattern>
|
||||
</servlet-mapping>
|
||||
<servlet-mapping>
|
||||
<servlet-name>Acl</servlet-name>
|
||||
<url-pattern>/acl</url-pattern>
|
||||
</servlet-mapping>
|
||||
<welcome-file-list>
|
||||
<welcome-file>index.html</welcome-file>
|
||||
<welcome-file>index.htm</welcome-file>
|
||||
<welcome-file>index.jsp</welcome-file>
|
||||
<welcome-file>default.html</welcome-file>
|
||||
<welcome-file>default.htm</welcome-file>
|
||||
<welcome-file>default.jsp</welcome-file>
|
||||
</welcome-file-list>
|
||||
</web-app>
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>love</title>
|
||||
</head>
|
||||
<body>
|
||||
It's lucky, jiabanxiang.
|
||||
</body>
|
||||
</html>
|
|
@ -120,3 +120,302 @@ jobs:
|
|||
with:
|
||||
name: jmeter_logs
|
||||
path: ./jmeter_logs
|
||||
|
||||
mysql:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
mysql_tag:
|
||||
- 5.7
|
||||
- 8
|
||||
mysql_type:
|
||||
- mysql_auth_acl
|
||||
|
||||
needs: build
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/download-artifact@v2
|
||||
with:
|
||||
name: emqx-docker-image-zip
|
||||
path: /tmp
|
||||
- name: load docker image
|
||||
env:
|
||||
version: ${{ needs.build.outputs.version }}
|
||||
run: |
|
||||
unzip -q /tmp/emqx-docker-${version}.zip -d /tmp
|
||||
docker load < /tmp/emqx-docker-${version}
|
||||
- name: docker compose up
|
||||
timeout-minutes: 5
|
||||
env:
|
||||
TARGET: emqx/emqx
|
||||
EMQX_TAG: ${{ needs.build.outputs.version }}
|
||||
MYSQL_TAG: ${{ matrix.mysql_tag }}
|
||||
run: |
|
||||
docker-compose \
|
||||
-f .ci/docker-compose-file/docker-compose-emqx-cluster.yaml \
|
||||
-f .ci/docker-compose-file/docker-compose-mysql-tls.yaml \
|
||||
up -d --build
|
||||
- name: wait docker compose up
|
||||
timeout-minutes: 5
|
||||
run: |
|
||||
while [ "$(docker inspect -f '{{ .State.Health.Status}}' node1.emqx.io)" != "healthy" ] || [ "$(docker inspect -f '{{ .State.Health.Status}}' node2.emqx.io)" != "healthy" ]; do
|
||||
echo "['$(date -u +"%y-%m-%dt%h:%m:%sz")']:waiting emqx";
|
||||
sleep 5;
|
||||
done
|
||||
while [ $(docker ps -a --filter name=client --filter exited=0 | wc -l) \
|
||||
!= $(docker ps -a --filter name=client | wc -l) ]; do
|
||||
sleep 1
|
||||
done
|
||||
docker ps -a
|
||||
echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
|
||||
echo MYSQL_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql) >> $GITHUB_ENV
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
repository: emqx/emqx-fvt
|
||||
ref: integration_test_suites
|
||||
path: scripts
|
||||
- uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: '8.0.282' # The JDK version to make available on the path.
|
||||
java-package: jdk # (jre, jdk, or jdk+fx) - defaults to jdk
|
||||
architecture: x64 # (x64 or x86) - defaults to x64
|
||||
- name: install jmeter
|
||||
timeout-minutes: 10
|
||||
env:
|
||||
JMETER_VERSION: 5.3
|
||||
run: |
|
||||
wget --no-verbose --no-check-certificate -O /tmp/apache-jmeter.tgz https://downloads.apache.org/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
|
||||
cd /tmp && tar -xvf apache-jmeter.tgz
|
||||
echo "jmeter.save.saveservice.output_format=xml" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
|
||||
echo "jmeter.save.saveservice.response_data.on_error=true" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
|
||||
wget --no-verbose -O /tmp/apache-jmeter-$JMETER_VERSION/lib/ext/mqtt-xmeter-2.0.2-jar-with-dependencies.jar https://raw.githubusercontent.com/xmeter-net/mqtt-jmeter/master/Download/v2.0.2/mqtt-xmeter-2.0.2-jar-with-dependencies.jar
|
||||
ln -s /tmp/apache-jmeter-$JMETER_VERSION /opt/jmeter
|
||||
- name: install jmeter plugin
|
||||
run: |
|
||||
wget --no-verbose -O "/opt/jmeter/lib/mysql-connector-java-8.0.16.jar" https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.16/mysql-connector-java-8.0.16.jar
|
||||
- name: run jmeter
|
||||
run: |
|
||||
/opt/jmeter/bin/jmeter.sh \
|
||||
-Jjmeter.save.saveservice.output_format=xml -n \
|
||||
-t scripts/.ci/automate-test-suite/${{ matrix.mysql_type }}.jmx \
|
||||
-Droute="apps/emqx_auth_mysql/test/emqx_auth_mysql_SUITE_data" \
|
||||
-Dmysql_ip=$MYSQL_IP \
|
||||
-Demqx_ip=$HAPROXY_IP \
|
||||
-Ddbname="mqtt" \
|
||||
-Dmysql_user="ssluser" \
|
||||
-Ddb_user="root" \
|
||||
-Dmysql_pwd="public" \
|
||||
-Dconfig_path="/tmp/etc" \
|
||||
-Ddocker_path=".ci/docker-compose-file" \
|
||||
-l jmeter_logs/${{ matrix.mysql_type }}_${{ matrix.mysql_tag }}.jtl \
|
||||
-j jmeter_logs/logs/${{ matrix.mysql_type }}_${{ matrix.mysql_tag }}.log
|
||||
- name: check logs
|
||||
run: |
|
||||
if cat jmeter_logs/${{ matrix.mysql_type }}_${{ matrix.mysql_tag }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
|
||||
echo "check logs filed"
|
||||
exit 1
|
||||
fi
|
||||
- uses: actions/upload-artifact@v1
|
||||
if: always()
|
||||
with:
|
||||
name: jmeter_logs
|
||||
path: ./jmeter_logs
|
||||
|
||||
|
||||
postgresql:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
pgsql_type:
|
||||
- pgsql_auth_acl
|
||||
pgsql_tag:
|
||||
- 9
|
||||
- 10
|
||||
- 11
|
||||
- 12
|
||||
- 13
|
||||
|
||||
needs: build
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/download-artifact@v2
|
||||
with:
|
||||
name: emqx-docker-image-zip
|
||||
path: /tmp
|
||||
- name: load docker image
|
||||
env:
|
||||
version: ${{ needs.build.outputs.version }}
|
||||
run: |
|
||||
unzip -q /tmp/emqx-docker-${version}.zip -d /tmp
|
||||
docker load < /tmp/emqx-docker-${version}
|
||||
- name: docker compose up
|
||||
timeout-minutes: 5
|
||||
env:
|
||||
TARGET: emqx/emqx
|
||||
EMQX_TAG: ${{ needs.build.outputs.version }}
|
||||
PGSQL_TAG: ${{ matrix.pgsql_tag }}
|
||||
run: |
|
||||
docker-compose \
|
||||
-f .ci/docker-compose-file/docker-compose-emqx-broker-cluster.yaml \
|
||||
-f .ci/docker-compose-file/docker-compose-pgsql-tls.yaml \
|
||||
up -d --build
|
||||
- name: wait docker compose up
|
||||
timeout-minutes: 5
|
||||
run: |
|
||||
while [ "$(docker inspect -f '{{ .State.Health.Status}}' node1.emqx.io)" != "healthy" ] || [ "$(docker inspect -f '{{ .State.Health.Status}}' node2.emqx.io)" != "healthy" ]; do
|
||||
echo "['$(date -u +"%y-%m-%dt%h:%m:%sz")']:waiting emqx";
|
||||
sleep 5;
|
||||
done
|
||||
docker ps -a
|
||||
echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
|
||||
echo PGSQL_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' pgsql) >> $GITHUB_ENV
|
||||
echo CONFIG_PATH=$(docker inspect -f '{{ range .Mounts }}{{ if eq .Name "docker-compose-file_etc" }}{{ .Source }}{{ end }}{{ end }}' node1.emqx.io) >> $GITHUB_ENV
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
repository: emqx/emqx-fvt
|
||||
ref: integration_test_suites
|
||||
path: scripts
|
||||
- uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: '8.0.282' # The JDK version to make available on the path.
|
||||
java-package: jdk # (jre, jdk, or jdk+fx) - defaults to jdk
|
||||
architecture: x64 # (x64 or x86) - defaults to x64
|
||||
- name: install jmeter
|
||||
timeout-minutes: 10
|
||||
env:
|
||||
JMETER_VERSION: 5.3
|
||||
run: |
|
||||
wget --no-verbose --no-check-certificate -O /tmp/apache-jmeter.tgz https://downloads.apache.org/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
|
||||
cd /tmp && tar -xvf apache-jmeter.tgz
|
||||
echo "jmeter.save.saveservice.output_format=xml" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
|
||||
echo "jmeter.save.saveservice.response_data.on_error=true" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
|
||||
wget --no-verbose -O /tmp/apache-jmeter-$JMETER_VERSION/lib/ext/mqtt-xmeter-2.0.2-jar-with-dependencies.jar https://raw.githubusercontent.com/xmeter-net/mqtt-jmeter/master/Download/v2.0.2/mqtt-xmeter-2.0.2-jar-with-dependencies.jar
|
||||
ln -s /tmp/apache-jmeter-$JMETER_VERSION /opt/jmeter
|
||||
- name: install jmeter plugin
|
||||
run: |
|
||||
wget --no-verbose -O "/opt/jmeter/lib/postgresql-42.2.18.jar" https://repo1.maven.org/maven2/org/postgresql/postgresql/42.2.18/postgresql-42.2.18.jar
|
||||
- name: run jmeter
|
||||
run: |
|
||||
sudo /opt/jmeter/bin/jmeter.sh \
|
||||
-Jjmeter.save.saveservice.output_format=xml -n \
|
||||
-t scripts/.ci/automate-test-suite/${{ matrix.pgsql_type }}.jmx \
|
||||
-Droute="apps/emqx_auth_pgsql/test/emqx_auth_pgsql_SUITE_data" \
|
||||
-Dca_name="ca.pem" \
|
||||
-Dkey_name="client-key.pem" \
|
||||
-Dcert_name="client-cert.pem" \
|
||||
-Ddb_ip=$PGSQL_IP \
|
||||
-Dpgsql_ip=$PGSQL_IP \
|
||||
-Demqx_ip=$HAPROXY_IP \
|
||||
-Dpgsql_user="root" \
|
||||
-Dpgsql_pwd="public" \
|
||||
-Ddbname="mqtt" \
|
||||
-Dpgsql_db="mqtt" \
|
||||
-Dport="5432" \
|
||||
-Dconfig_path=$CONFIG_PATH \
|
||||
-Ddocker_path=".ci/docker-compose-file" \
|
||||
-l jmeter_logs/${{ matrix.pgsql_type }}_${{ matrix.pgsql_tag }}.jtl \
|
||||
-j jmeter_logs/logs/${{ matrix.pgsql_type }}_${{ matrix.pgsql_tag }}.log
|
||||
- name: check logs
|
||||
run: |
|
||||
if cat jmeter_logs/${{ matrix.pgsql_type }}_${{ matrix.pgsql_tag }}.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
|
||||
echo "check logs filed"
|
||||
exit 1
|
||||
fi
|
||||
- uses: actions/upload-artifact@v1
|
||||
if: always()
|
||||
with:
|
||||
name: jmeter_logs
|
||||
path: ./jmeter_logs
|
||||
|
||||
http:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
needs: build
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/download-artifact@v2
|
||||
with:
|
||||
name: emqx-docker-image-zip
|
||||
path: /tmp
|
||||
- name: load docker image
|
||||
env:
|
||||
version: ${{ needs.build.outputs.version }}
|
||||
run: |
|
||||
unzip -q /tmp/emqx-docker-${version}.zip -d /tmp
|
||||
docker load < /tmp/emqx-docker-${version}
|
||||
- name: docker compose up
|
||||
timeout-minutes: 5
|
||||
env:
|
||||
TARGET: emqx/emqx
|
||||
EMQX_TAG: ${{ needs.build.outputs.version }}
|
||||
MYSQL_TAG: 8
|
||||
run: |
|
||||
docker-compose \
|
||||
-f .ci/docker-compose-file/docker-compose-emqx-broker-cluster.yaml \
|
||||
-f .ci/docker-compose-file/docker-compose-mysql-tcp.yaml \
|
||||
-f .ci/docker-compose-file/docker-compose-enterprise-tomcat-tcp.yaml \
|
||||
up -d --build
|
||||
- name: wait docker compose up
|
||||
timeout-minutes: 5
|
||||
run: |
|
||||
while [ "$(docker inspect -f '{{ .State.Health.Status}}' node1.emqx.io)" != "healthy" ] || [ "$(docker inspect -f '{{ .State.Health.Status}}' node2.emqx.io)" != "healthy" ]; do
|
||||
echo "['$(date -u +"%y-%m-%dt%h:%m:%sz")']:waiting emqx";
|
||||
sleep 5;
|
||||
done
|
||||
docker ps -a
|
||||
echo HAPROXY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' haproxy) >> $GITHUB_ENV
|
||||
echo HTTP_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' Tomcat) >> $GITHUB_ENV
|
||||
echo MYSQL_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql) >> $GITHUB_ENV
|
||||
echo CONFIG_PATH=$(docker inspect -f '{{ range .Mounts }}{{ if eq .Name "docker-compose-file_etc" }}{{ .Source }}{{ end }}{{ end }}' node1.emqx.io) >> $GITHUB_ENV
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
repository: emqx/emqx-fvt
|
||||
ref: integration_test_suites
|
||||
path: scripts
|
||||
- uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: '8.0.282' # The JDK version to make available on the path.
|
||||
java-package: jdk # (jre, jdk, or jdk+fx) - defaults to jdk
|
||||
architecture: x64 # (x64 or x86) - defaults to x64
|
||||
- name: install jmeter
|
||||
timeout-minutes: 10
|
||||
env:
|
||||
JMETER_VERSION: 5.3
|
||||
run: |
|
||||
wget --no-verbose --no-check-certificate -O /tmp/apache-jmeter.tgz https://downloads.apache.org/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
|
||||
cd /tmp && tar -xvf apache-jmeter.tgz
|
||||
echo "jmeter.save.saveservice.output_format=xml" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
|
||||
echo "jmeter.save.saveservice.response_data.on_error=true" >> /tmp/apache-jmeter-$JMETER_VERSION/user.properties
|
||||
wget --no-verbose -O /tmp/apache-jmeter-$JMETER_VERSION/lib/ext/mqtt-xmeter-2.0.2-jar-with-dependencies.jar https://raw.githubusercontent.com/xmeter-net/mqtt-jmeter/master/Download/v2.0.2/mqtt-xmeter-2.0.2-jar-with-dependencies.jar
|
||||
ln -s /tmp/apache-jmeter-$JMETER_VERSION /opt/jmeter
|
||||
- name: install jmeter plugin
|
||||
run: |
|
||||
wget --no-verbose -O "/opt/jmeter/lib/mysql-connector-java-8.0.16.jar" https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.16/mysql-connector-java-8.0.16.jar
|
||||
- name: run jmeter
|
||||
run: |
|
||||
sudo /opt/jmeter/bin/jmeter.sh \
|
||||
-Jjmeter.save.saveservice.output_format=xml -n \
|
||||
-t scripts/.ci/automate-test-suite/http_auth_acl.jmx \
|
||||
-Dmysql_ip=$MYSQL_IP \
|
||||
-Demqx_ip=$HAPROXY_IP \
|
||||
-Dweb_server_ip=$HTTP_IP \
|
||||
-Dconfig_path=$CONFIG_PATH \
|
||||
-Ddocker_path=".ci/docker-compose-file" \
|
||||
-l jmeter_logs/http_auth_acl.jtl \
|
||||
-j jmeter_logs/logs/http_auth_acl.log
|
||||
- name: check logs
|
||||
run: |
|
||||
if cat jmeter_logs/http_auth_acl.jtl | grep -e '<failure>true</failure>' > /dev/null 2>&1; then
|
||||
echo "check logs filed"
|
||||
sudo cat /var/lib/docker/volumes/docker-compose-file_etc/_data/emqx.conf
|
||||
exit 1
|
||||
fi
|
||||
- uses: actions/upload-artifact@v1
|
||||
if: always()
|
||||
with:
|
||||
name: jmeter_logs
|
||||
path: ./jmeter_logs
|
||||
|
|
|
@ -1,23 +1,23 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIID1zCCAb8CCQC/+qKgZd+m/DANBgkqhkiG9w0BAQsFADA1MRMwEQYDVQQKDApS
|
||||
ZWRpcyBUZXN0MR4wHAYDVQQDDBVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMjAx
|
||||
MDI5MDEzNDE2WhcNMjExMDI5MDEzNDE2WjAmMRMwEQYDVQQKDApSZWRpcyBUZXN0
|
||||
MIID1zCCAb8CCQC/+qKgZd+m/jANBgkqhkiG9w0BAQsFADA1MRMwEQYDVQQKDApS
|
||||
ZWRpcyBUZXN0MR4wHAYDVQQDDBVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMjEx
|
||||
MTAxMDgwMDU1WhcNMzExMDMwMDgwMDU1WjAmMRMwEQYDVQQKDApSZWRpcyBUZXN0
|
||||
MQ8wDQYDVQQDDAZTZXJ2ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
||||
AQDSs3bQ9sYi2AhFuHU75Ryk1HHSgfzA6pQAJilmJdTy0s5vyiWe1HQJaWkMcS5V
|
||||
GVzGMK+c+OBqtXtDDninL3betg1YPMjSCOjPMOTC1H9K7+effwf7Iwpnw9Zro8mb
|
||||
TEmMslIYhhcDedzT9Owli4QAgbgTn4l1BYuKX9CLrrKFtnr21miKu3ydViy9q7T1
|
||||
pib3eigvAyk7X2fadHFArGEttsXrD6cetPPkSF/1OLWNlqzUKXzhSyrBXzO44Kks
|
||||
fwR/EpTiES9g4dNOL2wvKS/YE1fNKhiCENrNxTXQo1l0yOdm2+MeyOeHFzRuS0b/
|
||||
+uGDFOPPi04KXeO6dQ5olBCPAgMBAAEwDQYJKoZIhvcNAQELBQADggIBADn0E2vG
|
||||
iQWe8/I7VbBdPhPNupVNcLvew10eIHxY2g5vSruCSVRQTgk8itVMRmDQxbb7gdDW
|
||||
jnCRbxykxbLjM9iCRljnOCsIcTi7qO7JRl8niV8dtEpPOs9lZxEdNXjIV1iZoWf3
|
||||
arBbPQSyQZvTQHG6qbFnyCdMMyyXGGvEPGQDaBiKH+Ko1qeAbCi0zupChYvxmtZ8
|
||||
hSTPlMFezDT9bKoNY0pkJSELfokEPU/Pn6Lz/NVbdzmCMjVa/xmF3s31g+DGhz95
|
||||
4AyOnCr6o0aydPVVV3pB/BCezNXPUxpp53BG0w/K2f2DnKYCvGvJbqDAaJ8bG/J1
|
||||
EFSOmwobdwVxJz3KNubmo1qJ6xOl/YT7yyqPRQRM1SY8nZW+YcoJSZjOe8wJVlob
|
||||
d0bOwN1C3HQwomyMWes187bEQP6Y36HuEbR1fK8yIOzGsGDKRFAFwQwMgw2M91lr
|
||||
EJIP5NRD3OZRuiYDiVfVhDZDaNahrAMZUcPCgeCAwc4YG6Gp2sDtdorOl4kIJYWE
|
||||
BbBZ0Jplq9+g6ciu5ChjAW8iFl0Ae5U24MxPGXnrxiRF4WWxLeZMVLXLDvlPqReD
|
||||
CHII5ifyvGEt5+RhqtZC/L+HimL+5wQgOlntqhUdLb6yWRz7YW37PFMnUXU3MXe9
|
||||
uY7m73ZLluXiLojcZxU2+cx89u5FOJxrYtrj
|
||||
+uGDFOPPi04KXeO6dQ5olBCPAgMBAAEwDQYJKoZIhvcNAQELBQADggIBALRSylnk
|
||||
JJhEFRniuQ+H1kbfZlVOqnSqGkm38r8X76dnYRZfkFlxVzU2q5HPnSdiL9D3JrrH
|
||||
P7wIA5zjr76zK7GPJjkRExRZy5sTLSpsGp7YIGAZ19J3KsDVHSOvPTl38c6L217a
|
||||
YzPeQL5IrrW55URmA5PZFu3lsm9z7CNguw1wn2pCNNB+r/cRl4iELehZJT891CQe
|
||||
nV9a1YfHY/DkDoMnmrKqmeYdvje8n1uSqTnIV/wNiASU36ztxxD8ZmwprxxbjLSs
|
||||
aBjBvsR/eBHbWrz2W1dc5ppgGLuCkiEKmh6/IWX/ZQqyBCzZkmFNiTs8QiLtmoC4
|
||||
2bXkPVSyq5wT7eisGbRdcY9vGDtoW/WZOmFVA4XEDVx8M9fb4speHwoHRuTfWsA0
|
||||
6Y8P9XpYjG2tQoPpxrZaRshZ+SiHWPov7cAvY34szFePfTWR8gzbL6SgpDz30ceh
|
||||
XIuTArOMQMhfWHn3NaOc6hlkRsoviNhc5IXR9VjIdaNJCamEoLVNWZsvHJCUiP10
|
||||
yx+9/0a9vI6G+i8oKQ+eKJsfP8Ikoiolf7vU6M+/1kF+sSMxGjFwkMCxLgZB67+a
|
||||
m9kw83sVfykWLQ3eRwhdBz0/JiiYtDbbtyqgs3kPhJs9SGZUhDc/7R0lTWf4zxoJ
|
||||
l3y7pn/3nJvYrGX7uCBbWPUuqWeHVM9Ip6AZ
|
||||
-----END CERTIFICATE-----
|
||||
|
|
Loading…
Reference in New Issue