github actions部署静态站点应避免手动git操作,用peaceiris/actions-gh-pages@v3直传dist目录;jenkins敏感配置须用credentials binding插件限定作用域;ansible失败需查journalctl、权限及selinux;ci中应使用npm ci而非npm install以保证依赖一致性。

用 GitHub Actions 实现静态站点自动部署到 GitHub Pages
GitHub Pages 是最轻量的自动化发布入口,适合文档、博客、前端单页应用。关键不是“能不能做”,而是“要不要绕过构建环节直接推 dist 目录”。
常见错误是把 npm run build 和 git push 混在同一个 job 里手动操作,导致缓存失效或权限失败。
- 必须用
actions/checkout@v4拉源码,再用actions/setup-node@v4装 Node.js - 构建后不要用
git add . && git commit手动提交——改用peaceiris/actions-gh-pages@v3插件直传dist/到gh-pages分支 - 触发条件建议设为
push: branches: [main],避免 PR 触发构建浪费资源 - 注意
GITHUB_TOKEN默认有contents: write权限,无需额外生成 PAT
Jenkins Pipeline 中如何安全注入敏感配置(如数据库密码)
硬编码 DB_PASSWORD 到 Jenkinsfile 是高危操作,但用 Credentials Binding 插件又容易漏掉 withCredentials 的作用域边界。
典型现象:密码变量在 sh 块里能打印,进 Docker 构建时却为空——因为没显式传入 env。
- 在 Jenkins 系统设置里添加 Secret Text 类型凭证,ID 设为
prod-db-pass - Pipeline 中必须用
withCredentials([string(credentialsId: 'prod-db-pass', variable: 'DB_PASS')])包裹整个需要它的 stage - Docker 构建时若需传递,得写成
sh "docker build --build-arg DB_PASS=\${DB_PASS} -t myapp .",不能依赖环境变量自动继承 - 避免在
echo或日志中输出${DB_PASS},Jenkins 默认不脱敏字符串类型凭证
Ansible Playbook 部署失败后如何快速定位是权限、路径还是服务启动问题
Ansible 报错信息常卡在 failed: [web01] (item=nginx),但实际原因可能是 /etc/nginx/conf.d/app.conf 权限不对、systemctl daemon-reload 没执行,或 SELinux 拦截了端口。
别急着重跑整个 Playbook,先看三处:
- 检查目标机上
journalctl -u nginx -n 20 --no-pager输出,比 Ansible 的stderr更准 - 确认任务用了
become: true且become_user: root,否则copy模块写不到/etc - 加
-vvv参数运行时,留意"msg": "non-zero return code"后面是否带具体命令,比如systemctl start nginx失败就去查 nginx 配置语法:nginx -t - 如果是 CentOS 7+,临时关 SELinux 测试:
setenforce 0;确认是它拦的,再用semanage port -a -t http_port_t -p tcp 8080放行
为什么 CI 流水线里不该用 npm install 而该用 npm ci
npm install 会根据 package.json 重算依赖树,可能装出和本地开发不一致的子依赖版本;而 npm ci 强制以 package-lock.json 为准,失败即停,这才是 CI 场景要的确定性。
但很多人只改了命令,没清理 node_modules 缓存,导致旧模块残留引发诡异报错。
- Jenkins 或 GitHub Actions 中,必须加
rm -rf node_modules步骤,或在npm ci前加cache: npm并指定path: node_modules(GitHub Actions) - CI 环境默认无全局
node_modules,所以npm ci不会复用本地全局安装的typescript或eslint,所有 devDependency 都得进package.json - 若用
yarn,对应命令是yarn install --frozen-lockfile,语义等价
自动化部署真正卡点的从来不是工具链多难配,而是每个环节的信任边界没划清:谁负责校验输入、谁承担失败回滚、谁保管密钥、谁定义“成功”的标准。这些不写进流水线脚本,光靠文档或口头约定,早晚出事。










