From a5147ca564d3213f2686544f34cf03ec6e37912c Mon Sep 17 00:00:00 2001 From: "Xinwei Xiong(cubxxw-openim)" <3293172751nss@gmail.com> Date: Fri, 30 Jun 2023 17:52:55 +0800 Subject: [PATCH] feat: optimize scripts and makefiles Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com> --- .docker-compose_cfg/grafana.ini | 2 +- .github/sync.yml | 10 +- Makefile | 14 +-- README-zh_CN.md | 4 +- README.md | 12 +- cmd/Open-IM-SDK-Core | 1 - deploy.Dockerfile | 16 +-- docker-compose-mongos.yaml | 4 +- docker-compose.yaml | 119 ++++++++++++------ docker-compose_cfg/grafana.db | Bin 888832 -> 0 bytes init_docker.sh | 4 +- install_guide.sh | 9 +- install_im_compose.sh | 5 +- {script => scripts}/LICENSE/LICENSE | 0 {script => scripts}/LICENSE/LICENSE_TEMPLATES | 0 .../batch_build_all_service.sh | 0 {script => scripts}/batch_start_all.sh | 8 +- {script => scripts}/build_all_service.sh | 0 {script => scripts}/build_images.sh | 0 {script => scripts}/build_push_k8s_images.sh | 0 {script => scripts}/check_all.sh | 0 {script => scripts}/docker_check_service.sh | 0 {script => scripts}/docker_start_all.sh | 6 +- {script => scripts}/enterprise/check_all.sh | 0 {script => scripts}/enterprise/function.sh | 0 {script => scripts}/enterprise/path_info.cfg | 0 {script => scripts}/env_check.sh | 0 {script => scripts}/function.sh | 0 {script => scripts}/githooks/commit-msg | 4 +- {script => scripts}/githooks/pre-commit | 0 {script => scripts}/githooks/pre-push | 2 +- {script => scripts}/init_pwd.sh | 0 {script => scripts}/make-rules/common.mk | 4 +- {script => scripts}/make-rules/copyright.mk | 4 +- .../make-rules/dependencies.mk | 2 +- {script => scripts}/make-rules/gen.mk | 2 +- {script => scripts}/make-rules/golang.mk | 4 +- {script => scripts}/make-rules/image.mk | 4 +- {script => scripts}/make-rules/release.mk | 2 +- {script => scripts}/make-rules/tools.mk | 8 +- {script => scripts}/mongo-init.sh | 0 {script => scripts}/msg_gateway_start.sh | 0 {script => scripts}/msg_transfer_start.sh | 0 {script => scripts}/path_info.cfg | 0 {script => scripts}/push_start.sh | 0 {script => scripts}/sdk_svr_start.sh | 0 {script => scripts}/start_all.sh | 6 +- {script => scripts}/start_cron.sh | 0 {script => scripts}/start_rpc_service.sh | 0 {script => scripts}/stop_all.sh | 2 +- {script => scripts}/style_info.cfg | 0 {script => scripts}/win_build_all_service.cmd | 0 {script => scripts}/win_start_all_service.cmd | 0 53 files changed, 144 insertions(+), 114 deletions(-) delete mode 160000 cmd/Open-IM-SDK-Core delete mode 100755 docker-compose_cfg/grafana.db rename {script => scripts}/LICENSE/LICENSE (100%) rename {script => scripts}/LICENSE/LICENSE_TEMPLATES (100%) rename {script => scripts}/batch_build_all_service.sh (100%) rename {script => scripts}/batch_start_all.sh (89%) rename {script => scripts}/build_all_service.sh (100%) rename {script => scripts}/build_images.sh (100%) rename {script => scripts}/build_push_k8s_images.sh (100%) rename {script => scripts}/check_all.sh (100%) rename {script => scripts}/docker_check_service.sh (100%) rename {script => scripts}/docker_start_all.sh (85%) rename {script => scripts}/enterprise/check_all.sh (100%) rename {script => scripts}/enterprise/function.sh (100%) rename {script => scripts}/enterprise/path_info.cfg (100%) rename {script => scripts}/env_check.sh (100%) rename {script => scripts}/function.sh (100%) rename {script => scripts}/githooks/commit-msg (94%) rename {script => scripts}/githooks/pre-commit (100%) rename {script => scripts}/githooks/pre-push (92%) rename {script => scripts}/init_pwd.sh (100%) rename {script => scripts}/make-rules/common.mk (97%) rename {script => scripts}/make-rules/copyright.mk (95%) rename {script => scripts}/make-rules/dependencies.mk (96%) rename {script => scripts}/make-rules/gen.mk (98%) rename {script => scripts}/make-rules/golang.mk (97%) rename {script => scripts}/make-rules/image.mk (98%) rename {script => scripts}/make-rules/release.mk (97%) rename {script => scripts}/make-rules/tools.mk (97%) rename {script => scripts}/mongo-init.sh (100%) rename {script => scripts}/msg_gateway_start.sh (100%) rename {script => scripts}/msg_transfer_start.sh (100%) rename {script => scripts}/path_info.cfg (100%) rename {script => scripts}/push_start.sh (100%) rename {script => scripts}/sdk_svr_start.sh (100%) rename {script => scripts}/start_all.sh (83%) rename {script => scripts}/start_cron.sh (100%) rename {script => scripts}/start_rpc_service.sh (100%) rename {script => scripts}/stop_all.sh (92%) rename {script => scripts}/style_info.cfg (100%) rename {script => scripts}/win_build_all_service.cmd (100%) rename {script => scripts}/win_start_all_service.cmd (100%) diff --git a/.docker-compose_cfg/grafana.ini b/.docker-compose_cfg/grafana.ini index 180de10af..b9380d7f1 100644 --- a/.docker-compose_cfg/grafana.ini +++ b/.docker-compose_cfg/grafana.ini @@ -306,7 +306,7 @@ content_security_policy = false # Set Content Security Policy template used when adding the Content-Security-Policy header to your requests. # $NONCE in the template includes a random nonce. # $ROOT_PATH is server.root_url without the protocol. -content_security_policy_template = """script-src 'self' 'unsafe-eval' 'unsafe-inline' 'strict-dynamic' $NONCE;object-src 'none';font-src 'self';style-src 'self' 'unsafe-inline' blob:;img-src * data:;base-uri 'self';connect-src 'self' grafana.com ws://$ROOT_PATH wss://$ROOT_PATH;manifest-src 'self';media-src 'none';form-action 'self';""" +content_security_policy_template = """scripts-src 'self' 'unsafe-eval' 'unsafe-inline' 'strict-dynamic' $NONCE;object-src 'none';font-src 'self';style-src 'self' 'unsafe-inline' blob:;img-src * data:;base-uri 'self';connect-src 'self' grafana.com ws://$ROOT_PATH wss://$ROOT_PATH;manifest-src 'self';media-src 'none';form-action 'self';""" # Controls if old angular plugins are supported or not. This will be disabled by default in future release angular_support_enabled = true diff --git a/.github/sync.yml b/.github/sync.yml index 6bd382027..f543b2d39 100644 --- a/.github/sync.yml +++ b/.github/sync.yml @@ -3,7 +3,7 @@ OpenIMSDK/.github: - source: LICENSE dest: LICENSE - - source: script/LICENSE/ + - source: scripts/LICENSE/ dest: scripts/LICENSE/ replace: false - source: .github/ @@ -16,7 +16,7 @@ OpenIMSDK/.github: OpenIMSDK/community: - source: LICENSE dest: LICENSE - - source: script/LICENSE/ + - source: scripts/LICENSE/ dest: scripts/LICENSE/ replace: false - source: .github/workflows/ @@ -33,7 +33,7 @@ OpenIMSDK/community: OpenIMSDK/openim-sdk-core: - source: LICENSE dest: LICENSE - - source: script/LICENSE/ + - source: scripts/LICENSE/ dest: scripts/LICENSE/ replace: false - source: .github/workflows/issue-robot.yml @@ -49,7 +49,7 @@ OpenIMSDK/OpenIM-Docs: exclude: | e2e-test.yml sync.yml - - source: script/githooks/ + - source: scripts/githooks/ dest: scripts/githooks/ replace: true @@ -77,6 +77,6 @@ group: - source: .github/workflows/help-comment-issue.yml dest: .github/workflows/help-comment-issue.yml replace: false - - source: ./script/githooks/ + - source: ./scripts/githooks/ dest: ./scripts/githooks/ replace: true \ No newline at end of file diff --git a/Makefile b/Makefile index 9e870ecad..5d7ac6bd3 100644 --- a/Makefile +++ b/Makefile @@ -23,13 +23,13 @@ VERSION_PACKAGE=github.com/OpenIMSDK/Open-IM-Server/pkg/version # ============================================================================== # Includes -include script/make-rules/common.mk # make sure include common.mk at the first include line -include script/make-rules/golang.mk -include script/make-rules/image.mk -include script/make-rules/copyright.mk -include script/make-rules/gen.mk -include script/make-rules/dependencies.mk -include script/make-rules/tools.mk +include scripts/make-rules/common.mk # make sure include common.mk at the first include line +include scripts/make-rules/golang.mk +include scripts/make-rules/image.mk +include scripts/make-rules/copyright.mk +include scripts/make-rules/gen.mk +include scripts/make-rules/dependencies.mk +include scripts/make-rules/tools.mk # ============================================================================== # Usage diff --git a/README-zh_CN.md b/README-zh_CN.md index 2a214ee42..1308ef28b 100644 --- a/README-zh_CN.md +++ b/README-zh_CN.md @@ -78,7 +78,7 @@ Open-IM-Server 是一款即时通讯服务器,使用纯 Golang 开发,采用 3. 检查服务 ``` - cd script; + cd scripts; ./docker_check_service.sh ./check_all.sh ``` @@ -100,7 +100,7 @@ Open-IM-Server 是一款即时通讯服务器,使用纯 Golang 开发,采用 3. 设置可执行权限 ``` - cd ../../script/ + cd ../../scripts/ chmod +x *.sh ``` diff --git a/README.md b/README.md index 318460711..8f2713ccb 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ By deployment of the Open-IM-Server on the customer's server, developers can int 4. Check service ``` - cd script; + cd scripts; ./docker_check_service.sh./check_all.sh ``` @@ -102,7 +102,7 @@ git checkout main 1. Set executable permissions ```shell -cd ../../script/ +cd ../../scripts/ chmod +x *.sh ``` @@ -142,18 +142,18 @@ all services build success - multiloginpolicy&&tokenpolicy - Open-IM supports multi-terminal login. Currently, there are three multi-terminal login policies. The PC terminal and the mobile terminal are online at the same time by default. When multiple policies are configured to be true, the first policy with true is used by default, and the token policy is the generated token policy. , The developer can customize the expiration time of the token -### SCRIPT DESCRIPTION +### scripts DESCRIPTION -> Open-IM script provides service compilation, start, and stop script. There are four Open-IM script start modules, one is the http+rpc service start module, the second is the websocket service start module, then the msg_transfer module, and the last is the push module +> Open-IM scripts provides service compilation, start, and stop scripts. There are four Open-IM scripts start modules, one is the http+rpc service start module, the second is the websocket service start module, then the msg_transfer module, and the last is the push module - path_info.cfg&&style_info.cfg&&functions.sh - Contains the path information of each module, including the path where the source code is located, the name of the service startup, the shell print font style, and some functions for processing shell strings - build_all_service.sh - Compile the module, compile all the source code of Open-IM into a binary file and put it into the bin directory - start_rpc_api_service.sh&&msg_gateway_start.sh&&msg_transfer_start.sh&&push_start.sh - - Independent script startup module, followed by api and rpc modules, message gateway module, message transfer module, and push module + - Independent scripts startup module, followed by api and rpc modules, message gateway module, message transfer module, and push module - start_all.sh&&stop_all.sh - - Total script, start all services and close all services + - Total scripts, start all services and close all services ## Authentication Clow Chart diff --git a/cmd/Open-IM-SDK-Core b/cmd/Open-IM-SDK-Core deleted file mode 160000 index 666684b5a..000000000 --- a/cmd/Open-IM-SDK-Core +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 666684b5ac6af2bc259cbfd8021d9ddc31d1bff8 diff --git a/deploy.Dockerfile b/deploy.Dockerfile index 309e4ba0f..ddf58df32 100644 --- a/deploy.Dockerfile +++ b/deploy.Dockerfile @@ -10,8 +10,8 @@ WORKDIR /Open-IM-Server # add all files to the container COPY . . -RUN chmod +x /Open-IM-Server/script/*.sh && \ - /bin/sh -c /Open-IM-Server/script/build_all_service.sh +RUN chmod +x /Open-IM-Server/scripts/*.sh && \ + /bin/sh -c /Open-IM-Server/scripts/build_all_service.sh #Blank image Multi-Stage Build FROM alpine @@ -22,13 +22,13 @@ RUN apk add --no-cache vim curl tzdata gawk procps net-tools RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ dpkg-reconfigure -f noninteractive tzdata -#set directory to map logs,config file,script file. -VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/script","/Open-IM-Server/db/sdk"] +#set directory to map logs,config file,scripts file. +VOLUME ["/Open-IM-Server/logs","/Open-IM-Server/config","/Open-IM-Server/scripts","/Open-IM-Server/db/sdk"] -#Copy script files and binary files to the blank image -COPY --from=build --chown=root:root /Open-IM-Server/script /Open-IM-Server/script +#Copy scripts files and binary files to the blank image +COPY --from=build --chown=root:root /Open-IM-Server/scripts /Open-IM-Server/scripts COPY --from=build --chown=root:root /Open-IM-Server/bin /Open-IM-Server/bin -WORKDIR /Open-IM-Server/script +WORKDIR /Open-IM-Server/scripts -CMD ["/Open-IM-Server/script/docker_start_all.sh"] +CMD ["/Open-IM-Server/scripts/docker_start_all.sh"] diff --git a/docker-compose-mongos.yaml b/docker-compose-mongos.yaml index e9710f11c..5b23c4406 100644 --- a/docker-compose-mongos.yaml +++ b/docker-compose-mongos.yaml @@ -122,7 +122,7 @@ services: - ./logs:/Open-IM-Server/logs - ./config/config.yaml:/Open-IM-Server/config/config.yaml - ./db/sdk:/Open-IM-Server/db/sdk - - ./script:/Open-IM-Server/script + - ./scripts:/Open-IM-Server/scripts restart: always depends_on: - kafka @@ -136,4 +136,4 @@ services: driver: json-file options: max-size: "1g" - max-file: "2" + max-file: "2" \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index 630cb45c4..242ea65a4 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,6 +1,5 @@ -version: "3" #fixme Clone openIM Server project before using docker-compose,project address:https://github.com/OpenIMSDK/Open-IM-Server.git - +version: "3" services: mysql: image: mysql:5.7 @@ -9,10 +8,10 @@ services: - 23306:33060 container_name: mysql volumes: - - ./components/mysql/data:/var/lib/mysql + - ${DATA_DIR}/components/mysql/data:/var/lib/mysql - /etc/localtime:/etc/localtime environment: - MYSQL_ROOT_PASSWORD: openIM + MYSQL_ROOT_PASSWORD: ${PASSWORD} restart: always mongodb: @@ -22,19 +21,19 @@ services: container_name: mongo command: --wiredTigerCacheSizeGB 1 --auth volumes: - - ./components/mongodb/data/db:/data/db - - ./components/mongodb/data/logs:/data/logs - - ./components/mongodb/data/conf:/etc/mongo + - ${DATA_DIR}/components/mongodb/data/db:/data/db + - ${DATA_DIR}/components/mongodb/data/logs:/data/logs + - ${DATA_DIR}/components/mongodb/data/conf:/etc/mongo + - ./scripts/mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh:ro environment: - TZ=Asia/Shanghai # cache - wiredTigerCacheSizeGB=1 -# environment: -# - MONGO_INITDB_ROOT_USERNAME=openIM -# - MONGO_INITDB_ROOT_PASSWORD=openIM - - - #TZ: Asia/Shanghai + - MONGO_INITDB_ROOT_USERNAME=${USER} + - MONGO_INITDB_ROOT_PASSWORD=${PASSWORD} + - MONGO_INITDB_DATABASE=openIM + - MONGO_USERNAME=${USER} + - MONGO_PASSWORD=${PASSWORD} restart: always redis: @@ -43,19 +42,19 @@ services: - 16379:6379 container_name: redis volumes: - - ./components/redis/data:/data + - ${DATA_DIR}/components/redis/data:/data #redis config file - - ./components/redis/config/redis.conf:/usr/local/redis/config/redis.conf + - ${DATA_DIR}/components/redis/config/redis.conf:/usr/local/redis/config/redis.conf environment: TZ: Asia/Shanghai restart: always sysctls: net.core.somaxconn: 1024 - command: redis-server --requirepass openIM --appendonly yes + command: redis-server --requirepass ${PASSWORD} --appendonly yes zookeeper: - image: wurstmeister/zookeeper + image: zookeeper ports: - 2181:2181 container_name: zookeeper @@ -71,17 +70,16 @@ services: container_name: kafka restart: always ports: - - 9093:9093 + - 9092:9092 environment: TZ: Asia/Shanghai KAFKA_BROKER_ID: 0 - KAFKA_ZOOKEEPER_CONNECT: 127.0.0.1:2181 - KAFKA_CREATE_TOPICS: "ws2ms_chat:2:1,ms2ps_chat:2:1" - KAFKA_ADVERTISED_LISTENERS: INSIDE://127.0.0.1:9092,OUTSIDE://103.116.45.174:9093 + KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + KAFKA_CREATE_TOPICS: "latestMsgToRedis:8:1,msgToPush:8:1,offlineMsgToMongoMysql:8:1" + KAFKA_ADVERTISED_LISTENERS: INSIDE://127.0.0.1:9092,OUTSIDE://103.116.45.174:9092 KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9093 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT" KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE - network_mode: "host" depends_on: - zookeeper @@ -95,40 +93,27 @@ services: - /mnt/data:/data - /mnt/config:/root/.minio environment: - MINIO_ROOT_USER: user12345 - MINIO_ROOT_PASSWORD: key12345 + MINIO_ROOT_USER: ${USER} + MINIO_ROOT_PASSWORD: ${PASSWORD} restart: always command: minio server /data --console-address ':9090' - etcd: - image: quay.io/coreos/etcd - ports: - - 2379:2379 - - 2380:2380 - container_name: etcd - volumes: - - /etc/timezone:/etc/timezone - - /etc/localtime:/etc/localtime - environment: - ETCDCTL_API: 3 - restart: always - command: /usr/local/bin/etcd --name etcd0 --data-dir /etcd-data --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379 --listen-peer-urls http://0.0.0.0:2380 --initial-advertise-peer-urls http://0.0.0.0:2380 --initial-cluster etcd0=http://0.0.0.0:2380 --initial-cluster-token tkn --initial-cluster-state new open_im_server: - image: openim/open_im_server:v2.3.0-rc1 + image: openim/open_im_server:v3.0.0 container_name: open_im_server volumes: - ./logs:/Open-IM-Server/logs - ./config/config.yaml:/Open-IM-Server/config/config.yaml - - ./db/sdk:/Open-IM-Server/db/sdk - - ./script:/Open-IM-Server/script + - ./config/notification.yaml:/Open-IM-Server/config/notification.yaml + - ${DATA_DIR}/db/sdk:/Open-IM-Server/db/sdk + - ./scripts:/Open-IM-Server/scripts restart: always depends_on: - kafka - mysql - mongodb - redis - - etcd - minio network_mode: "host" logging: @@ -136,3 +121,55 @@ services: options: max-size: "1g" max-file: "2" + + open_im_chat: + image: openim/open_im_enterprise:v1.0.2 + container_name: open_im_enterprise + volumes: + - ./logs:/Open-IM-chat/logs + - ./.docker-compose_cfg/config.yaml:/Open-IM-Enterprise/config/config.yaml + restart: always + depends_on: + - mysql + - mongodb + - redis + - minio + - open_im_server + network_mode: "host" + logging: + driver: json-file + options: + max-size: "1g" + max-file: "2" + environment: + CONFIG_NAME: "/Open-IM-Enterprise" + + prometheus: + image: prom/prometheus + volumes: + - ./.docker-compose_cfg/prometheus-compose.yml:/etc/prometheus/prometheus.yml + container_name: prometheus + # ports: + # - 9091:9091 + depends_on: + - open_im_server + command: --web.listen-address=:9091 --config.file="/etc/prometheus/prometheus.yml" + network_mode: "host" + + grafana: + image: grafana/grafana + volumes: + - ./.docker-compose_cfg/datasource-compose.yaml:/etc/grafana/provisioning/datasources/datasource.yaml + - ./.docker-compose_cfg/grafana.ini:/etc/grafana/grafana.ini + - ./.docker-compose_cfg/node-exporter-full_rev1.json:/var/lib/grafana/dashboards/node-exporter-full_rev1.json + container_name: grafana + depends_on: + - prometheus + network_mode: "host" + + # node-exporter: + # image: quay.io/prometheus/node-exporter + # container_name: node-exporter + # restart: always + # ports: + # - "9100:9100" \ No newline at end of file diff --git a/docker-compose_cfg/grafana.db b/docker-compose_cfg/grafana.db deleted file mode 100755 index 362adfe67e166b5754167190ff762fbab2f0b73c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 888832 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 IhU@?TKcFHhg8%>k diff --git a/init_docker.sh b/init_docker.sh index 7a2910962..d2a7cbe93 100644 --- a/init_docker.sh +++ b/init_docker.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# This script is used to check the environment and start the docker containers +# This scripts is used to check the environment and start the docker containers # Define the directory path SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" @@ -27,7 +27,7 @@ check_command docker-compose # Check if Docker is running check_docker -# Change to the script directory +# Change to the scripts directory cd $SCRIPT_DIR # Set permissions for the scripts diff --git a/install_guide.sh b/install_guide.sh index b0067396a..ae286317c 100644 --- a/install_guide.sh +++ b/install_guide.sh @@ -1,6 +1,6 @@ #!/bin/bash -echo "Welcome to the Open-IM-Server installation script." +echo "Welcome to the Open-IM-Server installation scripts." echo "Please select an deploy option:" echo "1. docker-compose install" echo "2. exit" @@ -145,13 +145,13 @@ EOF edit_config edit_enterprise_config - cd script; + cd scripts; chmod +x *.sh; ./init_pwd.sh; ./env_check.sh; cd ..; docker-compose up -d; - cd script; + cd scripts; ./docker_check_service.sh; } @@ -167,11 +167,10 @@ case $choice in 3) ;; 4) - echo "Exiting installation script..." + echo "Exiting installation scripts..." exit 0 ;; *) echo "Invalid option, please try again." ;; esac - diff --git a/install_im_compose.sh b/install_im_compose.sh index 36d3a4b73..1c7f637c6 100644 --- a/install_im_compose.sh +++ b/install_im_compose.sh @@ -9,13 +9,10 @@ if [ $MINIO_ENDPOINT == "http://127.0.0.1:10005" ]; then fi -cd script ; +cd scripts ; chmod +x *.sh ; ./init_pwd.sh ./env_check.sh; cd .. ; docker-compose -f im-compose.yaml up -d docker ps - - - diff --git a/script/LICENSE/LICENSE b/scripts/LICENSE/LICENSE similarity index 100% rename from script/LICENSE/LICENSE rename to scripts/LICENSE/LICENSE diff --git a/script/LICENSE/LICENSE_TEMPLATES b/scripts/LICENSE/LICENSE_TEMPLATES similarity index 100% rename from script/LICENSE/LICENSE_TEMPLATES rename to scripts/LICENSE/LICENSE_TEMPLATES diff --git a/script/batch_build_all_service.sh b/scripts/batch_build_all_service.sh similarity index 100% rename from script/batch_build_all_service.sh rename to scripts/batch_build_all_service.sh diff --git a/script/batch_start_all.sh b/scripts/batch_start_all.sh similarity index 89% rename from script/batch_start_all.sh rename to scripts/batch_start_all.sh index 085690717..689d4ab0a 100644 --- a/script/batch_start_all.sh +++ b/scripts/batch_start_all.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash -#fixme This script is the total startup script -#fixme The full name of the shell script that needs to be started is placed in the need_to_start_server_shell array +#fixme This scripts is the total startup scripts +#fixme The full name of the shell scripts that needs to be started is placed in the need_to_start_server_shell array -#fixme Put the shell script name here +#fixme Put the shell scripts name here need_to_start_server_shell=( start_rpc_service.sh msg_gateway_start.sh @@ -56,5 +56,3 @@ if [ $success_num == ${#need_to_start_server_shell[*]} ] then echo -e ${YELLOW_PREFIX}"all services build success"${COLOR_SUFFIX} fi - - diff --git a/script/build_all_service.sh b/scripts/build_all_service.sh similarity index 100% rename from script/build_all_service.sh rename to scripts/build_all_service.sh diff --git a/script/build_images.sh b/scripts/build_images.sh similarity index 100% rename from script/build_images.sh rename to scripts/build_images.sh diff --git a/script/build_push_k8s_images.sh b/scripts/build_push_k8s_images.sh similarity index 100% rename from script/build_push_k8s_images.sh rename to scripts/build_push_k8s_images.sh diff --git a/script/check_all.sh b/scripts/check_all.sh similarity index 100% rename from script/check_all.sh rename to scripts/check_all.sh diff --git a/script/docker_check_service.sh b/scripts/docker_check_service.sh similarity index 100% rename from script/docker_check_service.sh rename to scripts/docker_check_service.sh diff --git a/script/docker_start_all.sh b/scripts/docker_start_all.sh similarity index 85% rename from script/docker_start_all.sh rename to scripts/docker_start_all.sh index b7b24dd4b..c15bb816b 100644 --- a/script/docker_start_all.sh +++ b/scripts/docker_start_all.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash -#fixme This script is the total startup script -#fixme The full name of the shell script that needs to be started is placed in the need_to_start_server_shell array +#fixme This scripts is the total startup scripts +#fixme The full name of the shell scripts that needs to be started is placed in the need_to_start_server_shell array -#fixme Put the shell script name here +#fixme Put the shell scripts name here need_to_start_server_shell=( start_rpc_service.sh msg_gateway_start.sh diff --git a/script/enterprise/check_all.sh b/scripts/enterprise/check_all.sh similarity index 100% rename from script/enterprise/check_all.sh rename to scripts/enterprise/check_all.sh diff --git a/script/enterprise/function.sh b/scripts/enterprise/function.sh similarity index 100% rename from script/enterprise/function.sh rename to scripts/enterprise/function.sh diff --git a/script/enterprise/path_info.cfg b/scripts/enterprise/path_info.cfg similarity index 100% rename from script/enterprise/path_info.cfg rename to scripts/enterprise/path_info.cfg diff --git a/script/env_check.sh b/scripts/env_check.sh similarity index 100% rename from script/env_check.sh rename to scripts/env_check.sh diff --git a/script/function.sh b/scripts/function.sh similarity index 100% rename from script/function.sh rename to scripts/function.sh diff --git a/script/githooks/commit-msg b/scripts/githooks/commit-msg similarity index 94% rename from script/githooks/commit-msg rename to scripts/githooks/commit-msg index eede298a0..66b40d016 100644 --- a/script/githooks/commit-msg +++ b/scripts/githooks/commit-msg @@ -17,12 +17,12 @@ # # Store this file as .git/hooks/commit-msg in your repository in order to # enforce checking for proper commit message format before actual commits. -# You may need to make the script executable by 'chmod +x .git/hooks/commit-msg'. +# You may need to make the scripts executable by 'chmod +x .git/hooks/commit-msg'. # commit-msg use go-gitlint tool, install go-gitlint via `go get github.com/llorllale/go-gitlint/cmd/go-gitlint` # go-gitlint --msg-file="$1" -# An example hook script to check the commit log message. +# An example hook scripts to check the commit log message. # Called by "git commit" with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the diff --git a/script/githooks/pre-commit b/scripts/githooks/pre-commit similarity index 100% rename from script/githooks/pre-commit rename to scripts/githooks/pre-commit diff --git a/script/githooks/pre-push b/scripts/githooks/pre-push similarity index 92% rename from script/githooks/pre-push rename to scripts/githooks/pre-push index ef1b5b1fe..c8ad61a60 100644 --- a/script/githooks/pre-push +++ b/scripts/githooks/pre-push @@ -36,7 +36,7 @@ printError() { printMessage "Running local OpenIM pre-push hook." if [[ `git status --porcelain` ]]; then - printError "This script needs to run against committed code only. Please commit or stash you changes." + printError "This scripts needs to run against committed code only. Please commit or stash you changes." exit 1 fi diff --git a/script/init_pwd.sh b/scripts/init_pwd.sh similarity index 100% rename from script/init_pwd.sh rename to scripts/init_pwd.sh diff --git a/script/make-rules/common.mk b/scripts/make-rules/common.mk similarity index 97% rename from script/make-rules/common.mk rename to scripts/make-rules/common.mk index 18e97f8b6..568b019ca 100644 --- a/script/make-rules/common.mk +++ b/scripts/make-rules/common.mk @@ -116,7 +116,7 @@ FIND := find . ! -path './utils/*' ! -path './vendor/*' XARGS := xargs -r # Linux command settings-CODE DIRS Copyright -CODE_DIRS := $(ROOT_DIR)/pkg $(ROOT_DIR)/cmd $(ROOT_DIR)/config $(ROOT_DIR)/db $(ROOT_DIR)/deploy $(ROOT_DIR)/deploy_k8s $(ROOT_DIR)/docker-compose_cfg $(ROOT_DIR)/internal $(ROOT_DIR)/script $(ROOT_DIR)/test +CODE_DIRS := $(ROOT_DIR)/pkg $(ROOT_DIR)/cmd $(ROOT_DIR)/config $(ROOT_DIR)/db $(ROOT_DIR)/deploy $(ROOT_DIR)/deploy_k8s $(ROOT_DIR)/docker-compose_cfg $(ROOT_DIR)/internal $(ROOT_DIR)/scripts $(ROOT_DIR)/test FINDS := find $(CODE_DIRS) # Makefile settings: Select different behaviors by determining whether V option is set @@ -126,7 +126,7 @@ endif # Copy githook scripts when execute makefile # TODO! GIT_FILE_SIZE_LIMIT=42000000 git commit -m "This commit is allowed file sizes up to 42MB" -COPY_GITHOOK:=$(shell cp -f script/githooks/* .git/hooks/; chmod +x .git/hooks/*) +COPY_GITHOOK:=$(shell cp -f scripts/githooks/* .git/hooks/; chmod +x .git/hooks/*) # COMMA: Concatenate multiple strings to form a list of strings COMMA := , diff --git a/script/make-rules/copyright.mk b/scripts/make-rules/copyright.mk similarity index 95% rename from script/make-rules/copyright.mk rename to scripts/make-rules/copyright.mk index 4b38e74da..d1c243caf 100644 --- a/script/make-rules/copyright.mk +++ b/scripts/make-rules/copyright.mk @@ -17,7 +17,7 @@ # Makefile helper functions for copyright # -LICENSE_TEMPLATE ?= $(ROOT_DIR)/script/LICENSE/LICENSE_TEMPLATES +LICENSE_TEMPLATE ?= $(ROOT_DIR)/scripts/LICENSE/LICENSE_TEMPLATES ## copyright.verify: Validate boilerplate headers for assign files .PHONY: copyright.verify @@ -53,5 +53,5 @@ copyright.add: tools.verify.addlicense ## copyright.help: Show copyright help .PHONY: copyright.help -copyright.help: script/make-rules/copyright.mk +copyright.help: scripts/make-rules/copyright.mk $(call smallhelp) \ No newline at end of file diff --git a/script/make-rules/dependencies.mk b/scripts/make-rules/dependencies.mk similarity index 96% rename from script/make-rules/dependencies.mk rename to scripts/make-rules/dependencies.mk index 3302d89e7..1a896f1ff 100644 --- a/script/make-rules/dependencies.mk +++ b/scripts/make-rules/dependencies.mk @@ -37,5 +37,5 @@ dependencies.tools.trivial: $(addprefix tools.verify., $(TRIVIAL_TOOLS)) ## dependencies.help: Print help for dependencies targets .PHONY: dependencies.help -dependencies.help: script/make-rules/dependencies.mk +dependencies.help: scripts/make-rules/dependencies.mk $(call smallhelp) \ No newline at end of file diff --git a/script/make-rules/gen.mk b/scripts/make-rules/gen.mk similarity index 98% rename from script/make-rules/gen.mk rename to scripts/make-rules/gen.mk index e6fe3e63c..a0d44befa 100644 --- a/script/make-rules/gen.mk +++ b/scripts/make-rules/gen.mk @@ -78,5 +78,5 @@ gen.clean: ## gen.help: show help for gen .PHONY: gen.help -gen.help: script/make-rules/gen.mk +gen.help: scripts/make-rules/gen.mk $(call smallhelp) \ No newline at end of file diff --git a/script/make-rules/golang.mk b/scripts/make-rules/golang.mk similarity index 97% rename from script/make-rules/golang.mk rename to scripts/make-rules/golang.mk index 8d36620b7..336fead4a 100644 --- a/script/make-rules/golang.mk +++ b/scripts/make-rules/golang.mk @@ -65,7 +65,7 @@ ifeq (${BINS},) endif # TODO: EXCLUDE_TESTS variable, which contains the name of the package to be excluded from the test -EXCLUDE_TESTS=github.com/OpenIMSDK/Open-IM-Server/test github.com/OpenIMSDK/Open-IM-Server/pkg/log github.com/OpenIMSDK/Open-IM-Server/db github.com/OpenIMSDK/Open-IM-Server/script github.com/OpenIMSDK/Open-IM-Server/deploy_k8s github.com/OpenIMSDK/Open-IM-Server/deploy github.com/OpenIMSDK/Open-IM-Server/config +EXCLUDE_TESTS=github.com/OpenIMSDK/Open-IM-Server/test github.com/OpenIMSDK/Open-IM-Server/pkg/log github.com/OpenIMSDK/Open-IM-Server/db github.com/OpenIMSDK/Open-IM-Server/scripts github.com/OpenIMSDK/Open-IM-Server/deploy_k8s github.com/OpenIMSDK/Open-IM-Server/deploy github.com/OpenIMSDK/Open-IM-Server/config # ============================================================================== # ❯ tree -L 1 cmd @@ -191,5 +191,5 @@ go.clean: ## copyright.help: Show copyright help .PHONY: go.help -go.help: script/make-rules/golang.mk +go.help: scripts/make-rules/golang.mk $(call smallhelp) diff --git a/script/make-rules/image.mk b/scripts/make-rules/image.mk similarity index 98% rename from script/make-rules/image.mk rename to scripts/make-rules/image.mk index 8a886ea6c..adcffa1cc 100644 --- a/script/make-rules/image.mk +++ b/scripts/make-rules/image.mk @@ -16,7 +16,7 @@ # Makefile helper functions for docker image # TODO: For the time being only used for compilation, it can be arm or amd, please do not delete it, it can be extended with new functions # ============================================================================== -# Path: script/make-rules/image.mk +# Path: scripts/make-rules/image.mk # docker registry: registry.example.com/namespace/image:tag as: registry.hub.docker.com/cubxxw/: # @@ -151,5 +151,5 @@ image.manifest.push.multiarch.%: ## image.help: Print help for image targets .PHONY: image.help -image.help: script/make-rules/image.mk +image.help: scripts/make-rules/image.mk $(call smallhelp) \ No newline at end of file diff --git a/script/make-rules/release.mk b/scripts/make-rules/release.mk similarity index 97% rename from script/make-rules/release.mk rename to scripts/make-rules/release.mk index 5f250b48e..06b7b7e47 100644 --- a/script/make-rules/release.mk +++ b/scripts/make-rules/release.mk @@ -38,5 +38,5 @@ release.ensure-tag: tools.verify.gsemver ## release.help: Display help information about the release package .PHONY: release.help -release.help: script/make-rules/release.mk +release.help: scripts/make-rules/release.mk $(call smallhelp) \ No newline at end of file diff --git a/script/make-rules/tools.mk b/scripts/make-rules/tools.mk similarity index 97% rename from script/make-rules/tools.mk rename to scripts/make-rules/tools.mk index 2a56ac3b7..f91ef2231 100644 --- a/script/make-rules/tools.mk +++ b/scripts/make-rules/tools.mk @@ -157,9 +157,9 @@ install.air: # github: https://github.com/moovweb/gvm .PHONY: install.gvm install.gvm: - @echo "===========> Installing gvm,The default installation path is ~/.gvm/script/gvm" + @echo "===========> Installing gvm,The default installation path is ~/.gvm/scripts/gvm" @bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer) - @$(shell source /root/.gvm/script/gvm) + @$(shell source /root/.gvm/scripts/gvm) ## install.golines: Install golines, used to format long lines .PHONY: install.golines @@ -189,7 +189,7 @@ install.protoc-gen-go: ## install.cfssl: Install cfssl, used to generate certificates .PHONY: install.cfssl install.cfssl: - @$(ROOT_DIR)/script/install/install.sh iam::install::install_cfssl + @$(ROOT_DIR)/scripts/install/install.sh iam::install::install_cfssl ## install.depth: Install depth, used to check dependency tree .PHONY: install.depth @@ -218,5 +218,5 @@ install.rts: ## tools.help: Display help information about the tools package .PHONY: tools.help -tools.help: script/make-rules/tools.mk +tools.help: scripts/make-rules/tools.mk $(call smallhelp) \ No newline at end of file diff --git a/script/mongo-init.sh b/scripts/mongo-init.sh similarity index 100% rename from script/mongo-init.sh rename to scripts/mongo-init.sh diff --git a/script/msg_gateway_start.sh b/scripts/msg_gateway_start.sh similarity index 100% rename from script/msg_gateway_start.sh rename to scripts/msg_gateway_start.sh diff --git a/script/msg_transfer_start.sh b/scripts/msg_transfer_start.sh similarity index 100% rename from script/msg_transfer_start.sh rename to scripts/msg_transfer_start.sh diff --git a/script/path_info.cfg b/scripts/path_info.cfg similarity index 100% rename from script/path_info.cfg rename to scripts/path_info.cfg diff --git a/script/push_start.sh b/scripts/push_start.sh similarity index 100% rename from script/push_start.sh rename to scripts/push_start.sh diff --git a/script/sdk_svr_start.sh b/scripts/sdk_svr_start.sh similarity index 100% rename from script/sdk_svr_start.sh rename to scripts/sdk_svr_start.sh diff --git a/script/start_all.sh b/scripts/start_all.sh similarity index 83% rename from script/start_all.sh rename to scripts/start_all.sh index 01c6ab652..1379c1840 100644 --- a/script/start_all.sh +++ b/scripts/start_all.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash -#fixme This script is the total startup script -#fixme The full name of the shell script that needs to be started is placed in the need_to_start_server_shell array +#fixme This scripts is the total startup scripts +#fixme The full name of the shell scripts that needs to be started is placed in the need_to_start_server_shell array -#fixme Put the shell script name here +#fixme Put the shell scripts name here need_to_start_server_shell=( start_rpc_service.sh push_start.sh diff --git a/script/start_cron.sh b/scripts/start_cron.sh similarity index 100% rename from script/start_cron.sh rename to scripts/start_cron.sh diff --git a/script/start_rpc_service.sh b/scripts/start_rpc_service.sh similarity index 100% rename from script/start_rpc_service.sh rename to scripts/start_rpc_service.sh diff --git a/script/stop_all.sh b/scripts/stop_all.sh similarity index 92% rename from script/stop_all.sh rename to scripts/stop_all.sh index 2e1e119c1..35ccd68e6 100644 --- a/script/stop_all.sh +++ b/scripts/stop_all.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#fixme This script is to stop the service +#fixme This scripts is to stop the service source ./style_info.cfg source ./path_info.cfg diff --git a/script/style_info.cfg b/scripts/style_info.cfg similarity index 100% rename from script/style_info.cfg rename to scripts/style_info.cfg diff --git a/script/win_build_all_service.cmd b/scripts/win_build_all_service.cmd similarity index 100% rename from script/win_build_all_service.cmd rename to scripts/win_build_all_service.cmd diff --git a/script/win_start_all_service.cmd b/scripts/win_start_all_service.cmd similarity index 100% rename from script/win_start_all_service.cmd rename to scripts/win_start_all_service.cmd