浏览代码

Chore: download dist from GitLab if GitHub dist repo is down

SukkaW 1 年之前
父节点
当前提交
554afd0fd9
共有 3 个文件被更改,包括 64 次插入43 次删除
  1. 2 1
      .github/workflows/main.yml
  2. 61 41
      Build/download-previous-build.ts
  3. 1 1
      Build/lib/fetch-retry.ts

+ 2 - 1
.github/workflows/main.yml

@@ -74,8 +74,8 @@ jobs:
         run: |
           mkdir ./deploy-git
           cd ./deploy-git
-          git init
           git config --global init.defaultBranch master
+          git init
           git config --global push.default matching
           git config --global user.email "${GITLAB_EMAIL}"
           git config --global user.name "${GITLAB_USER}"
@@ -95,6 +95,7 @@ jobs:
           GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }}
       - name: Upload Dist to GitHub
         uses: peaceiris/actions-gh-pages@v4
+        continue-on-error: true
         with:
           personal_token: ${{ secrets.GIT_TOKEN }}
           user_name: ${{ secrets.GIT_USER }}

+ 61 - 41
Build/download-previous-build.ts

@@ -13,6 +13,9 @@ import { Readable } from 'node:stream';
 const IS_READING_BUILD_OUTPUT = 1 << 2;
 const ALL_FILES_EXISTS = 1 << 3;
 
+const GITHUB_CODELOAD_URL = 'https://codeload.github.com/sukkalab/ruleset.skk.moe/tar.gz/master';
+const GITLAB_CODELOAD_URL = 'https://gitlab.com/SukkaW/ruleset.skk.moe/-/archive/master/ruleset.skk.moe-master.tar.gz';
+
 export const downloadPreviousBuild = task(require.main === module, __filename)(async (span) => {
   const buildOutputList: string[] = [];
 
@@ -49,54 +52,71 @@ export const downloadPreviousBuild = task(require.main === module, __filename)(a
 
   const filesList = buildOutputList.map(f => path.join('ruleset.skk.moe-master', f));
 
-  return span
-    .traceChild('download & extract previoud build')
-    .traceAsyncFn(async () => {
-      const resp = await fetchWithRetry('https://codeload.github.com/sukkalab/ruleset.skk.moe/tar.gz/master', {
-        ...defaultRequestInit,
-        retry: {
-          retryOnNon2xx: false
-        }
-      });
-
-      if (resp.status !== 200) {
-        console.warn('Download previous build failed! Status:', resp.status);
-        if (resp.status === 404) {
-          return;
-        }
+  const tarGzUrl = await span.traceChildAsync('get tar.gz url', async () => {
+    const resp = await fetchWithRetry(GITHUB_CODELOAD_URL, {
+      ...defaultRequestInit,
+      method: 'HEAD',
+      retry: {
+        retryOnNon2xx: false
       }
+    });
+    if (resp.status !== 200) {
+      console.warn('Download previous build from GitHub failed! Status:', resp.status);
+      console.warn('Switch to GitLab');
+      return GITLAB_CODELOAD_URL;
+    }
+    return GITHUB_CODELOAD_URL;
+  });
+
+  return span.traceChildAsync('download & extract previoud build', async () => {
+    const resp = await fetchWithRetry(tarGzUrl, {
+      headers: {
+        'User-Agent': 'curl/8.9.1',
+        Accept: 'application/octet-stream'
+      },
+      retry: {
+        retryOnNon2xx: false
+      }
+    });
 
-      if (!resp.body) {
-        throw new Error('Download previous build failed! No body found');
+    if (resp.status !== 200) {
+      console.warn('Download previous build failed! Status:', resp.status);
+      if (resp.status === 404) {
+        return;
       }
+    }
 
-      const gunzip = zlib.createGunzip();
-      const extract = tarStream.extract();
+    if (!resp.body) {
+      throw new Error('Download previous build failed! No body found');
+    }
 
-      pipeline(
-        Readable.fromWeb(resp.body),
-        gunzip,
-        extract
-      );
+    const gunzip = zlib.createGunzip();
+    const extract = tarStream.extract();
 
-      const pathPrefix = `ruleset.skk.moe-master${path.sep}`;
+    pipeline(
+      Readable.fromWeb(resp.body),
+      gunzip,
+      extract
+    );
 
-      for await (const entry of extract) {
-        if (entry.header.type !== 'file') {
-          entry.resume(); // Drain the entry
-          continue;
-        }
-        // filter entry
-        if (!filesList.some(f => entry.header.name.startsWith(f))) {
-          entry.resume(); // Drain the entry
-          continue;
-        }
-
-        const relativeEntryPath = entry.header.name.replace(pathPrefix, '');
-        const targetPath = path.join(__dirname, '..', relativeEntryPath);
+    const pathPrefix = 'ruleset.skk.moe-master/';
 
-        await mkdir(path.dirname(targetPath), { recursive: true });
-        await pipeline(entry, createWriteStream(targetPath));
+    for await (const entry of extract) {
+      if (entry.header.type !== 'file') {
+        entry.resume(); // Drain the entry
+        continue;
       }
-    });
+      // filter entry
+      if (!filesList.some(f => entry.header.name.startsWith(f))) {
+        entry.resume(); // Drain the entry
+        continue;
+      }
+
+      const relativeEntryPath = entry.header.name.replace(pathPrefix, '');
+      const targetPath = path.join(__dirname, '..', relativeEntryPath);
+
+      await mkdir(path.dirname(targetPath), { recursive: true });
+      await pipeline(entry, createWriteStream(targetPath));
+    }
+  });
 });

+ 1 - 1
Build/lib/fetch-retry.ts

@@ -124,7 +124,7 @@ function createFetchRetry($fetch: typeof fetch): FetchWithRetry {
 
 export const defaultRequestInit: RequestInit = {
   headers: {
-    'User-Agent': 'curl/8.9.0 (https://github.com/SukkaW/Surge)'
+    'User-Agent': 'curl/8.9.1 (https://github.com/SukkaW/Surge)'
   }
 };