#!/bin/bash # Drone CI 安装脚本(轻量级,适合个人小团队) # 支持 CentOS/RHEL 系统 set -e # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 配置变量 GERRIT_HOST="${GERRIT_HOST:-101.43.95.130}" GERRIT_PORT="${GERRIT_PORT:-8080}" DRONE_PORT="${DRONE_PORT:-3000}" DRONE_DATA_DIR="/opt/drone" DRONE_RPC_SECRET="" echo -e "${GREEN}========================================${NC}" echo -e "${GREEN}Drone CI 自动化安装脚本${NC}" echo -e "${GREEN}(轻量级,适合个人小团队)${NC}" echo -e "${GREEN}========================================${NC}" # 检查 Docker check_docker() { echo -e "${GREEN}检查 Docker 环境...${NC}" if ! command -v docker &> /dev/null; then echo -e "${YELLOW}未检测到 Docker,正在安装...${NC}" # 安装 Docker sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io sudo systemctl start docker sudo systemctl enable docker fi # 检查 Docker 服务状态 if ! sudo systemctl is-active --quiet docker; then echo -e "${YELLOW}启动 Docker 服务...${NC}" sudo systemctl start docker fi echo -e "${GREEN}Docker 版本: $(docker --version)${NC}" } # 生成 RPC Secret generate_rpc_secret() { echo -e "${GREEN}生成 RPC Secret...${NC}" if command -v openssl &> /dev/null; then DRONE_RPC_SECRET=$(openssl rand -hex 16) else DRONE_RPC_SECRET=$(date +%s | sha256sum | base64 | head -c 32) fi echo -e "${GREEN}RPC Secret 已生成${NC}" } # 创建数据目录 create_directories() { echo -e "${GREEN}创建数据目录...${NC}" sudo mkdir -p ${DRONE_DATA_DIR} sudo chmod 755 ${DRONE_DATA_DIR} echo -e "${GREEN}目录创建完成: ${DRONE_DATA_DIR}${NC}" } # 安装 Drone Server install_drone_server() { echo -e "${GREEN}安装 Drone Server...${NC}" # 停止并删除旧容器(如果存在) sudo docker stop drone 2>/dev/null || true sudo docker rm drone 2>/dev/null || true # 运行 Drone Server sudo docker run -d \ --name=drone \ --restart=always \ --volume=${DRONE_DATA_DIR}:/data \ --env=DRONE_GERRIT_SERVER=http://${GERRIT_HOST}:${GERRIT_PORT} \ --env=DRONE_GERRIT_USERNAME=admin \ --env=DRONE_GERRIT_PASSWORD="" \ --env=DRONE_RPC_SECRET=${DRONE_RPC_SECRET} \ --env=DRONE_SERVER_HOST=${GERRIT_HOST}:${DRONE_PORT} \ --env=DRONE_SERVER_PROTO=http \ --env=DRONE_USER_CREATE=username:admin,admin:true \ --publish=${DRONE_PORT}:80 \ drone/drone:latest echo -e "${GREEN}Drone Server 安装完成${NC}" } # 安装 Drone Runner install_drone_runner() { echo -e "${GREEN}安装 Drone Runner...${NC}" # 停止并删除旧容器(如果存在) sudo docker stop drone-runner 2>/dev/null || true sudo docker rm drone-runner 2>/dev/null || true # 运行 Drone Runner sudo docker run -d \ --name=drone-runner \ --restart=always \ --volume=/var/run/docker.sock:/var/run/docker.sock \ --env=DRONE_RPC_PROTO=http \ --env=DRONE_RPC_HOST=${GERRIT_HOST}:${DRONE_PORT} \ --env=DRONE_RPC_SECRET=${DRONE_RPC_SECRET} \ --env=DRONE_RUNNER_CAPACITY=2 \ --env=DRONE_RUNNER_NAME=runner-1 \ drone/drone-runner-docker:latest echo -e "${GREEN}Drone Runner 安装完成${NC}" } # 检查防火墙 check_firewall() { echo -e "${YELLOW}检查防火墙配置...${NC}" if command -v firewall-cmd &> /dev/null; then if sudo firewall-cmd --list-ports | grep -q "${DRONE_PORT}"; then echo -e "${GREEN}防火墙端口 ${DRONE_PORT} 已开放${NC}" else echo -e "${YELLOW}需要开放防火墙端口 ${DRONE_PORT}${NC}" echo -e "${YELLOW}执行: sudo firewall-cmd --permanent --add-port=${DRONE_PORT}/tcp && sudo firewall-cmd --reload${NC}" fi else echo -e "${YELLOW}未检测到 firewall-cmd,请手动检查防火墙${NC}" fi } # 创建 .drone.yml 示例 create_drone_yml_example() { echo -e "${GREEN}创建 .drone.yml 示例...${NC}" cat > /tmp/.drone.yml.example << 'EOF' # Drone CI 配置文件示例 # 将此文件复制到项目根目录并命名为 .drone.yml kind: pipeline type: docker name: default steps: - name: build image: maven:3.8-openjdk-17 commands: - echo "开始构建..." - mvn clean package - name: test image: maven:3.8-openjdk-17 commands: - echo "运行测试..." - mvn test - name: deploy image: alpine commands: - echo "部署应用..." # 在这里添加部署命令 --- # 如果是 Node.js 项目,使用以下配置: kind: pipeline type: docker name: nodejs steps: - name: install image: node:18 commands: - npm install - name: build image: node:18 commands: - npm run build - name: test image: node:18 commands: - npm test EOF echo -e "${GREEN}示例文件已保存到: /tmp/.drone.yml.example${NC}" } # 输出访问信息 print_info() { echo -e "${GREEN}========================================${NC}" echo -e "${GREEN}Drone CI 安装完成!${NC}" echo -e "${GREEN}========================================${NC}" echo -e "${YELLOW}访问地址:${NC}" echo -e " Drone CI Web 界面: http://${GERRIT_HOST}:${DRONE_PORT}" echo -e " Gerrit Web 界面: http://${GERRIT_HOST}:${GERRIT_PORT}" echo -e "" echo -e "${YELLOW}常用命令:${NC}" echo -e " 查看 Server 状态: sudo docker ps | grep drone" echo -e " 查看 Server 日志: sudo docker logs -f drone" echo -e " 查看 Runner 日志: sudo docker logs -f drone-runner" echo -e " 重启 Server: sudo docker restart drone" echo -e " 重启 Runner: sudo docker restart drone-runner" echo -e "" echo -e "${YELLOW}数据目录:${NC}" echo -e " ${DRONE_DATA_DIR}" echo -e "" echo -e "${YELLOW}下一步:${NC}" echo -e " 1. 访问 http://${GERRIT_HOST}:${DRONE_PORT}" echo -e " 2. 使用 admin 账号登录(首次登录会自动创建)" echo -e " 3. 在项目根目录创建 .drone.yml 配置文件" echo -e " 4. 参考示例: cat /tmp/.drone.yml.example" echo -e " 5. 在 Gerrit 项目设置中配置 Webhook:" echo -e " URL: http://${GERRIT_HOST}:${DRONE_PORT}/hook" echo -e " 事件: patchset-created, change-merged" echo -e "" echo -e "${YELLOW}配置 Gerrit Webhook:${NC}" echo -e " 1. 访问 Gerrit: http://${GERRIT_HOST}:${GERRIT_PORT}" echo -e " 2. 进入项目设置 → Webhooks" echo -e " 3. 添加 Webhook:" echo -e " URL: http://${GERRIT_HOST}:${DRONE_PORT}/hook" echo -e " 事件: patchset-created, change-merged" echo -e "${GREEN}========================================${NC}" } # 主函数 main() { check_docker generate_rpc_secret create_directories install_drone_server sleep 5 # 等待 Server 启动 install_drone_runner check_firewall create_drone_yml_example print_info } # 执行主函数 main