Commit 0f249b2a authored by xuchentao's avatar xuchentao

fix: simplify nginx ci job

parent cba14336
Pipeline #409 failed with stages
in 4 seconds
...@@ -93,7 +93,7 @@ deploy: ...@@ -93,7 +93,7 @@ deploy:
- echo "[deploy] 当前版本:$(readlink -f "$DEPLOY_ROOT/current")" - echo "[deploy] 当前版本:$(readlink -f "$DEPLOY_ROOT/current")"
# ── 4. 安装并验证 Nginx 配置 ───────────────────────── # ── 4. 安装并验证 Nginx 配置 ─────────────────────────
# 使用参数固定的 sudo 命令安装 current release 中的配置,并在失败时恢复上一份 # 复制 current release 中的配置,检查语法后重新加载 Nginx
configure_nginx: configure_nginx:
stage: nginx stage: nginx
tags: tags:
...@@ -102,51 +102,11 @@ configure_nginx: ...@@ -102,51 +102,11 @@ configure_nginx:
- main - main
script: script:
- echo "[nginx] 开始配置公网入口:$PUBLIC_HOST" - echo "[nginx] 开始配置公网入口:$PUBLIC_HOST"
- | - test -f "$DEPLOY_ROOT/current/deploy/nginx/sumeiqiao.conf" || (echo "缺少 Nginx 配置" && exit 2)
set -Eeuo pipefail - sudo -n /usr/bin/install -o root -g root -m 0644 "$DEPLOY_ROOT/current/deploy/nginx/sumeiqiao.conf" /etc/nginx/conf.d/sumeiqiao.conf
source_file="$DEPLOY_ROOT/current/deploy/nginx/sumeiqiao.conf" - sudo -n /usr/sbin/nginx -t
target_file="/etc/nginx/conf.d/sumeiqiao.conf" - sudo -n /usr/bin/systemctl reload nginx
backup_file="/etc/nginx/conf.d/sumeiqiao.conf.previous" - 'curl --fail --silent --show-error --max-time 5 --header "Host: $PUBLIC_HOST" http://127.0.0.1/ >/dev/null'
resolved_source=$(readlink -f "$source_file")
case "$resolved_source" in
"$RELEASES_DIR"/*/deploy/nginx/sumeiqiao.conf) ;;
*) echo "Nginx 配置不在当前项目 release 中:$resolved_source" >&2; exit 2 ;;
esac
test -f "$source_file" || (echo "缺少 Nginx 配置:$source_file" && exit 2)
test ! -L "$target_file" || (echo "拒绝覆盖软链接:$target_file" && exit 2)
exec 9>"$SHARED_DIR/nginx-config.lock"
flock -x 9
had_previous=0
if [ -f "$target_file" ]; then
sudo -n /usr/bin/install -o root -g root -m 0644 "$target_file" "$backup_file"
had_previous=1
fi
restore_previous() {
if [ "$had_previous" = "1" ]; then
sudo -n /usr/bin/install -o root -g root -m 0644 "$backup_file" "$target_file"
else
sudo -n /usr/bin/rm -f -- "$target_file"
fi
sudo -n /usr/sbin/nginx -t || true
sudo -n /usr/bin/systemctl reload nginx || true
}
sudo -n /usr/bin/install -o root -g root -m 0644 "$source_file" "$target_file"
if ! sudo -n /usr/sbin/nginx -t; then
echo "Nginx 配置检查失败,正在恢复上一份配置" >&2
restore_previous
exit 1
fi
if ! sudo -n /usr/bin/systemctl reload nginx; then
echo "Nginx 重新加载失败,正在恢复上一份配置" >&2
restore_previous
exit 1
fi
- curl --fail --silent --show-error --max-time 5 --header "Host: $PUBLIC_HOST" http://127.0.0.1/ >/dev/null
- echo "[nginx] Nginx 配置与公网入口验证完成" - echo "[nginx] Nginx 配置与公网入口验证完成"
# ── 5. 验证并只保留当前 + 上一个成功版本 ───────────── # ── 5. 验证并只保留当前 + 上一个成功版本 ─────────────
......
...@@ -106,7 +106,7 @@ CMS_DATA_DIR=/root/sumeiqiao/shared/cms-data ...@@ -106,7 +106,7 @@ CMS_DATA_DIR=/root/sumeiqiao/shared/cms-data
CMS_BUILD_LOCK=/root/sumeiqiao/shared/site-build.lock CMS_BUILD_LOCK=/root/sumeiqiao/shared/site-build.lock
``` ```
CI/CD 应在新的 release 目录部署代码,不要在正在运行的目录执行 `git clean`。仓库中的 `.gitlab-ci.yml` 兼容 GitLab 11.7,分为准备、安装、部署、配置 Nginx、验证五个阶段,每个阶段都会实时输出日志。安装依赖只操作尚未启用的独立 release;最终生产构建、切换 current 软链接、重启 PM2 和健康检查在同一把共享锁内完成。应用健康检查通过后才安装 Nginx 配置,安装失败会恢复上一份配置。健康检查失败时会自动切回上一版本。 CI/CD 应在新的 release 目录部署代码,不要在正在运行的目录执行 `git clean`。仓库中的 `.gitlab-ci.yml` 兼容 GitLab 11.7,分为准备、安装、部署、配置 Nginx、验证五个阶段,每个阶段都会实时输出日志。安装依赖只操作尚未启用的独立 release;最终生产构建、切换 current 软链接、重启 PM2 和健康检查在同一把共享锁内完成。应用健康检查通过后才复制 Nginx 配置、检查语法并 reload。健康检查失败时会自动切回上一版本。
```bash ```bash
node --env-file=/root/sumeiqiao/shared/.env scripts/run-with-site-lock.mjs -- bash scripts/deploy-release.sh /root/sumeiqiao /root/sumeiqiao/releases/<release> sumeiqiao /usr/bin/pm2 /root/.pm2 1 http://127.0.0.1:8789/ node --env-file=/root/sumeiqiao/shared/.env scripts/run-with-site-lock.mjs -- bash scripts/deploy-release.sh /root/sumeiqiao /root/sumeiqiao/releases/<release> sumeiqiao /usr/bin/pm2 /root/.pm2 1 http://127.0.0.1:8789/
...@@ -133,7 +133,7 @@ CMS_BUILD_LOCK=/root/sumeiqiao/shared/site-build.lock ...@@ -133,7 +133,7 @@ CMS_BUILD_LOCK=/root/sumeiqiao/shared/site-build.lock
CMS_PORT=8789 CMS_PORT=8789
``` ```
首次运行 pipeline 前,需要允许 Runner 执行参数固定的 Nginx 安装、检查、恢复和 reload 命令: 首次运行 pipeline 前,需要允许 Runner 执行参数固定的 Nginx 安装、检查和 reload 命令:
```bash ```bash
sudo visudo -f /etc/sudoers.d/sumeiqiao-runner sudo visudo -f /etc/sudoers.d/sumeiqiao-runner
...@@ -144,16 +144,13 @@ sudo visudo -f /etc/sudoers.d/sumeiqiao-runner ...@@ -144,16 +144,13 @@ sudo visudo -f /etc/sudoers.d/sumeiqiao-runner
```sudoers ```sudoers
Cmnd_Alias SUMEIQIAO_NGINX = \ Cmnd_Alias SUMEIQIAO_NGINX = \
/usr/bin/install -o root -g root -m 0644 /root/sumeiqiao/current/deploy/nginx/sumeiqiao.conf /etc/nginx/conf.d/sumeiqiao.conf, \ /usr/bin/install -o root -g root -m 0644 /root/sumeiqiao/current/deploy/nginx/sumeiqiao.conf /etc/nginx/conf.d/sumeiqiao.conf, \
/usr/bin/install -o root -g root -m 0644 /etc/nginx/conf.d/sumeiqiao.conf /etc/nginx/conf.d/sumeiqiao.conf.previous, \
/usr/bin/install -o root -g root -m 0644 /etc/nginx/conf.d/sumeiqiao.conf.previous /etc/nginx/conf.d/sumeiqiao.conf, \
/usr/bin/rm -f -- /etc/nginx/conf.d/sumeiqiao.conf, \
/usr/sbin/nginx -t, \ /usr/sbin/nginx -t, \
/usr/bin/systemctl reload nginx /usr/bin/systemctl reload nginx
gitlab-runner ALL=(root) NOPASSWD: SUMEIQIAO_NGINX gitlab-runner ALL=(root) NOPASSWD: SUMEIQIAO_NGINX
``` ```
保存后执行 `sudo visudo -cf /etc/sudoers.d/sumeiqiao-runner` 检查语法。CI 只会从 `/root/sumeiqiao/current` 读取本项目配置,并只会更新 `/etc/nginx/conf.d/sumeiqiao.conf`不同 pipeline 的 Nginx 操作由共享目录中的文件锁串行执行。 保存后执行 `sudo visudo -cf /etc/sudoers.d/sumeiqiao-runner` 检查语法。CI 只会从 `/root/sumeiqiao/current` 读取本项目配置,并只会更新 `/etc/nginx/conf.d/sumeiqiao.conf`
多个 GitLab pipeline 即使同时进入部署阶段,也会由服务器共享锁依次执行;部署持锁时,文章后台不会排队受理发布操作,而会明确提示编辑人员稍后重试。 多个 GitLab pipeline 即使同时进入部署阶段,也会由服务器共享锁依次执行;部署持锁时,文章后台不会排队受理发布操作,而会明确提示编辑人员稍后重试。
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment