|
15 | 15 | runs-on: ubuntu-latest |
16 | 16 | env: |
17 | 17 | TZ: Asia/Shanghai |
18 | | - permissions: |
19 | | - contents: write |
20 | 18 | concurrency: |
21 | 19 | group: ${{ github.workflow }}-${{ github.ref_name }} |
22 | 20 |
|
@@ -46,21 +44,83 @@ jobs: |
46 | 44 |
|
47 | 45 | - name: 安装项目依赖 |
48 | 46 | run: | |
49 | | - # 这一步会根据新的 package.json 安装所有东西 |
50 | | - # 包括:hexo核心、渲染器(pug/stylus)、gulp、bangumi插件 |
51 | 47 | yarn install --immutable |
52 | 48 |
|
| 49 | + - name: 校验 Rainyun 部署参数 |
| 50 | + env: |
| 51 | + RAINYUN_HOST: ${{ secrets.RAINYUN_HOST }} |
| 52 | + RAINYUN_PORT: ${{ secrets.RAINYUN_PORT }} |
| 53 | + RAINYUN_USER: ${{ secrets.RAINYUN_USER }} |
| 54 | + RAINYUN_TARGET_DIR: ${{ secrets.RAINYUN_TARGET_DIR }} |
| 55 | + RAINYUN_SSH_KEY: ${{ secrets.RAINYUN_SSH_KEY }} |
| 56 | + run: | |
| 57 | + for key in RAINYUN_HOST RAINYUN_USER RAINYUN_TARGET_DIR RAINYUN_SSH_KEY; do |
| 58 | + if [ -z "${!key}" ]; then |
| 59 | + echo "::error::缺少 GitHub Secret: ${key}" |
| 60 | + exit 1 |
| 61 | + fi |
| 62 | + done |
| 63 | +
|
| 64 | + if [ -z "${RAINYUN_PORT}" ]; then |
| 65 | + echo "RAINYUN_PORT 未配置,使用默认端口 22" |
| 66 | + fi |
| 67 | +
|
| 68 | + - name: 覆盖站点 URL |
| 69 | + env: |
| 70 | + SITE_URL: ${{ secrets.SITE_URL }} |
| 71 | + SITE_ROOT: ${{ secrets.SITE_ROOT }} |
| 72 | + run: | |
| 73 | + if [ -z "${SITE_URL}" ] && [ -z "${SITE_ROOT}" ]; then |
| 74 | + exit 0 |
| 75 | + fi |
| 76 | +
|
| 77 | + node <<'EOF' |
| 78 | + const fs = require('fs'); |
| 79 | + const path = '_config.yml'; |
| 80 | + let text = fs.readFileSync(path, 'utf8'); |
| 81 | +
|
| 82 | + if (process.env.SITE_URL) { |
| 83 | + text = text.replace(/^url:\s*.*/m, `url: ${process.env.SITE_URL}`); |
| 84 | + } |
| 85 | +
|
| 86 | + if (process.env.SITE_ROOT) { |
| 87 | + text = text.replace(/^root:\s*.*/m, `root: ${process.env.SITE_ROOT}`); |
| 88 | + } |
| 89 | +
|
| 90 | + fs.writeFileSync(path, text); |
| 91 | + EOF |
| 92 | +
|
53 | 93 | - name: 生成静态文件 |
54 | 94 | run: | |
55 | 95 | npx hexo clean |
56 | 96 | npx hexo bangumi -u |
57 | 97 | npx hexo generate |
58 | | - # 如果以后需要 gulp,取消注释即可,不需要再安装 gulp-cli |
59 | | - # npx gulp |
60 | 98 |
|
61 | | - - name: Deploy |
62 | | - uses: peaceiris/actions-gh-pages@v4 |
| 99 | + - name: 加载 SSH 私钥 |
| 100 | + uses: webfactory/ssh-agent@v0.9.1 |
63 | 101 | with: |
64 | | - github_token: ${{ secrets.GITHUB_TOKEN }} |
65 | | - publish_dir: ./public |
66 | | - publish_branch: gh-pages |
| 102 | + ssh-private-key: ${{ secrets.RAINYUN_SSH_KEY }} |
| 103 | + |
| 104 | + - name: 写入 known_hosts |
| 105 | + env: |
| 106 | + RAINYUN_HOST: ${{ secrets.RAINYUN_HOST }} |
| 107 | + RAINYUN_PORT: ${{ secrets.RAINYUN_PORT }} |
| 108 | + run: | |
| 109 | + mkdir -p ~/.ssh |
| 110 | + chmod 700 ~/.ssh |
| 111 | + ssh-keyscan -p "${RAINYUN_PORT:-22}" -H "${RAINYUN_HOST}" >> ~/.ssh/known_hosts |
| 112 | +
|
| 113 | + - name: 部署到 Rainyun |
| 114 | + env: |
| 115 | + RAINYUN_HOST: ${{ secrets.RAINYUN_HOST }} |
| 116 | + RAINYUN_PORT: ${{ secrets.RAINYUN_PORT }} |
| 117 | + RAINYUN_USER: ${{ secrets.RAINYUN_USER }} |
| 118 | + RAINYUN_TARGET_DIR: ${{ secrets.RAINYUN_TARGET_DIR }} |
| 119 | + RAINYUN_POST_DEPLOY: ${{ secrets.RAINYUN_POST_DEPLOY }} |
| 120 | + run: | |
| 121 | + ssh -p "${RAINYUN_PORT:-22}" "${RAINYUN_USER}@${RAINYUN_HOST}" "mkdir -p '${RAINYUN_TARGET_DIR}'" |
| 122 | + rsync -az --delete -e "ssh -p ${RAINYUN_PORT:-22}" ./public/ "${RAINYUN_USER}@${RAINYUN_HOST}:${RAINYUN_TARGET_DIR}/" |
| 123 | +
|
| 124 | + if [ -n "${RAINYUN_POST_DEPLOY}" ]; then |
| 125 | + ssh -p "${RAINYUN_PORT:-22}" "${RAINYUN_USER}@${RAINYUN_HOST}" "${RAINYUN_POST_DEPLOY}" |
| 126 | + fi |
0 commit comments