From 8273031d7e5c5e4dec9c934fc2097fd78759e925 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Fri, 11 Jul 2025 17:37:33 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E8=87=AA=E5=8A=A8=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E5=B8=AE=E5=8A=A9=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guide/install/images/github-release-2.png | Bin 0 -> 28254 bytes docs/guide/install/images/github-release.png | Bin 0 -> 21202 bytes docs/guide/install/upgrade.md | 50 ++++++++++++++++++ packages/plugins/plugin-lib/src/ssh/ssh.ts | 7 ++- .../plugins/plugin-check-release.ts | 50 +++++++++++------- 5 files changed, 87 insertions(+), 20 deletions(-) create mode 100644 docs/guide/install/images/github-release-2.png create mode 100644 docs/guide/install/images/github-release.png diff --git a/docs/guide/install/images/github-release-2.png b/docs/guide/install/images/github-release-2.png new file mode 100644 index 0000000000000000000000000000000000000000..4e9bb77957819000026ff5381718b89a35c95e3b GIT binary patch literal 28254 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 literal 0 HcmV?d00001 diff --git a/docs/guide/install/upgrade.md b/docs/guide/install/upgrade.md index 11c6dc42..0f562ec5 100644 --- a/docs/guide/install/upgrade.md +++ b/docs/guide/install/upgrade.md @@ -13,4 +13,54 @@ ::: ## 升级日志 +可以查看最新版本号,以及所有版本的更新日志 [CHANGELOG](../changelogs/CHANGELOG.md) + + +## 自动升级配置 + +### 1. 方法一:使用watchtower监控 + +修改docker-compose.yaml文件增加如下配置, 使用watchtower监控自动升级 +```yaml +services: + certd: + ... + labels: + com.centurylinklabs.watchtower.enable: "true" + +# ↓↓↓↓ --------------------------------------------------------- 自动升级,上面certd的版本号要保持为latest + certd-updater: # 添加 Watchtower 服务 + image: containrrr/watchtower:latest + container_name: certd-updater + restart: unless-stopped + volumes: + - /var/run/docker.sock:/var/run/docker.sock + # 配置 自动更新 + environment: + - WATCHTOWER_CLEANUP=true # 自动清理旧版本容器 + - WATCHTOWER_INCLUDE_STOPPED=false # 不更新已停止的容器 + - WATCHTOWER_LABEL_ENABLE=true # 根据容器标签进行更新 + - WATCHTOWER_POLL_INTERVAL=600 # 每 10 分钟检查一次更新 + +``` + + +### 2. 方法二:使用Certd版本监控功能 + +选择Github-检查Release版本插件 +![](./images/github-release.png) +按如下图填写配置 +![](./images/github-release-2.png) + + +检测到新版本后执行宿主机升级命令: + +```shell +# 拉取最新镜像 +docker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest +# 升级容器命令, 替换成你自己的certd更新命令 +export RESTART_CERT='sleep 10; cd ~/deploy/certd/ ; docker compose down; docker compose up -d' +# 构造一个脚本10s后在后台执行,避免容器销毁时执行太快,导致流水线任务无法结束 +nohup sh -c '$RESTART_CERT' >/dev/null 2>&1 & echo '10秒后重启' && exit +``` \ No newline at end of file diff --git a/packages/plugins/plugin-lib/src/ssh/ssh.ts b/packages/plugins/plugin-lib/src/ssh/ssh.ts index ccd12caf..b7d203a6 100644 --- a/packages/plugins/plugin-lib/src/ssh/ssh.ts +++ b/packages/plugins/plugin-lib/src/ssh/ssh.ts @@ -491,7 +491,7 @@ export class SshClient { * Set-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\cmd.exe" * @param options */ - async exec(options: { connectConf: SshAccess; script: string | Array; env?: any; throwOnStdErr?: boolean }): Promise { + async exec(options: { connectConf: SshAccess; script: string | Array; env?: any; throwOnStdErr?: boolean; stopOnError?: boolean }): Promise { let { script } = options; const { connectConf, throwOnStdErr } = options; @@ -506,6 +506,10 @@ export class SshClient { isWinCmd = await this.isCmd(conn); } + if (isLinux && options.stopOnError !== false) { + script = "set -e\n" + script; + } + if (options.env) { for (const key in options.env) { if (isLinux) { @@ -538,6 +542,7 @@ export class SshClient { script = envScripts.join(newLine) + newLine + script; } } + return await conn.exec(script as string, { throwOnStdErr }); }, }); diff --git a/packages/ui/certd-server/src/plugins/plugin-github/plugins/plugin-check-release.ts b/packages/ui/certd-server/src/plugins/plugin-github/plugins/plugin-check-release.ts index 2a596e84..2b34cbb1 100644 --- a/packages/ui/certd-server/src/plugins/plugin-github/plugins/plugin-check-release.ts +++ b/packages/ui/certd-server/src/plugins/plugin-github/plugins/plugin-check-release.ts @@ -47,7 +47,7 @@ export class GithubCheckRelease extends AbstractTaskPlugin { mode:"tags" } }, - required:true, + required:false, }) notificationIds!: number[]; @@ -74,9 +74,21 @@ export class GithubCheckRelease extends AbstractTaskPlugin { name: 'a-textarea', vModel: 'value', rows: 6, - placeholder: `#拉取最新版镜像\ndocker pull greper/certd:latest \n#重建容器 \nnohup sh -c 'sleep 10; cd ~/deploy/certd/ ; docker compose down; docker compose up -d' >/dev/null & `, + placeholder: ` +# 拉取最新镜像 +docker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest +# 升级容器命令, 替换成你自己的实际部署位置及更新命令 +export RESTART_CERT='sleep 10; cd ~/deploy/certd/ ; docker compose down; docker compose up -d' +# 构造一个脚本10s后在后台执行,避免容器销毁时执行太快,导致流水线任务无法结束 +nohup sh -c '$RESTART_CERT' >/dev/null 2>&1 & echo '10秒后重启' && exit`, }, - helper: '有新版本后执行命令,比如:拉取最新版镜像,然后重建容器\n注意:自己升级自己需要使用nobup配合sleep', + helper: `有新版本后执行命令,比如:拉取最新版镜像,然后重建容器 +注意:自己升级自己需要使用nohup配合sleep +自动升级命令示例: +docker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest +export RESTART_CERT='sleep 10; cd ~/deploy/certd/ ; docker compose down; docker compose up -d' +nohup sh -c '$RESTART_CERT' >/dev/null 2>&1 & echo '10秒后重启' && exit +`, required: false, }) script!: string; @@ -108,24 +120,24 @@ export class GithubCheckRelease extends AbstractTaskPlugin { //仅每行开头的* 替换成 -, *号前面可以有空格 const body = res.body.replace(/^(\s*)\* /gm, "$1- ") - if (this.notificationIds == null){ - this.notificationIds = [0] - } - //发送通知 - for (const notificationId of this.notificationIds) { - await this.ctx.notificationService.send({ - id: notificationId, - useDefault: false, - useEmail:false, - logger: this.logger, - body: { - title: `${this.repoName} 新版本 ${this.lastVersion} 发布`, - content: `${body}\n\n > [Certd](https://certd.docmirror.cn),不止证书自动化,插件解锁无限可能!\n\n`, - url: `https://github.com/${this.repoName}/releases/tag/${this.lastVersion}`, - } - }) + if (this.notificationIds && this.notificationIds.length > 0){ + //发送通知 + for (const notificationId of this.notificationIds) { + await this.ctx.notificationService.send({ + id: notificationId, + useDefault: false, + useEmail:false, + logger: this.logger, + body: { + title: `${this.repoName} 新版本 ${this.lastVersion} 发布`, + content: `${body}\n\n > [Certd](https://certd.docmirror.cn),不止证书自动化,插件解锁无限可能!\n\n`, + url: `https://github.com/${this.repoName}/releases/tag/${this.lastVersion}`, + } + }) + } } + if (this.script != null && this.script.trim() != "") { const connectConf = await this.getAccess(this.sshAccessId); const sshClient = new SshClient(this.logger);