Files
wordpress/.gitea/workflows/image-update-and-release.yaml
T
claude 945e4e4d29
Helm Chart Release / release-chart (push) Successful in 13s
Update Docker Images and Helm Chart / update (push) Successful in 22s
refactor: Simplify values.yaml update using exact version matching
Refactor the Update values.yaml step to use exact version matching instead of
regex patterns. This approach is simpler, more reliable, and mirrors the
successful implementation in other Helmcharts (e.g., php-fpm).

Changes:
- Extract full current versions using awk (easier to parse)
- Use exact string replacement: sed 's|old_exact_version|new_exact_version|g'
- Only update if version has actually changed (conditional sed)
- Better error handling with set -e
- Clearer logging of what changed

Benefits:
1. Simpler logic: exact match instead of regex patterns
2. More reliable: no regex pattern matching failures
3. Proven approach: matches successful implementation in other projects
4. Clearer intent: code reads like "if version changed, update it"
5. Better debugging: conditional echo statements show exactly what happened

Flow:
1. Get current full version from values.yaml (e.g., 6.9.0-php8.5-fpm-alpine)
2. Get latest version from Docker Hub (shared variable)
3. If different, replace exact old version with exact new version
4. Report what changed (or didn't change)
5. Determine if WordPress version changed for Chart.yaml update decision

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-02-12 09:50:06 +09:00

399 lines
16 KiB
YAML

name: Update Docker Images and Helm Chart
on:
push:
branches:
- main
schedule:
- cron: "0 0 * * 0" # 毎週日曜日 00:00 UTC
workflow_dispatch: # 手動実行も可能にする
jobs:
update:
runs-on: ubuntu-latest
permissions:
contents: write # Git pushに必要な権限を明示的に付与
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # 完全な履歴を取得
token: ${{ secrets.GITEA_TOKEN || github.token }} # トークンを明示的に指定
- name: Set up Git
run: |
git config user.name "Gitea Actions"
git config user.email "actions@git.cafepieters.com"
- name: Fetch latest WordPress FPM Alpine version
id: wordpress
run: |
# Docker Hubから最新のWordPress FPM Alpineバージョンを取得(PHPバージョンも最新)
echo "Fetching WordPress FPM Alpine versions..."
# fpm-alpineタグを取得(全PHPバージョン対象)
LATEST_VERSION=$(curl -s "https://hub.docker.com/v2/repositories/library/wordpress/tags?page_size=100&name=fpm-alpine" | \
jq -r '.results[].name' | \
grep -E '^[0-9]+\.[0-9]+(\.[0-9]+)?-php[0-9]+\.[0-9]+-fpm-alpine$' | \
grep -v 'rc' | \
grep -v 'beta' | \
grep -v 'alpha' | \
sort -t- -k1,1V -k2,2V | \
tail -n 1)
if [ -z "$LATEST_VERSION" ]; then
echo "Failed to fetch from first method, trying alternative..."
# 代替方法: すべてのfpm-alpineタグを取得
LATEST_VERSION=$(curl -s "https://hub.docker.com/v2/repositories/library/wordpress/tags?page_size=100" | \
jq -r '.results[].name' | \
grep -E '^[0-9]+\.[0-9]+\.[0-9]+-php[0-9]+\.[0-9]+-fpm-alpine$' | \
grep -v 'rc' | \
grep -v 'beta' | \
grep -v 'alpha' | \
sort -t- -k1,1V -k2,2V | \
tail -n 1)
fi
if [ -z "$LATEST_VERSION" ]; then
echo "ERROR: Failed to fetch WordPress version"
exit 1
fi
echo "WordPress latest version: $LATEST_VERSION"
# バージョン情報を分解して表示
WP_VERSION=$(echo $LATEST_VERSION | cut -d'-' -f1)
PHP_VERSION=$(echo $LATEST_VERSION | cut -d'-' -f2)
echo " WordPress: $WP_VERSION"
echo " PHP: $PHP_VERSION"
echo " Base: fpm-alpine"
# 共有変数として出力
echo "version=$LATEST_VERSION" >> $GITHUB_OUTPUT
echo "version_base=$WP_VERSION" >> $GITHUB_OUTPUT
- name: Fetch latest Nginx Alpine Perl version
id: nginx
run: |
# Docker Hubから最新のNginx Alpine Perlバージョンを取得
echo "Fetching Nginx Alpine Perl versions..."
LATEST_VERSION=$(curl -s "https://hub.docker.com/v2/repositories/library/nginx/tags?page_size=100&name=alpine-perl" | \
jq -r '.results[].name' | \
grep -E '^[0-9]+\.[0-9]+\.[0-9]+-alpine-perl$' | \
grep -v 'rc' | \
grep -v 'beta' | \
grep -v 'alpha' | \
sort -V | \
tail -n 1)
if [ -z "$LATEST_VERSION" ]; then
echo "Failed to fetch from first method, trying alternative..."
# 代替方法: alpine-perlタグを別の方法で検索
LATEST_VERSION=$(curl -s "https://hub.docker.com/v2/repositories/library/nginx/tags?page_size=100" | \
jq -r '.results[].name' | \
grep 'alpine-perl$' | \
grep -E '^[0-9]+\.[0-9]+\.[0-9]+-alpine-perl$' | \
grep -v 'rc' | \
grep -v 'beta' | \
grep -v 'alpha' | \
sort -V | \
tail -n 1)
fi
if [ -z "$LATEST_VERSION" ]; then
echo "ERROR: Failed to fetch Nginx version"
exit 1
fi
echo "Nginx latest version: $LATEST_VERSION"
# バージョン情報を表示
NGINX_VERSION=$(echo $LATEST_VERSION | cut -d'-' -f1)
echo " Nginx: $NGINX_VERSION"
echo " Base: alpine-perl"
# 共有変数として出力
echo "version=$LATEST_VERSION" >> $GITHUB_OUTPUT
echo "version_base=$NGINX_VERSION" >> $GITHUB_OUTPUT
- name: Get current versions from values.yaml
id: current
run: |
# 現在のバージョンを取得
CURRENT_WORDPRESS=$(grep -A 3 'wordpress:' values.yaml | grep 'tag:' | awk -F'"' '{print $2}')
CURRENT_NGINX=$(grep -A 3 'nginx:' values.yaml | grep 'tag:' | awk -F'"' '{print $2}')
echo "current_wordpress=$CURRENT_WORDPRESS" >> $GITHUB_OUTPUT
echo "current_nginx=$CURRENT_NGINX" >> $GITHUB_OUTPUT
echo "Current WordPress: $CURRENT_WORDPRESS"
echo "Current Nginx: $CURRENT_NGINX"
- name: Check if update is needed
id: check
run: |
UPDATE_NEEDED=false
CHANGES=""
if [ "${{ steps.current.outputs.current_wordpress }}" != "${{ steps.wordpress.outputs.version }}" ]; then
echo "WordPress update available: ${{ steps.current.outputs.current_wordpress }} -> ${{ steps.wordpress.outputs.version }}"
UPDATE_NEEDED=true
CHANGES="${CHANGES}- WordPress: ${{ steps.current.outputs.current_wordpress }} -> ${{ steps.wordpress.outputs.version }}\n"
else
echo "WordPress is up to date: ${{ steps.current.outputs.current_wordpress }}"
fi
if [ "${{ steps.current.outputs.current_nginx }}" != "${{ steps.nginx.outputs.version }}" ]; then
echo "Nginx update available: ${{ steps.current.outputs.current_nginx }} -> ${{ steps.nginx.outputs.version }}"
UPDATE_NEEDED=true
CHANGES="${CHANGES}- Nginx: ${{ steps.current.outputs.current_nginx }} -> ${{ steps.nginx.outputs.version }}\n"
else
echo "Nginx is up to date: ${{ steps.current.outputs.current_nginx }}"
fi
echo "update_needed=$UPDATE_NEEDED" >> $GITHUB_OUTPUT
echo -e "changes<<EOF" >> $GITHUB_OUTPUT
echo -e "$CHANGES" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Update values.yaml
if: steps.check.outputs.update_needed == 'true'
id: update_values
run: |
set -e
echo "Updating values.yaml..."
cp values.yaml values.yaml.bak
# 共有変数から最新バージョンを取得
WP_LATEST="${{ steps.wordpress.outputs.version }}"
WP_BASE="${{ steps.wordpress.outputs.version_base }}"
NGINX_LATEST="${{ steps.nginx.outputs.version }}"
# 現在のバージョンを取得(Chart.yaml更新判定用)
CURRENT_WP=$(grep -A 3 'wordpress:' values.yaml | grep 'tag:' | awk -F'"' '{print $2}')
CURRENT_NGINX=$(grep -A 3 'nginx:' values.yaml | grep 'tag:' | awk -F'"' '{print $2}')
CURRENT_WP_BASE=$(echo "$CURRENT_WP" | cut -d'-' -f1)
echo "Current versions:"
echo " WordPress: $CURRENT_WP"
echo " Nginx: $CURRENT_NGINX"
echo ""
echo "Latest versions:"
echo " WordPress: $WP_LATEST"
echo " Nginx: $NGINX_LATEST"
# WordPress更新
if [ "$CURRENT_WP" != "$WP_LATEST" ]; then
sed -i "s|tag: \"${CURRENT_WP}\"|tag: \"${WP_LATEST}\"|g" values.yaml
echo "WordPress updated: $CURRENT_WP -> $WP_LATEST"
fi
# Nginx更新
if [ "$CURRENT_NGINX" != "$NGINX_LATEST" ]; then
sed -i "s|tag: \"${CURRENT_NGINX}\"|tag: \"${NGINX_LATEST}\"|g" values.yaml
echo "Nginx updated: $CURRENT_NGINX -> $NGINX_LATEST"
fi
# 変更内容を表示
echo ""
echo "=== Changes in values.yaml ==="
diff values.yaml.bak values.yaml || true
# 実際に変更されたか確認
if diff -q values.yaml.bak values.yaml > /dev/null 2>&1; then
echo "INFO: No changes were made to values.yaml (versions already up to date)"
echo "chart_version_update_needed=false" >> $GITHUB_OUTPUT
else
echo "Changes detected in values.yaml"
# WordPressバージョンが更新されたか判定(Chart.yaml更新の判定用)
WP_NEW_BASE=$(echo "$WP_LATEST" | cut -d'-' -f1)
if [ "$CURRENT_WP_BASE" != "$WP_NEW_BASE" ]; then
echo "WordPress version changed: $CURRENT_WP_BASE -> $WP_NEW_BASE"
echo "chart_version_update_needed=true" >> $GITHUB_OUTPUT
else
echo "INFO: WordPress version unchanged - only other images updated"
echo "chart_version_update_needed=false" >> $GITHUB_OUTPUT
fi
fi
echo ""
echo "=== Updated values.yaml (image section) ==="
grep -A 10 "^image:" values.yaml
- name: Increment chart version
if: steps.update_values.outputs.chart_version_update_needed == 'true'
id: increment
run: |
# Chart.yamlのバージョンをインクリメント(WordPressバージョン更新時のみ)
# WordPressバージョン更新時は新しいWPバージョンをそのまま使用(サフィックスは付けない)
if [ -f Chart.yaml ]; then
CURRENT_CHART_VERSION=$(grep '^version:' Chart.yaml | awk '{print $2}')
CURRENT_APP_VERSION=$(grep '^appVersion:' Chart.yaml | awk '{print $2}' | tr -d '"')
# 共有変数から最新のWordPressバージョン(ベース)を取得
NEW_WP_VERSION="${{ steps.wordpress.outputs.version_base }}"
# Chart.yamlはWordPressバージョンに合わせて更新(version と appVersion を同じにする)
NEW_CHART_VERSION="$NEW_WP_VERSION"
sed -i "s/^version: .*/version: $NEW_CHART_VERSION/" Chart.yaml
sed -i "s/^appVersion: .*/appVersion: \"$NEW_WP_VERSION\"/" Chart.yaml
echo "Chart version updated: $CURRENT_CHART_VERSION -> $NEW_CHART_VERSION"
echo "Chart appVersion updated: $CURRENT_APP_VERSION -> $NEW_WP_VERSION"
echo "new_chart_version=$NEW_CHART_VERSION" >> $GITHUB_OUTPUT
else
echo "Chart.yaml not found, skipping version increment"
echo "new_chart_version=" >> $GITHUB_OUTPUT
fi
- name: Commit and push changes
if: steps.check.outputs.update_needed == 'true'
run: |
# values.yamlは常に追加
git add values.yaml
# Chart.yamlはWordPressバージョン更新時のみ追加
if [ "${{ steps.update_values.outputs.chart_version_update_needed }}" == "true" ]; then
echo "Adding Chart.yaml (WordPress version was updated)"
git add Chart.yaml
else
echo "Skipping Chart.yaml (only other images were updated)"
fi
git status
if git diff --staged --quiet; then
echo "No changes to commit"
exit 0
fi
# コミットメッセージを作成
cat << EOF > /tmp/commit_msg.txt
chore: Update Docker images
${{ steps.check.outputs.changes }}
Auto-updated by Gitea Actions
EOF
git commit -F /tmp/commit_msg.txt
# プッシュをリトライ機構付きで実行
MAX_RETRIES=3
RETRY_COUNT=0
until git push origin main || [ $RETRY_COUNT -eq $MAX_RETRIES ]; do
RETRY_COUNT=$((RETRY_COUNT+1))
echo "Push failed, retrying ($RETRY_COUNT/$MAX_RETRIES)..."
sleep 5
git pull --rebase origin main
done
if [ $RETRY_COUNT -eq $MAX_RETRIES ]; then
echo "ERROR: Failed to push after $MAX_RETRIES attempts"
exit 1
fi
echo "Successfully pushed changes to main branch"
- name: Install Helm
if: steps.update_values.outputs.chart_version_update_needed == 'true'
uses: azure/setup-helm@v3
with:
version: 'latest'
- name: Create Helm package
if: steps.update_values.outputs.chart_version_update_needed == 'true'
run: |
# packagesディレクトリを作成
mkdir -p ./packages/
# Helmパッケージを作成
helm package . -d ./packages/
# リポジトリインデックスを更新
helm repo index ./packages/ --url https://git.cafepieters.com/helmchart/wordpress/raw/branch/main/packages/
# パッケージファイルをコミット
git add ./packages/*.tgz ./packages/index.yaml
git commit -m "chore: Add Helm package for version ${{ steps.increment.outputs.new_chart_version }}" || echo "No package changes to commit"
# パッケージのプッシュをリトライ機構付きで実行
MAX_RETRIES=3
RETRY_COUNT=0
until git push origin main || [ $RETRY_COUNT -eq $MAX_RETRIES ]; do
RETRY_COUNT=$((RETRY_COUNT+1))
echo "Push failed, retrying ($RETRY_COUNT/$MAX_RETRIES)..."
sleep 5
git pull --rebase origin main
done
if [ $RETRY_COUNT -eq $MAX_RETRIES ]; then
echo "ERROR: Failed to push Helm packages after $MAX_RETRIES attempts"
exit 1
fi
echo "Successfully pushed Helm packages"
- name: Create release tag
if: steps.update_values.outputs.chart_version_update_needed == 'true'
run: |
# リリースタグを作成(Chart.yaml更新時のみ)
TAG_NAME="v${{ steps.increment.outputs.new_chart_version }}"
# タグが既に存在するか確認
if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then
echo "INFO: Tag $TAG_NAME already exists locally"
else
# タグメッセージを作成
cat << EOF > /tmp/tag_msg.txt
Release $TAG_NAME
${{ steps.check.outputs.changes }}
Chart version: ${{ steps.increment.outputs.new_chart_version }}
EOF
git tag -a "$TAG_NAME" -F /tmp/tag_msg.txt
echo "Created tag: $TAG_NAME"
fi
# タグをプッシュ(リトライ付き)
MAX_RETRIES=3
RETRY_COUNT=0
until git push origin "$TAG_NAME" 2>/dev/null || [ $RETRY_COUNT -eq $MAX_RETRIES ]; do
RETRY_COUNT=$((RETRY_COUNT+1))
echo "Tag push failed, retrying ($RETRY_COUNT/$MAX_RETRIES)..."
sleep 5
done
if [ $RETRY_COUNT -eq $MAX_RETRIES ]; then
echo "ERROR: Failed to push tag $TAG_NAME after $MAX_RETRIES attempts"
exit 1
fi
echo "Successfully pushed tag: $TAG_NAME"
- name: Summary
if: always()
run: |
echo "=== Workflow Summary ==="
echo "Update needed: ${{ steps.check.outputs.update_needed }}"
echo ""
echo "WordPress:"
echo " Current: ${{ steps.current.outputs.current_wordpress }}"
echo " Latest: ${{ steps.wordpress.outputs.version }}"
echo ""
echo "Nginx:"
echo " Current: ${{ steps.current.outputs.current_nginx }}"
echo " Latest: ${{ steps.nginx.outputs.version }}"
if [ "${{ steps.check.outputs.update_needed }}" == "true" ]; then
echo ""
echo "Chart version update: ${{ steps.update_values.outputs.chart_version_update_needed }}"
if [ "${{ steps.update_values.outputs.chart_version_update_needed }}" == "true" ]; then
echo "Chart version: ${{ steps.increment.outputs.new_chart_version }}"
echo "Tag: v${{ steps.increment.outputs.new_chart_version }}"
else
echo "INFO: Chart.yaml skipped (WordPress version unchanged)"
fi
fi