clouddreamai-cicd-setup 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -83,21 +83,18 @@ deploy_dev:
83
83
  ENV_FILE_CONTENT: $DEV_ENV_FILE
84
84
  DEPLOY_DIR: "{{DEPLOY_DIR}}"
85
85
  APP_PORT: "{{DEV_PORT}}"
86
+ REGISTRY_TYPE: "{{REGISTRY_TYPE}}"
86
87
  cache: {}
87
88
  before_script:
88
- - apk add --no-cache openssh-client docker-compose bash openssl rsync
89
- - eval $(ssh-agent -s)
89
+ - apk add --no-cache sshpass bash openssl rsync
90
90
  - mkdir -p ~/.ssh
91
91
  - chmod 700 ~/.ssh
92
- - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - 2>/dev/null || (echo "无法加载SSH密钥,尝试不同格式..." && echo "$SSH_PRIVATE_KEY" | base64 -d | ssh-add - 2>/dev/null || echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa && ssh-add ~/.ssh/id_rsa)
93
- - ssh-keyscan $TEST_SERVER_HOST >> ~/.ssh/known_hosts
94
92
  - chmod 644 ~/.ssh/known_hosts
95
93
  script:
96
- - ssh root@$TEST_SERVER_HOST "mkdir -p $DEPLOY_DIR"
97
- - ssh root@$TEST_SERVER_HOST "which rsync || apk add --no-cache rsync"
98
- - rsync -avz --delete --exclude='.git/' --exclude='node_modules/' . root@$TEST_SERVER_HOST:$DEPLOY_DIR/
99
- - ssh root@$TEST_SERVER_HOST "export DOCKER_HUB_USERNAME='$DOCKER_HUB_USERNAME' && export DOCKER_HUB_PASSWORD='$DOCKER_HUB_PASSWORD' && export APP_PORT='$APP_PORT' && cd $DEPLOY_DIR && chmod +x ci/deploy.sh && bash ci/deploy.sh $ENV_TYPE"
100
- - ssh root@$TEST_SERVER_HOST "sleep 30 && curl -f http://localhost:$APP_PORT/ || exit 1"
94
+ - sshpass -p "$SSH_PASSWORD" ssh root@$TEST_SERVER_HOST "mkdir -p $DEPLOY_DIR"
95
+ - sshpass -p "$SSH_PASSWORD" ssh root@$TEST_SERVER_HOST "which rsync || apk add --no-cache rsync"
96
+ - sshpass -p "$SSH_PASSWORD" rsync -avz --delete --exclude='.git/' --exclude='node_modules/' . root@$TEST_SERVER_HOST:$DEPLOY_DIR/
97
+ - sshpass -p "$SSH_PASSWORD" ssh root@$TEST_SERVER_HOST "export DOCKER_HUB_USERNAME='$DOCKER_HUB_USERNAME' && export DOCKER_HUB_PASSWORD='$DOCKER_HUB_PASSWORD' && export APP_PORT='$APP_PORT' && cd $DEPLOY_DIR && chmod +x ci/deploy.sh && bash ci/deploy.sh $ENV_TYPE $REGISTRY_TYPE"
101
98
  environment:
102
99
  name: development
103
100
  url: {{DEV_URL}}
@@ -115,21 +112,18 @@ deploy_prod:
115
112
  ENV_FILE_CONTENT: $PROD_ENV_FILE
116
113
  DEPLOY_DIR: "{{DEPLOY_DIR}}"
117
114
  APP_PORT: "{{PROD_PORT}}"
115
+ REGISTRY_TYPE: "{{REGISTRY_TYPE}}"
118
116
  cache: {}
119
117
  before_script:
120
- - apk add --no-cache openssh-client docker-compose bash openssl rsync
121
- - eval $(ssh-agent -s)
118
+ - apk add --no-cache sshpass bash openssl rsync
122
119
  - mkdir -p ~/.ssh
123
120
  - chmod 700 ~/.ssh
124
- - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - 2>/dev/null || (echo "无法加载SSH密钥,尝试不同格式..." && echo "$SSH_PRIVATE_KEY" | base64 -d | ssh-add - 2>/dev/null || echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa && ssh-add ~/.ssh/id_rsa)
125
- - ssh-keyscan $PROD_SERVER_HOST >> ~/.ssh/known_hosts
126
121
  - chmod 644 ~/.ssh/known_hosts
127
122
  script:
128
- - ssh root@$PROD_SERVER_HOST "mkdir -p $DEPLOY_DIR"
129
- - ssh root@$PROD_SERVER_HOST "which rsync || apk add --no-cache rsync"
130
- - rsync -avz --delete --exclude='.git/' --exclude='node_modules/' . root@$PROD_SERVER_HOST:$DEPLOY_DIR/
131
- - ssh root@$PROD_SERVER_HOST "export DOCKER_HUB_USERNAME='$DOCKER_HUB_USERNAME' && export DOCKER_HUB_PASSWORD='$DOCKER_HUB_PASSWORD' && export APP_PORT='$APP_PORT' && cd $DEPLOY_DIR && chmod +x ci/deploy.sh && bash ci/deploy.sh $ENV_TYPE"
132
- - ssh root@$PROD_SERVER_HOST "sleep 30 && curl -f http://localhost:$APP_PORT/ || exit 1"
123
+ - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "mkdir -p $DEPLOY_DIR"
124
+ - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "which rsync || apk add --no-cache rsync"
125
+ - sshpass -p "$SSH_PASSWORD" rsync -avz --delete --exclude='.git/' --exclude='node_modules/' . root@$PROD_SERVER_HOST:$DEPLOY_DIR/
126
+ - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "export DOCKER_HUB_USERNAME='$DOCKER_HUB_USERNAME' && export DOCKER_HUB_PASSWORD='$DOCKER_HUB_PASSWORD' && export APP_PORT='$APP_PORT' && cd $DEPLOY_DIR && chmod +x ci/deploy.sh && bash ci/deploy.sh $ENV_TYPE $REGISTRY_TYPE"
133
127
  environment:
134
128
  name: production
135
129
  url: {{PROD_URL}}
@@ -149,16 +143,13 @@ rollback:
149
143
  cache: {}
150
144
  before_script:
151
145
  - apk add --no-cache openssh-client openssl
152
- - eval $(ssh-agent -s)
153
146
  - mkdir -p ~/.ssh
154
147
  - chmod 700 ~/.ssh
155
- - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - 2>/dev/null || (echo "无法加载SSH密钥,尝试不同格式..." && echo "$SSH_PRIVATE_KEY" | base64 -d | ssh-add - 2>/dev/null || echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa && ssh-add ~/.ssh/id_rsa)
156
- - ssh-keyscan $PROD_SERVER_HOST >> ~/.ssh/known_hosts
157
148
  - chmod 644 ~/.ssh/known_hosts
158
149
  script:
159
- - ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose down"
160
- - ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose pull"
161
- - ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose up -d"
150
+ - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose down"
151
+ - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose pull"
152
+ - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose up -d"
162
153
  environment:
163
154
  name: production
164
155
  url: {{PROD_URL}}
@@ -9,16 +9,76 @@ set -e
9
9
  APP_NAME="{{APP_NAME}}"
10
10
  DEPLOY_PATH="{{DEPLOY_DIR}}"
11
11
  ENV_TYPE=${1:-development}
12
+ REGISTRY_TYPE=${2:-dockerhub} # 镜像仓库类型: gitlab, dockerhub, custom, none
12
13
 
13
- # 根据环境设置端口
14
+ # 根据环境设置端口和域名
14
15
  if [ "$ENV_TYPE" = "production" ]; then
15
16
  export APP_PORT={{PROD_PORT}}
17
+ export DOMAIN="{{PROD_DOMAIN}}"
16
18
  else
17
19
  export APP_PORT={{DEV_PORT}}
20
+ export DOMAIN="{{DEV_DOMAIN}}"
18
21
  fi
19
22
 
20
23
  echo "开始部署 $APP_NAME 到 $ENV_TYPE 环境 (端口: $APP_PORT)..."
21
24
 
25
+ # Nginx 反向代理配置函数
26
+ configure_nginx_proxy() {
27
+ local DOMAIN=$1
28
+ local PORT=$2
29
+
30
+ if [ -z "$DOMAIN" ]; then
31
+ echo "跳过 Nginx 配置(未提供域名)"
32
+ return
33
+ fi
34
+
35
+ echo "配置 Nginx 反向代理: $DOMAIN -> localhost:$PORT"
36
+
37
+ # 检查宝塔是否安装
38
+ if [ ! -d "/www/server/panel/vhost/nginx" ]; then
39
+ echo "警告:未检测到宝塔面板,跳过 Nginx 配置"
40
+ return
41
+ fi
42
+
43
+ # 创建 Nginx 配置
44
+ cat > /www/server/panel/vhost/nginx/${DOMAIN}.conf << EOF
45
+ # 由 CloudDreamAI CI/CD 自动生成 - $(date)
46
+ server {
47
+ listen 80;
48
+ server_name ${DOMAIN};
49
+
50
+ access_log /www/wwwlogs/${DOMAIN}.log;
51
+ error_log /www/wwwlogs/${DOMAIN}.error.log;
52
+
53
+ location / {
54
+ proxy_pass http://127.0.0.1:${PORT};
55
+ proxy_set_header Host \$host;
56
+ proxy_set_header X-Real-IP \$remote_addr;
57
+ proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
58
+ proxy_set_header X-Forwarded-Proto \$scheme;
59
+
60
+ # WebSocket 支持
61
+ proxy_http_version 1.1;
62
+ proxy_set_header Upgrade \$http_upgrade;
63
+ proxy_set_header Connection "upgrade";
64
+
65
+ # 超时设置
66
+ proxy_connect_timeout 60s;
67
+ proxy_send_timeout 60s;
68
+ proxy_read_timeout 60s;
69
+ }
70
+ }
71
+ EOF
72
+
73
+ # 重载 Nginx
74
+ if command -v nginx &> /dev/null; then
75
+ nginx -t && nginx -s reload
76
+ echo "✓ Nginx 配置已更新并重载"
77
+ else
78
+ echo "警告:未找到 nginx 命令,请手动重载 Nginx"
79
+ fi
80
+ }
81
+
22
82
  # 确保目录存在
23
83
  mkdir -p $DEPLOY_PATH
24
84
 
@@ -96,35 +156,78 @@ fi
96
156
  # 拉取最新镜像并启动Docker容器
97
157
  echo "拉取最新镜像并启动Docker容器..."
98
158
 
99
- # 登录Docker Hub(如果设置了凭据)
100
- if [ -n "$DOCKER_HUB_USERNAME" ] && [ -n "$DOCKER_HUB_PASSWORD" ]; then
101
- echo "登录Docker Hub..."
102
- echo "$DOCKER_HUB_PASSWORD" | docker login -u "$DOCKER_HUB_USERNAME" --password-stdin
159
+ # 根据Registry类型登录
160
+ if [ "$REGISTRY_TYPE" = "gitlab" ]; then
161
+ # GitLab Container Registry
162
+ if [ -n "$REGISTRY_URL" ] && [ -n "$REGISTRY_USERNAME" ] && [ -n "$REGISTRY_PASSWORD" ]; then
163
+ echo "登录 GitLab Container Registry: $REGISTRY_URL"
164
+ echo "$REGISTRY_PASSWORD" | docker login -u "$REGISTRY_USERNAME" --password-stdin "$REGISTRY_URL"
165
+ else
166
+ echo "警告:未设置 GitLab Registry 凭据"
167
+ fi
168
+ elif [ "$REGISTRY_TYPE" = "dockerhub" ]; then
169
+ # Docker Hub
170
+ if [ -n "$DOCKER_HUB_USERNAME" ] && [ -n "$DOCKER_HUB_PASSWORD" ]; then
171
+ echo "登录 Docker Hub..."
172
+ echo "$DOCKER_HUB_PASSWORD" | docker login -u "$DOCKER_HUB_USERNAME" --password-stdin
173
+ else
174
+ echo "未设置 Docker Hub 凭据,尝试匿名拉取镜像..."
175
+ fi
176
+ elif [ "$REGISTRY_TYPE" = "custom" ]; then
177
+ # 自建 Registry
178
+ if [ -n "$REGISTRY_URL" ] && [ -n "$REGISTRY_USERNAME" ] && [ -n "$REGISTRY_PASSWORD" ]; then
179
+ echo "登录自建 Registry: $REGISTRY_URL"
180
+ echo "$REGISTRY_PASSWORD" | docker login -u "$REGISTRY_USERNAME" --password-stdin "$REGISTRY_URL"
181
+ else
182
+ echo "错误:未设置自建 Registry 凭据"
183
+ exit 1
184
+ fi
185
+ elif [ "$REGISTRY_TYPE" = "none" ]; then
186
+ # 不使用 Registry,仅本地构建
187
+ echo "不使用镜像仓库,将使用本地构建..."
103
188
  else
104
- echo "未设置Docker Hub凭据,尝试匿名拉取镜像..."
189
+ echo "警告:未知的 Registry 类型: $REGISTRY_TYPE,尝试使用 Docker Hub..."
190
+ if [ -n "$DOCKER_HUB_USERNAME" ] && [ -n "$DOCKER_HUB_PASSWORD" ]; then
191
+ echo "$DOCKER_HUB_PASSWORD" | docker login -u "$DOCKER_HUB_USERNAME" --password-stdin
192
+ fi
105
193
  fi
106
194
 
107
195
  # 停止并移除旧容器
108
196
  echo "清理现有容器..."
109
197
  docker-compose down --remove-orphans || true
110
- docker container ls -a | grep '$APP_NAME' | awk '{print $1}' | xargs -r docker container rm -f
198
+ docker container ls -a | grep "$APP_NAME" | awk '{print $1}' | xargs -r docker container rm -f
111
199
 
112
- # 尝试拉取镜像
113
- echo "尝试拉取Docker Hub镜像..."
114
- if docker-compose pull; then
115
- echo "镜像拉取成功,启动容器..."
116
- APP_PORT=$APP_PORT docker-compose up -d
117
- else
118
- echo "无法从Docker Hub拉取镜像,检查是否存在Dockerfile进行本地构建..."
200
+ # 尝试拉取镜像或本地构建
201
+ if [ "$REGISTRY_TYPE" = "none" ]; then
202
+ # 仅使用本地构建
203
+ echo "使用本地构建模式..."
119
204
  if [ -f "Dockerfile" ]; then
120
205
  echo "找到Dockerfile,进行本地构建..."
121
206
  export DOCKER_IMAGE="$APP_NAME:local"
122
207
  docker build -t $DOCKER_IMAGE .
123
208
  APP_PORT=$APP_PORT docker-compose up -d
124
209
  else
125
- echo "错误:无法拉取镜像且未找到Dockerfile,部署失败"
210
+ echo "错误:未找到Dockerfile,无法本地构建"
126
211
  exit 1
127
212
  fi
213
+ else
214
+ # 尝试从Registry拉取镜像
215
+ echo "尝试从镜像仓库拉取镜像..."
216
+ if docker-compose pull; then
217
+ echo "镜像拉取成功,启动容器..."
218
+ APP_PORT=$APP_PORT docker-compose up -d
219
+ else
220
+ echo "无法从镜像仓库拉取镜像,检查是否存在Dockerfile进行本地构建..."
221
+ if [ -f "Dockerfile" ]; then
222
+ echo "找到Dockerfile,进行本地构建..."
223
+ export DOCKER_IMAGE="$APP_NAME:local"
224
+ docker build -t $DOCKER_IMAGE .
225
+ APP_PORT=$APP_PORT docker-compose up -d
226
+ else
227
+ echo "错误:无法拉取镜像且未找到Dockerfile,部署失败"
228
+ exit 1
229
+ fi
230
+ fi
128
231
  fi
129
232
 
130
233
  # 检查部署状态
@@ -138,4 +241,7 @@ else
138
241
  exit 1
139
242
  fi
140
243
 
244
+ # 配置 Nginx 反向代理
245
+ configure_nginx_proxy "$DOMAIN" "$APP_PORT"
246
+
141
247
  echo "部署完成!"