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.
- package/README.md +421 -92
- package/dist/cli.js +5 -2
- package/dist/cli.js.map +1 -1
- package/dist/core/gitlab-client.d.ts.map +1 -1
- package/dist/core/gitlab-client.js +0 -4
- package/dist/core/gitlab-client.js.map +1 -1
- package/dist/core/types.d.ts +26 -7
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/variables.d.ts.map +1 -1
- package/dist/core/variables.js +54 -47
- package/dist/core/variables.js.map +1 -1
- package/dist/utils/prompts.d.ts +8 -8
- package/dist/utils/prompts.d.ts.map +1 -1
- package/dist/utils/prompts.js +192 -147
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/template.d.ts +13 -5
- package/dist/utils/template.d.ts.map +1 -1
- package/dist/utils/template.js +77 -12
- package/dist/utils/template.js.map +1 -1
- package/package.json +1 -1
- package/templates/docker-compose/nestjs.yml +17 -0
- package/templates/docker-compose/vue.yml +15 -0
- package/templates/gitlab-ci/nestjs-gitlab.yml +170 -0
- package/templates/gitlab-ci/nestjs.yml +15 -24
- package/templates/gitlab-ci/vue-gitlab.yml +168 -0
- package/templates/gitlab-ci/vue.yml +15 -24
- package/templates/scripts/deploy.sh +121 -15
|
@@ -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
|
|
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
|
|
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
|
-
#
|
|
100
|
-
if [
|
|
101
|
-
|
|
102
|
-
|
|
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 "
|
|
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
|
|
198
|
+
docker container ls -a | grep "$APP_NAME" | awk '{print $1}' | xargs -r docker container rm -f
|
|
111
199
|
|
|
112
|
-
#
|
|
113
|
-
|
|
114
|
-
|
|
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 "
|
|
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 "部署完成!"
|