Skip to content

Update AtCoder Contest Info #157

Update AtCoder Contest Info

Update AtCoder Contest Info #157

name: Update AtCoder Contest Info
on:
schedule:
# 日本時間の午前6時に実行 (UTCでは前日の21:00)
- cron: '0 21 * * *'
workflow_dispatch: # 手動実行も可能にする
jobs:
update_contests:
runs-on: ubuntu-latest
permissions:
contents: write # リポジトリへの書き込み権限を付与
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12' # プロジェクトに合わせて調整してください
# uv が pyproject.toml に記載されているか、
# または pip install uv が必要か確認してください。
# ここでは uv がインストール済み、または pip でインストール可能と仮定します。
# もし uv が pyproject.toml になければ、pip install uv を追加してください。
- name: Install uv (if not in pyproject.toml)
run: pip install uv # 必要に応じてこの行を追加・削除
- name: Install dependencies using uv
# uv sync を使うのが一般的ですが、pyproject.toml の形式によります。
# uv pip install . や uv pip install -r requirements.txt など、
# プロジェクトの構成に合わせて調整してください。
# ここでは uv sync を試みます。
run: uv sync
- name: Backup old contest data
run: |
if [ -f contests.json ]; then
cp contests.json contests_old.json
fi
- name: Run script to fetch contest info
run: uv run main.py
- name: Check for new contests and create commit message
id: check_changes
run: |
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
git add contests.json contests.yaml
# 変更があるかチェック
if git diff --staged --quiet; then
echo "No changes to commit."
echo "has_changes=false" >> $GITHUB_OUTPUT
else
echo "has_changes=true" >> $GITHUB_OUTPUT
# 新しいコンテストを検出
if [ -f contests_old.json ]; then
# jqを使って新しいコンテストを検出
OLD_URLS=$(jq -r '.[].url' contests_old.json | sort)
NEW_URLS=$(jq -r '.[].url' contests.json | sort)
ADDED_URLS=$(comm -13 <(echo "$OLD_URLS") <(echo "$NEW_URLS"))
if [ -n "$ADDED_URLS" ]; then
# 新しく追加されたコンテストの名前を取得(最大3つまで)
NEW_CONTESTS=""
COUNT=0
TOTAL_COUNT=$(echo "$ADDED_URLS" | wc -l)
while IFS= read -r url && [ $COUNT -lt 3 ]; do
if [ -n "$url" ]; then
NAME_JA=$(jq -r --arg url "$url" '.[] | select(.url == $url) | .name_ja' contests.json)
NAME_EN=$(jq -r --arg url "$url" '.[] | select(.url == $url) | .name_en' contests.json)
if [ "$NAME_JA" != "null" ] && [ -n "$NAME_JA" ]; then
CONTEST_NAME="$NAME_JA"
elif [ "$NAME_EN" != "null" ] && [ -n "$NAME_EN" ]; then
CONTEST_NAME="$NAME_EN"
else
CONTEST_NAME="Unknown Contest"
fi
if [ $COUNT -eq 0 ]; then
NEW_CONTESTS="$CONTEST_NAME"
else
NEW_CONTESTS="$NEW_CONTESTS, $CONTEST_NAME"
fi
COUNT=$((COUNT + 1))
fi
done <<< "$ADDED_URLS"
if [ $TOTAL_COUNT -gt 3 ]; then
NEW_CONTESTS="$NEW_CONTESTS など${TOTAL_COUNT}件"
fi
else
NEW_CONTESTS=""
fi
else
NEW_CONTESTS=""
fi
# コミットメッセージを作成
if [ -n "$NEW_CONTESTS" ]; then
COMMIT_MSG="Update AtCoder contest info - 新規追加: $NEW_CONTESTS"
else
COMMIT_MSG="Update AtCoder contest info"
fi
echo "commit_message=$COMMIT_MSG" >> $GITHUB_OUTPUT
echo "New contests detected: $NEW_CONTESTS"
fi
- name: Commit and push changes
if: steps.check_changes.outputs.has_changes == 'true'
run: |
git commit -m "${{ steps.check_changes.outputs.commit_message }}"
git push