├── Caddyfile ├── .gitignore ├── host-init.sh ├── mongodb └── mongo_init.sh ├── success_message.txt ├── README_CN.md ├── README.md ├── LICENSE ├── server.sh ├── server.yml └── agent.sh /Caddyfile: -------------------------------------------------------------------------------- 1 | :8080 2 | 3 | reverse_proxy 172.1.2.1:8080 172.1.2.2:8080 { 4 | lb_policy first 5 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | logs/ 2 | .idea/ 3 | target/ 4 | .DS_Store 5 | nohup.out 6 | bin/ 7 | mytest/ 8 | chart/charts/ -------------------------------------------------------------------------------- /host-init.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ## the script to initialize ssh-host pool environment 4 | docker pull flowci/agent:latest -------------------------------------------------------------------------------- /mongodb/mongo_init.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | sleep 10 4 | 5 | 6 | mongosh db:27017/admin --eval "rs.initiate({_id: 'rs0', members: [{_id: 0, host: 'db:27017'}]})" 7 | 8 | mongosh db:27017/admin --eval "db.createUser({user:'flowci', pwd:'flowci', roles:[{role:'root',db:'admin'}]})" -------------------------------------------------------------------------------- /success_message.txt: -------------------------------------------------------------------------------- 1 | _____ _ _ _ _____ 2 | / ____| | | | | | / ____| 3 | | (___ | |_ __ _ _ __| |_ ___ __| | | (___ _ _ ___ ___ ___ ___ ___ 4 | \___ \| __/ _` | '__| __/ _ \/ _` | \___ \| | | |/ __/ __/ _ \/ __/ __| 5 | ____) | || (_| | | | || __/ (_| | ____) | |_| | (_| (_| __/\__ \__ \ 6 | |_____/ \__\__,_|_| \__\___|\__,_| |_____/ \__,_|\___\___\___||___/___/ 7 | 8 | 9 | -------------------------------------------------------------------------------- /README_CN.md: -------------------------------------------------------------------------------- 1 | # 1 分钟从 Docker 安装 2 | 3 | ## 基础环境 4 | 5 | - 需要 [Docker](https://docs.docker.com/install/) 6 | - 需要 [Docker-Compose](https://docs.docker.com/compose/install/) 7 | - Mac/Linux/Windows 8 | - 建议 4核 CPU, 8G 内存,60G 以上存储空间 9 | 10 | ## 安装 11 | 12 | 运行如下命令: 13 | 14 | ```bash 15 | git clone https://github.com/FlowCI/docker-install.git flow-docker 16 | cd flow-docker 17 | ./server.sh start 18 | 19 | # ./server.sh help 获得更多信息 20 | ``` 21 | 22 | 当服务启动后, 可以打开浏览器访问 'http://localhost:2015' 23 | 24 | ![start](https://github.com/FlowCI/docs/raw/master/_images/start_server.gif) 25 | 26 | > 默认的端口,和数据路径可以从 [server.sh](./server.sh) 和 [server.yml](./server.yml) 中修改 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Install from Docker within a minute | [1 分钟从 Docker 安装](./README_CN.md) 2 | 3 | ## Per-requirements 4 | 5 | - [Docker](https://docs.docker.com/install/) installed 6 | - [Docker-Compose](https://docs.docker.com/compose/install/) installed 7 | - Mac/Linux/Windows 8 | - Recommand 4 Cores, 8G RAM, and more than 60G free disk space 9 | 10 | ## Install 11 | 12 | ```bash 13 | git clone https://github.com/FlowCI/docker-install.git flow-docker 14 | cd flow-docker 15 | ./server.sh start 16 | 17 | # ./server.sh help for more detail 18 | ``` 19 | 20 | After all services started, open web browser with url 'http://localhost:2015' 21 | 22 | ![start](https://github.com/FlowCI/docs/raw/master/_images/start_server.gif) 23 | 24 | > The default ports and data path can be changed from [server.sh](./server.sh) and [server.yml](./server.yml) 25 | 26 | 27 | # Install on Kubernetes by Helm Chart 28 | 29 | ```bash 30 | helm repo add flow.ci https://flowci.github.io/helm-chart/ 31 | helm repo update 32 | 33 | kubectl create ns flowci 34 | helm install flow.ci flow.ci/flow.ci -n flowci 35 | ``` -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 flow.ci 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /server.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ## The script used to start flow.ci server from docker-compose ## 4 | 5 | printHelp() 6 | { 7 | echo "" 8 | echo "Usage: $0 [OPTIONS] COMMAND" 9 | 10 | echo "" 11 | echo "Example: ./server.sh -h 172.20.2.1 start" 12 | 13 | echo "" 14 | echo "Options:" 15 | echo -e " -h\t Host ip address" 16 | 17 | echo "" 18 | echo "Commands:" 19 | echo -e " start\t start ci server" 20 | echo -e " stop\t stop ci server" 21 | echo -e " down\t remove ci server containers" 22 | echo -e " help\t print help message" 23 | 24 | exit 1 # Exit script after printing help 25 | } 26 | 27 | initEnv() 28 | { 29 | ## setup ports 30 | export FLOWCI_WEB_PORT=2015 31 | export FLOWCI_SERVER_PORT=8080 32 | 33 | ## setup urls 34 | ## $HOST is the ip address of host, it can be gained from setDefaultValue func automatically 35 | export FLOWCI_SERVER_URL="http://$HOST:$FLOWCI_SERVER_PORT" 36 | export FLOWCI_WEB_URL="http://$HOST:$FLOWCI_WEB_PORT" 37 | 38 | ## setup minio keys 39 | export FLOWCI_DEFAULT_MINIO_ROOT_USER=minio 40 | export FLOWCI_DEFAULT_MINIO_ROOT_PASSWORD=minio123 41 | 42 | ## setup agnet volumes for local auto agent 43 | export FLOWCI_AGENT_VOLUMES="name=pyenv,dest=/ci/python,script=init.sh,image=flowci/pyenv,init=init-pyenv-volume.sh" 44 | 45 | ## setup data path 46 | export FLOWCI_DATABASE_DIR="$HOME/.flowci/db" 47 | export FLOWCI_WORKSPACE_DIR="$HOME/.flowci/ws" 48 | export FLOWCI_DATA_DIR="$HOME/.flowci/data" 49 | 50 | mkdir -p $FLOWCI_DATABASE_DIR 51 | mkdir -p $FLOWCI_WORKSPACE_DIR 52 | mkdir -p $FLOWCI_DATA_DIR 53 | } 54 | 55 | printInfo() 56 | { 57 | echo "" 58 | echo "[INFO] Server URL: $FLOWCI_SERVER_URL" 59 | 60 | echo "" 61 | echo -e "\xF0\x9f\x8d\xba HOW TO:" 62 | echo -e "\xF0\x9F\x91\x89 Open Web UI:\t http://$FLOWCI_WEB_URL" 63 | echo -e "\xF0\x9F\x91\x89 Start Agent:\t ./agent.sh -u $FLOWCI_SERVER_URL -t your_agent_token start" 64 | echo "" 65 | } 66 | 67 | setDefaultValue() 68 | { 69 | if [[ ! -n $HOST ]]; then 70 | if [[ $OSTYPE == "darwin"* ]]; then 71 | HOST=$(ipconfig getifaddr en0) 72 | echo "[WARN]: Host ip not defined, using ip $HOST" 73 | 74 | elif [[ $OSTYPE == "linux"* ]]; then 75 | interface=$(awk '$2 == 00000000 { print $1 }' /proc/net/route| head -1) 76 | HOST=$(ip addr show ${interface} 2>/dev/null| grep "inet\b" | awk '{print $2}' | cut -d/ -f1) 77 | echo "[WARN]: Host ip not defined, using ip $HOST" 78 | 79 | else 80 | echo "[WARN]: Host ip addr cannot detected, please specify ip or host name by -h your_ip_or_host_name" 81 | exit 1 82 | fi 83 | fi 84 | } 85 | 86 | pullAgentImage() 87 | { 88 | img=$(docker images flowci/agent:latest --format "{{.ID}}") 89 | if [[ ! -n $img ]]; then 90 | echo "[INFO] Pull agent docker image.." 91 | docker pull flowci/agent:latest 92 | fi 93 | } 94 | 95 | while getopts ":h:" arg; do 96 | case $arg in 97 | h) HOST=$OPTARG;; 98 | esac 99 | done 100 | 101 | COMMAND="${@: -1}" 102 | 103 | case $COMMAND in 104 | start) 105 | pullAgentImage 106 | setDefaultValue 107 | initEnv 108 | printInfo 109 | docker-compose -f server.yml up -d 110 | ;; 111 | 112 | stop) 113 | initEnv 114 | docker-compose -f server.yml stop 115 | ;; 116 | 117 | down) 118 | initEnv 119 | docker-compose -f server.yml down 120 | ;; 121 | 122 | *) 123 | printHelp 124 | ;; 125 | esac 126 | -------------------------------------------------------------------------------- /server.yml: -------------------------------------------------------------------------------- 1 | ## Docker-Compose file is used to start flow.ci services 2 | 3 | version: "3.4" 4 | 5 | services: 6 | db: 7 | image: mongo:6 8 | restart: always 9 | container_name: flowci-db 10 | volumes: 11 | - "$FLOWCI_DATABASE_DIR:/data/db" 12 | ports: 13 | - "27017:27017" 14 | entrypoint: ["/usr/bin/mongod", "--port", "27017", "--replSet", "rs0", "--bind_ip_all"] 15 | networks: 16 | flowci_net: 17 | ipv4_address: 172.1.3.1 18 | 19 | db-setup: 20 | image: flowci/mongosh 21 | container_name: flowci-db-setup 22 | depends_on: 23 | - db 24 | volumes: 25 | - ./mongodb:/ws 26 | entrypoint: "/ws/mongo_init.sh" 27 | networks: 28 | flowci_net: 29 | ipv4_address: 172.1.3.11 30 | 31 | zk: 32 | image: zookeeper:3.6 33 | container_name: flowci-zk 34 | restart: always 35 | ports: 36 | - "2181:2181" 37 | networks: 38 | flowci_net: 39 | ipv4_address: 172.1.3.2 40 | 41 | rabbitmq: 42 | image: rabbitmq:3-management 43 | container_name: flowci-rabbitmq 44 | restart: always 45 | ports: 46 | - "5672:5672" 47 | - "15672:15672" 48 | networks: 49 | flowci_net: 50 | ipv4_address: 172.1.3.3 51 | 52 | minio: 53 | image: quay.io/minio/minio:RELEASE.2023-12-02T10-51-33Z 54 | container_name: flowci-minio 55 | restart: always 56 | environment: 57 | MINIO_ROOT_USER: $FLOWCI_DEFAULT_MINIO_ROOT_USER 58 | MINIO_ROOT_PASSWORD: $FLOWCI_DEFAULT_MINIO_ROOT_PASSWORD 59 | ports: 60 | - "9000:9000" 61 | - "9090:9090" 62 | volumes: 63 | - "$FLOWCI_DATA_DIR:/data" 64 | command: "server /data --console-address \":9090\"" 65 | networks: 66 | flowci_net: 67 | ipv4_address: 172.1.3.4 68 | 69 | core: 70 | image: flowci/core 71 | container_name: flowci-core 72 | restart: always 73 | ports: 74 | - "$FLOWCI_SERVER_PORT:8080" 75 | volumes: 76 | - "$FLOWCI_WORKSPACE_DIR:/root/.flow.ci" 77 | - "/var/run/docker.sock:/var/run/docker.sock" 78 | environment: 79 | FLOWCI_LOG_LEVEL: DEBUG 80 | FLOWCI_SERVER_URL: $FLOWCI_SERVER_URL 81 | FLOWCI_WEB_URL: $FLOWCI_SERVER_URL 82 | FLOWCI_MONGODB_URI: mongodb://flowci:flowci@db:27017/flow_ci_db?authSource=admin 83 | FLOWCI_RABBITMQ_URI: amqp://guest:guest@rabbitmq:5672 84 | FLOWCI_MINIO_ENDPOINT: http://minio:9000 85 | FLOWCI_MINIO_KEY: $FLOWCI_DEFAULT_MINIO_ROOT_USER 86 | FLOWCI_MINIO_SECRET: $FLOWCI_DEFAULT_MINIO_ROOT_PASSWORD 87 | FLOWCI_ZK_HOST: zk 88 | FLOWCI_AGENT_VOLUMES: $FLOWCI_AGENT_VOLUMES 89 | command: 90 | [ 91 | "./wait_for_it.sh", 92 | "rabbitmq:5672", 93 | "-t", 94 | "0", 95 | "--strict", 96 | "--", 97 | "java", 98 | "-XX:-UseAdaptiveSizePolicy", 99 | "-Xms1500m", 100 | "-Xmx1500m", 101 | "-Xmn900m", 102 | "-XX:SurvivorRatio=5", 103 | "-jar", 104 | "flowci-core.jar", 105 | ] 106 | depends_on: 107 | - rabbitmq 108 | - db 109 | - zk 110 | - minio 111 | networks: 112 | flowci_net: 113 | ipv4_address: 172.1.2.1 114 | 115 | web: 116 | image: flowci/web 117 | container_name: flowci-web 118 | restart: always 119 | ports: 120 | - "$FLOWCI_WEB_PORT:80" 121 | environment: 122 | FLOWCI_SERVER_URL: $FLOWCI_SERVER_URL 123 | networks: 124 | flowci_net: 125 | ipv4_address: 172.1.1.1 126 | 127 | networks: 128 | flowci_net: 129 | ipam: 130 | driver: default 131 | config: 132 | - subnet: "172.1.0.0/16" 133 | -------------------------------------------------------------------------------- /agent.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ## The script used to start flow.ci agent from docker ## 4 | 5 | printHelp() 6 | { 7 | echo "" 8 | echo "Usage: $0 [OPTIONS] COMMAND" 9 | 10 | echo "" 11 | echo "Example: ./agent.sh -u http://172.20.10.4:8080 -t token_from_ci_server -m docker start" 12 | 13 | echo "" 14 | echo "Options:" 15 | echo -e " -t\t Agent token from ci server" 16 | echo -e " -u\t Server url" 17 | echo -e " -m\t Start agent by or " 18 | 19 | echo "" 20 | echo "Commands:" 21 | echo -e " start\t start an agent" 22 | echo -e " stop\t stop an agnet" 23 | echo -e " clean\t remove agent container" 24 | echo -e " help\t print help message" 25 | 26 | exit 1 # Exit script after printing help 27 | } 28 | 29 | checkUrlArg() 30 | { 31 | if [[ ! -n $URL ]]; then 32 | echo "[ERROR] Server url is missing..." 33 | printHelp 34 | fi 35 | } 36 | 37 | checkTokenArg() 38 | { 39 | if [[ ! -n $TOKEN ]]; then 40 | echo "[ERROR] Agent token is missing..." 41 | printHelp 42 | fi 43 | } 44 | 45 | startAgent() 46 | { 47 | echo $URL 48 | echo $TOKEN 49 | echo $MODEL 50 | 51 | if [[ $MODEL == "docker" ]]; then 52 | startFromDocker 53 | elif [[ $MODEL == "binary" ]]; then 54 | startFromBinary 55 | else 56 | echo "[WARN] Agent start model not defined, using default docker agent" 57 | startFromDocker 58 | fi 59 | } 60 | 61 | startFromBinary() 62 | { 63 | mkdir -p ./bin 64 | target_bin=./bin/flow-agent-x 65 | 66 | if [[ ! -f $target_bin ]]; then 67 | if [[ $OSTYPE == "darwin"* ]]; then 68 | curl -L -o $target_bin https://github.com/FlowCI/flow-agent-x/releases/download/v$AGENT_VERSION/flow-agent-x-mac 69 | 70 | elif [[ $OSTYPE == "linux"* ]]; then 71 | curl -L -o $target_bin https://github.com/FlowCI/flow-agent-x/releases/download/v$AGENT_VERSION/flow-agent-x-linux 72 | 73 | else 74 | echo "[WARN]: Agent not supported for os $OSTYPE" 75 | exit 1 76 | fi 77 | fi 78 | 79 | chmod +x $target_bin 80 | 81 | AGENT_HOST_DIR=$HOME/.agent.$TOKEN 82 | mkdir -p $AGENT_HOST_DIR 83 | 84 | echo "Starting agent from binary" 85 | $target_bin -u $URL -t $TOKEN -w $AGENT_HOST_DIR -m "name=pyenv,dest=/ci/python,script=init.sh,image=flowci/pyenv,init=init-pyenv-volume.sh" 86 | } 87 | 88 | startFromDocker() 89 | { 90 | AGENT_HOST_DIR=$HOME/.agent.$TOKEN 91 | mkdir -p $AGENT_HOST_DIR 92 | 93 | if [[ -n $RUNNING_CONTAINER ]]; then 94 | 95 | echo "Agent with token $TOKEN is running" 96 | 97 | elif [[ -n $EXISTED_CONTAINER ]]; then 98 | 99 | echo "Agent with token $TOKEN will restarted" 100 | docker start -i $EXISTED_CONTAINER 101 | 102 | else 103 | docker run -it \ 104 | --name $CONTAINER_NAME \ 105 | -e FLOWCI_SERVER_URL=$URL \ 106 | -e FLOWCI_AGENT_TOKEN=$TOKEN \ 107 | -e FLOWCI_AGENT_VOLUMES="name=pyenv,dest=/ci/python,script=init.sh,image=flowci/pyenv,init=init-pyenv-volume.sh" \ 108 | -e FLOWCI_AGENT_WORKSPACE="/ws" \ 109 | -v $AGENT_HOST_DIR:/ws \ 110 | -v pyenv:/ci/python \ 111 | -v /var/run/docker.sock:/var/run/docker.sock \ 112 | flowci/agent:$AGENT_VERSION 113 | fi 114 | } 115 | 116 | while getopts ":u:t:m:" arg; do 117 | case $arg in 118 | u) URL=$OPTARG;; 119 | t) TOKEN=$OPTARG;; 120 | m) MODEL=$OPTARG;; 121 | esac 122 | done 123 | 124 | AGENT_VERSION=0.21.21 125 | COMMAND="${@: -1}" 126 | CONTAINER_NAME="flowci-agent-$TOKEN" 127 | RUNNING_CONTAINER=$(docker ps -aq -f name=$CONTAINER_NAME -f status=running) 128 | EXISTED_CONTAINER=$(docker ps -aq -f name=$CONTAINER_NAME -f status=exited) 129 | 130 | case $COMMAND in 131 | start) 132 | checkUrlArg 133 | checkTokenArg 134 | startAgent 135 | ;; 136 | 137 | stop) 138 | checkTokenArg 139 | docker stop $CONTAINER_NAME 140 | ;; 141 | 142 | clean) 143 | checkTokenArg 144 | docker rm -f $CONTAINER_NAME 145 | ;; 146 | 147 | *) 148 | printHelp 149 | ;; 150 | esac 151 | --------------------------------------------------------------------------------