Skip to content

Commit 52e625e

Browse files
authored
Merge pull request #49 from snickerjp/feat-update-mysql-shell-and-workflows
feat: add GitHub Actions workflow to check for new MySQL Shell releases
2 parents a5116f8 + bfb3efc commit 52e625e

File tree

1 file changed

+206
-0
lines changed

1 file changed

+206
-0
lines changed
Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
name: Check for new MySQL Shell releases
2+
3+
on:
4+
schedule:
5+
# 毎日 UTC 3時17分に実行 (ランダムな時刻で負荷分散)
6+
- cron: '17 3 * * *'
7+
workflow_dispatch: # 手動実行も可能にする
8+
9+
jobs:
10+
check-release:
11+
runs-on: ubuntu-latest
12+
steps:
13+
- name: Checkout repository
14+
uses: actions/checkout@v4
15+
with:
16+
# プルリクエスト作成のためにトークンが必要
17+
token: ${{ secrets.GITHUB_TOKEN }} # または PAT
18+
19+
- name: Get current versions
20+
id: current_versions
21+
run: |
22+
# Dockerfileから現在のバージョンを取得
23+
if [[ ! -f docker/innovation/Dockerfile ]] || [[ ! -f docker/lts/Dockerfile ]]; then
24+
echo "::error::Required Dockerfiles not found!"
25+
exit 1
26+
fi
27+
28+
CURRENT_INNOVATION=$(grep -oP '(?<=^ARG MYSQL_SHELL_VERSION=)\d+\.\d+\.\d+' docker/innovation/Dockerfile)
29+
CURRENT_LTS=$(grep -oP '(?<=^ARG MYSQL_SHELL_VERSION=)\d+\.\d+\.\d+' docker/lts/Dockerfile)
30+
31+
if [[ -z "$CURRENT_INNOVATION" ]] || [[ -z "$CURRENT_LTS" ]]; then
32+
echo "::error::Failed to extract current versions from Dockerfiles"
33+
exit 1
34+
fi
35+
36+
echo "CURRENT_INNOVATION=${CURRENT_INNOVATION}" >> $GITHUB_OUTPUT
37+
echo "CURRENT_LTS=${CURRENT_LTS}" >> $GITHUB_OUTPUT
38+
echo "Current Innovation: $CURRENT_INNOVATION"
39+
echo "Current LTS: $CURRENT_LTS"
40+
41+
# メジャーバージョンを抽出 (後で使用)
42+
INNOVATION_MAJOR_VERSION=$(echo "$CURRENT_INNOVATION" | cut -d. -f1)
43+
LTS_MAJOR_VERSION=$(echo "$CURRENT_LTS" | cut -d. -f1)
44+
echo "INNOVATION_MAJOR_VERSION=${INNOVATION_MAJOR_VERSION}" >> $GITHUB_OUTPUT
45+
echo "LTS_MAJOR_VERSION=${LTS_MAJOR_VERSION}" >> $GITHUB_OUTPUT
46+
47+
- name: Get latest MySQL Shell tags
48+
id: latest_tags
49+
run: |
50+
# GitHub APIからタグ情報を取得
51+
INNOVATION_MAJOR="${{ steps.current_versions.outputs.INNOVATION_MAJOR_VERSION }}"
52+
LTS_MAJOR="${{ steps.current_versions.outputs.LTS_MAJOR_VERSION }}"
53+
54+
API_RESPONSE=$(curl -s -H "Accept: application/vnd.github+json" https://api.github.com/repos/mysql/mysql-shell/tags)
55+
56+
if [[ -z "$API_RESPONSE" ]] || [[ "$API_RESPONSE" == *"rate limit"* ]]; then
57+
echo "::error::Failed to fetch data from GitHub API or rate limit exceeded"
58+
exit 1
59+
fi
60+
61+
# 正規表現パターンを動的に構築
62+
INNOVATION_PATTERN="^${INNOVATION_MAJOR}\\.\\d+\\.\\d+$"
63+
LTS_PATTERN="^${LTS_MAJOR}\\.\\d+\\.\\d+$"
64+
65+
LATEST_INNOVATION=$(echo "$API_RESPONSE" | jq -r --arg pattern "$INNOVATION_PATTERN" '[.[] | select(.name | test($pattern))][0].name')
66+
LATEST_LTS=$(echo "$API_RESPONSE" | jq -r --arg pattern "$LTS_PATTERN" '[.[] | select(.name | test($pattern))][0].name')
67+
68+
if [[ -z "$LATEST_INNOVATION" ]] || [[ "$LATEST_INNOVATION" == "null" ]] || [[ -z "$LATEST_LTS" ]] || [[ "$LATEST_LTS" == "null" ]]; then
69+
echo "::warning::Failed to find matching versions. Using hardcoded patterns as fallback."
70+
# フォールバック: ハードコードされたバージョンパターン
71+
LATEST_INNOVATION=$(echo "$API_RESPONSE" | jq -r '[.[] | select(.name | test("^9\\.\\d+\\.\\d+$"))][0].name')
72+
LATEST_LTS=$(echo "$API_RESPONSE" | jq -r '[.[] | select(.name | test("^8\\.\\d+\\.\\d+$"))][0].name')
73+
fi
74+
75+
echo "LATEST_INNOVATION=${LATEST_INNOVATION}" >> $GITHUB_OUTPUT
76+
echo "LATEST_LTS=${LATEST_LTS}" >> $GITHUB_OUTPUT
77+
echo "Latest Innovation: $LATEST_INNOVATION"
78+
echo "Latest LTS: $LATEST_LTS"
79+
80+
- name: Check versions
81+
id: check_versions
82+
run: |
83+
CURRENT_INNOVATION="${{ steps.current_versions.outputs.CURRENT_INNOVATION }}"
84+
LATEST_INNOVATION="${{ steps.latest_tags.outputs.LATEST_INNOVATION }}"
85+
CURRENT_LTS="${{ steps.current_versions.outputs.CURRENT_LTS }}"
86+
LATEST_LTS="${{ steps.latest_tags.outputs.LATEST_LTS }}"
87+
88+
INNOVATION_UPDATE_NEEDED="false"
89+
LTS_UPDATE_NEEDED="false"
90+
91+
if [[ -z "$LATEST_INNOVATION" ]] || [[ "$LATEST_INNOVATION" == "null" ]]; then
92+
echo "::warning::No valid Innovation version found in API response"
93+
elif [[ "$CURRENT_INNOVATION" != "$LATEST_INNOVATION" ]]; then
94+
echo "Update needed for Innovation: $CURRENT_INNOVATION -> $LATEST_INNOVATION"
95+
INNOVATION_UPDATE_NEEDED="true"
96+
else
97+
echo "Innovation is up-to-date."
98+
fi
99+
100+
if [[ -z "$LATEST_LTS" ]] || [[ "$LATEST_LTS" == "null" ]]; then
101+
echo "::warning::No valid LTS version found in API response"
102+
elif [[ "$CURRENT_LTS" != "$LATEST_LTS" ]]; then
103+
echo "Update needed for LTS: $CURRENT_LTS -> $LATEST_LTS"
104+
LTS_UPDATE_NEEDED="true"
105+
else
106+
echo "LTS is up-to-date."
107+
fi
108+
109+
echo "INNOVATION_UPDATE_NEEDED=${INNOVATION_UPDATE_NEEDED}" >> $GITHUB_OUTPUT
110+
echo "LTS_UPDATE_NEEDED=${LTS_UPDATE_NEEDED}" >> $GITHUB_OUTPUT
111+
112+
- name: Update files and create PR if needed
113+
if: steps.check_versions.outputs.INNOVATION_UPDATE_NEEDED == 'true' || steps.check_versions.outputs.LTS_UPDATE_NEEDED == 'true'
114+
env:
115+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
116+
CURRENT_INNOVATION: ${{ steps.current_versions.outputs.CURRENT_INNOVATION }}
117+
LATEST_INNOVATION: ${{ steps.latest_tags.outputs.LATEST_INNOVATION }}
118+
CURRENT_LTS: ${{ steps.current_versions.outputs.CURRENT_LTS }}
119+
LATEST_LTS: ${{ steps.latest_tags.outputs.LATEST_LTS }}
120+
run: |
121+
# ブランチ作成
122+
BRANCH_NAME="bot/update-mysql-shell-$(date +%Y%m%d%H%M%S)"
123+
git config --global user.name 'github-actions[bot]'
124+
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
125+
git checkout -b $BRANCH_NAME
126+
127+
PR_BODY="Automated update for MySQL Shell versions.\n\n"
128+
129+
# バージョン更新関数
130+
update_version() {
131+
local type=$1
132+
local current_version=$2
133+
local new_version=$3
134+
local major_version=$(echo "$new_version" | cut -d. -f1)
135+
local minor_version=$(echo "$new_version" | cut -d. -f2)
136+
local short_version="${major_version}.${minor_version}"
137+
138+
echo "Updating $type to $new_version..."
139+
140+
# Dockerfile の更新
141+
sed -i "s/^ARG MYSQL_SHELL_VERSION=.*/ARG MYSQL_SHELL_VERSION=$new_version/" docker/$type/Dockerfile
142+
143+
# マークダウンファイルの更新
144+
sed -i "s/MySQL Shell ${current_version}/MySQL Shell ${new_version}/g" Repository.md
145+
sed -i "s/snickerjp\/docker-mysql-shell:${current_version}/snickerjp\/docker-mysql-shell:${new_version}/g" Repository.md
146+
147+
# README.md の更新
148+
if [[ "$type" == "innovation" ]]; then
149+
sed -i "s/Innovation Series ([0-9]\\.[0-9]\\.[x0-9])/Innovation Series (${major_version}.${minor_version}.x)/g" README.md
150+
sed -i "s/snickerjp\/docker-mysql-shell:${major_version}\\.[0-9]/snickerjp\/docker-mysql-shell:${short_version}/g" README.md
151+
else
152+
sed -i "s/LTS Series ([0-9]\\.[0-9]\\.[x0-9])/LTS Series (${major_version}.${minor_version}.x)/g" README.md
153+
sed -i "s/snickerjp\/docker-mysql-shell:${major_version}\\.[0-9]/snickerjp\/docker-mysql-shell:${short_version}/g" README.md
154+
fi
155+
156+
# GitHub Actions ワークフローファイルの更新
157+
for workflow in .github/workflows/docker-*.yml; do
158+
if [[ -f "$workflow" ]]; then
159+
sed -i "s/version: ${major_version}\\.[0-9]/version: ${short_version}/g" "$workflow"
160+
fi
161+
done
162+
163+
PR_BODY+="* **${type^}:** ${current_version} -> ${new_version}\n"
164+
}
165+
166+
# Innovation の更新
167+
if [[ "${{ steps.check_versions.outputs.INNOVATION_UPDATE_NEEDED }}" == "true" ]]; then
168+
update_version "innovation" "$CURRENT_INNOVATION" "$LATEST_INNOVATION"
169+
fi
170+
171+
# LTS の更新
172+
if [[ "${{ steps.check_versions.outputs.LTS_UPDATE_NEEDED }}" == "true" ]]; then
173+
update_version "lts" "$CURRENT_LTS" "$LATEST_LTS"
174+
fi
175+
176+
# 変更をコミットしてプッシュ
177+
changed_files=$(git status --porcelain | awk '{print $2}')
178+
if [[ -z "$changed_files" ]]; then
179+
echo "No changes to commit."
180+
exit 0
181+
fi
182+
183+
git add $changed_files
184+
git commit -m "Update MySQL Shell versions (Innovation: $LATEST_INNOVATION, LTS: $LATEST_LTS)"
185+
186+
# エラーハンドリング付きでプッシュ
187+
if ! git push origin $BRANCH_NAME; then
188+
echo "::error::Failed to push changes to GitHub"
189+
exit 1
190+
fi
191+
192+
# プルリクエストを作成
193+
if ! gh pr create \
194+
--base develop \
195+
--head $BRANCH_NAME \
196+
--title "Update MySQL Shell versions (Innovation: $LATEST_INNOVATION, LTS: $LATEST_LTS)" \
197+
--body "$PR_BODY"; then
198+
echo "::error::Failed to create Pull Request"
199+
exit 1
200+
fi
201+
202+
echo "Pull request created successfully!"
203+
204+
- name: No update needed
205+
if: steps.check_versions.outputs.INNOVATION_UPDATE_NEEDED == 'false' && steps.check_versions.outputs.LTS_UPDATE_NEEDED == 'false'
206+
run: echo "No new MySQL Shell versions found. All versions are up to date."

0 commit comments

Comments
 (0)