/
githubmirror
/
LeetCode-Go
Обзор
Документация
Войти
/
githubmirror
/
LeetCode-Go
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
.github/workflows/deploy.yml
98 строк
5 KB
halfrost
Update action
22 июн 2026, 13:40
22 июн 2026, 13:40
05dfe3d
Код
Авторство
О чём код?
name: Deploy《LeetCode-Cookbook》 on: push: branches: - master # 只在master上push触发部署 - add_hugo paths-ignore: # 下列文件的变更不触发部署,可以自行添加 - README.md - LICENSE jobs: deploy: runs-on: ubuntu-latest # 使用ubuntu系统镜像运行自动化脚本 steps: # 自动化步骤 - uses: actions/checkout@v5 # 第一步,下载代码仓库 with: fetch-depth: 0 # config.toml 里 enableGitInfo = true,需要完整 git 历史,否则取不到每页“最后修改”信息 - name: Setup Hugo # 第二步,安装 hugo uses: peaceiris/actions-hugo@v3 with: hugo-version: '0.74.3' extended: true # 关键修复:主题用 resources.ToCSS 编译 book.scss,必须用 extended 版,否则 build 直接报错 - name: Build # 第三步,编译 hugo run: | cd ./website hugo -D --minify - name: Deploy to Server # 第四步:在 runner 上用 rsync 把构建产物推到服务器 # 关键修复:之前用 appleboy/ssh-action,它会把 script 放到“服务器上”执行, # 于是 rsync 在服务器本机找不到 ./website/public/,还要再 SSH 回自己 → Permission denied。 # 正确做法是直接在 runner 上跑 rsync,用 DEPLOY_KEY 推到服务器。 env: DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }} SSH_HOST: ${{ secrets.SSH_HOST }} SSH_USERNAME: ${{ secrets.SSH_USERNAME }} SERVER_PORT: ${{ secrets.SERVER_PORT }} SERVER_DESTINATION: ${{ secrets.SERVER_DESTINATION }} run: | mkdir -p ~/.ssh printf '%s\n' "$DEPLOY_KEY" > ~/.ssh/deploy_key chmod 600 ~/.ssh/deploy_key # 服务器较旧(OpenSSH 5.x),只认旧的 ssh-rsa(SHA-1) 签名, # 而新版 OpenSSH 默认禁用了它,所以要显式加回 PubkeyAcceptedAlgorithms=+ssh-rsa, # 否则会报 "sign_and_send_pubkey: no mutual signature supported"。 rsync -avz --delete --exclude='*.pyc' \ -e "ssh -i ~/.ssh/deploy_key -p ${SERVER_PORT:-22} -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o PubkeyAcceptedAlgorithms=+ssh-rsa" \ ./website/public/ \ "${SSH_USERNAME}@${SSH_HOST}:${SERVER_DESTINATION:-/var/www/books/leetcode/}" word-count: # 重新统计总字数并把 README 里的徽章数字刷新,用 PAT 直接 push 回 master(零点击) # 只在 master 上跑(add_hugo 等分支不自动改 README)。 # # master 受保护(需 1 个审批 + Code owner 审批),默认 GITHUB_TOKEN 既不能直接 push, # 也无法自审自己的 PR,做不到全自动。由于分支保护的 enforce_admins=false(管理员不受限), # 这里改用「仓库管理员(你)的 PAT」直接 push —— 管理员凭证可绕过必需审批,全程无需手动点击。 # # 一次性准备:创建一个 fine-grained PAT(仅本仓库,权限 Contents: Read and write), # 加到 Settings → Secrets and variables → Actions,名字为 WORD_COUNT_PAT。 if: github.ref == 'refs/heads/master' runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 with: # 用 PAT 检出,这样后续 git push 会带着 PAT 的身份(管理员),从而绕过必需审批。 token: ${{ secrets.WORD_COUNT_PAT }} - name: Compute total word count # 跑仓库自带脚本(标准库即可,ubuntu-latest 自带 python3) id: wc run: | COUNT=$(python3 website/content/ChapterFour/pytool/WordCount.py | awk '/total word count/{print $NF}') # 防御:脚本异常时不要用空值/非数字去覆盖徽章 if ! echo "$COUNT" | grep -qE '^[0-9]+$'; then echo "WordCount.py 未返回有效数字:'$COUNT'"; exit 1 fi echo "total word count = $COUNT" echo "count=$COUNT" >> "$GITHUB_OUTPUT" - name: Update badge & commit if changed run: | COUNT="${{ steps.wc.outputs.count }}" # 只替换 README 里 Total Word Count 徽章的数字部分 sed -i -E "s#(Total%20Word%20Count-)[0-9]+(-success)#\1${COUNT}\2#" README.md if git diff --quiet -- README.md; then echo "徽章已是最新(${COUNT}),无需提交。" else git config user.name "halfrost" git config user.email "ydz627@gmail.com" git add README.md # [skip ci]:只改 README 的自动提交不必再触发任何 workflow(deploy 已 paths-ignore README, # test.yml 没有,所以统一用 skip ci 防止多余构建,也杜绝循环触发)。 git commit -m "chore: update Total Word Count badge to ${COUNT} [skip ci]" git push fi