Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .github/workflows/gallery_check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Gallery link check

on:
pull_request:
paths:
- "src/data/gallery/**"
- "scripts/check-gallery-links.mjs"
- "package.json"
- "yarn.lock"
- ".github/workflows/gallery_check.yml"

permissions:
contents: read

jobs:
gallery-links:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: "22"
- run: yarn
- run: yarn test:gallery-links
70 changes: 70 additions & 0 deletions .github/workflows/gallery_notify.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: Gallery link maintenance

on:
schedule:
- cron: "17 3 * * *"
workflow_dispatch:
push:
branches:
- master
paths:
- "src/data/gallery/**"
- "scripts/check-gallery-links.mjs"
- "scripts/notify-gallery-links.mjs"
- ".github/workflows/gallery_check.yml"
- ".github/workflows/gallery_notify.yml"
- "package.json"
- "yarn.lock"

permissions:
contents: read

concurrency:
group: gallery-link-maintenance-${{ github.ref_name }}
cancel-in-progress: false

env:
REPORT_PATH: /tmp/gallery-link-report.json
STATE_PATH: .cache/gallery-link-state.json

jobs:
gallery-maintenance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: "22"
- run: yarn
- name: Prepare state directory
run: mkdir -p "$(dirname "$STATE_PATH")"
- name: Restore notification state
uses: actions/cache@v4
with:
path: ${{ env.STATE_PATH }}
key: gallery-link-state-${{ github.repository }}-${{ github.ref_name }}-${{ github.run_id }}
restore-keys: |
gallery-link-state-${{ github.repository }}-${{ github.ref_name }}-
- name: Check gallery links
id: checker
continue-on-error: true
run: yarn test:gallery-links --report "$REPORT_PATH"
- name: Notify gallery link failures
id: notifier
if: ${{ always() }}
env:
DISCORD_GALLERY_WEBHOOK_URL: ${{ secrets.DISCORD_GALLERY_WEBHOOK_URL }}
WORKFLOW_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
run: yarn notify-gallery-links --report "$REPORT_PATH" --state "$STATE_PATH" --workflow-url "$WORKFLOW_URL"
- name: Save notification state
if: ${{ always() && steps.notifier.outcome == 'success' }}
uses: actions/cache/save@v4
with:
path: ${{ env.STATE_PATH }}
key: gallery-link-state-${{ github.repository }}-${{ github.ref_name }}-${{ github.run_id }}
- name: Preserve maintenance result
if: ${{ always() }}
run: |
if [ "${{ steps.checker.outcome }}" != "success" ] || [ "${{ steps.notifier.outcome }}" != "success" ]; then
exit 1
fi
25 changes: 25 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,17 @@ yarn prettier

目前大部分的照片都放在 GitHub 的 FCU-iOSClub/Website2022ImageBed 上。

### Gallery Link Check

掃描 `src/data/gallery` 中所有非空的 `gdrive_url`,以未登入、未使用任何 Google credential 的訪客身分檢查 Google Drive 資料夾是否可存取:

```bash
yarn test:gallery-links
yarn test:gallery-links --url "https://drive.google.com/drive/folders/<folder-id>"
```

若結果確認需要權限、網址無效、發生網路錯誤或無法判定,指令會以 non-zero exit code 結束。

### 競賽得獎

在 `/src/data/contest` 中新增檔案,檔案名稱以年份命名。
Expand Down Expand Up @@ -151,6 +162,20 @@ yarn prettier
}
```

## Gallery link checker

相簿連結檢查器會在 Pull Request 上執行檢查,並在 `master` 的相關更新時維護檢查狀態。PR gate 不需要 Discord secret,也**不會傳送 Discord 通知**;完整掃描可能因為目前儲存庫中既有連結受到限制而失敗。

### Discord 通知設定

維護工作流程若要傳送狀態變更通知,請在 GitHub 儲存庫中前往 **Settings → Secrets and variables → Actions → New repository secret**,建立名稱完全相同的 `DISCORD_GALLERY_WEBHOOK_URL` secret,並將 Discord webhook URL 填入 secret value。README、程式碼與 workflow 中都不要直接寫入 webhook value。

維護工作流程會在 `master` 的相關 push、每日 **UTC** 排程,以及手動 dispatch 時執行。Discord 僅通知兩種結果:`Permission denied` 與 `Invalid URL`。通知採 transition-only:第一次出現失敗或失敗集合改變時通知一次;相同失敗重複出現時保持靜默;恢復後通知一次。

檢查器使用快取保存上一輪的失敗狀態,因此快取是精簡、可重現且不含憑證的狀態;它不是完整歷史紀錄,也不保證跨工作流程執行永遠保留。GitHub Actions Cache 項目以 key 建立後不可覆寫,而目前 workflow 使用固定的 repository/ref key;後續執行可能恢復較舊的狀態,因此 transition-only 判斷不一定會以緊鄰上一輪執行為基準。PR gate 與 `master` 維護執行可能各自使用不同的快取內容,不能把快取當作連結目前一定可用的證明。

如果 webhook value 曾經暴露(包括提交到 Git、日誌或公開訊息),請立即在 Discord 撤銷該 webhook 並建立新的 webhook,再更新 GitHub Actions secret;不要繼續使用已暴露的 URL。

## Button

### Slider Button
Expand Down
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
"develop": "gatsby develop",
"dev": "gatsby develop -H 0.0.0.0",
"build": "gatsby build",
"prettier": "prettier --write ."
"prettier": "prettier --write .",
"test:gallery-links": "node scripts/check-gallery-links.mjs",
"notify-gallery-links": "node scripts/notify-gallery-links.mjs"
},
"engines": {
"node": ">=22",
Expand Down
Loading
Loading