Changed the 'Update values.yaml' step to skip error exit when no version updates are available. Instead of failing with exit 1, the workflow now logs an INFO message and continues execution, allowing the workflow to complete successfully when versions are already up to date. - Changed ERROR message to INFO message - Replaced exit 1 with conditional logic - Added else clause to log when changes are detected Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
319 lines
13 KiB
YAML
319 lines
13 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
|
||
|
||
- 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
|
||
|
||
- 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'
|
||
run: |
|
||
# バックアップを作成
|
||
cp values.yaml values.yaml.bak
|
||
|
||
# WordPressのtagを更新
|
||
# image.wordpress.tagの行を特定して置換
|
||
awk -v new_tag="${{ steps.wordpress.outputs.version }}" '
|
||
/^image:/ { in_image=1 }
|
||
in_image && /^ wordpress:/ { in_wordpress=1; print; next }
|
||
in_wordpress && /^ tag:/ {
|
||
print " tag: \"" new_tag "\""
|
||
in_wordpress=0
|
||
next
|
||
}
|
||
in_wordpress && /^ [a-z]/ { in_wordpress=0 }
|
||
in_image && /^[a-z]/ { in_image=0 }
|
||
{ print }
|
||
' values.yaml.bak > values.yaml.tmp
|
||
mv values.yaml.tmp values.yaml
|
||
|
||
# Nginxのtagを更新
|
||
cp values.yaml values.yaml.tmp
|
||
awk -v new_tag="${{ steps.nginx.outputs.version }}" '
|
||
/^image:/ { in_image=1 }
|
||
in_image && /^ nginx:/ { in_nginx=1; print; next }
|
||
in_nginx && /^ tag:/ {
|
||
print " tag: \"" new_tag "\""
|
||
in_nginx=0
|
||
next
|
||
}
|
||
in_nginx && /^ [a-z]/ { in_nginx=0 }
|
||
in_image && /^[a-z]/ { in_image=0 }
|
||
{ print }
|
||
' values.yaml.tmp > values.yaml
|
||
rm values.yaml.tmp
|
||
|
||
# 変更内容を表示
|
||
echo "=== Changes in values.yaml ==="
|
||
diff values.yaml.bak values.yaml || true
|
||
|
||
# 実際に変更されたか確認
|
||
if diff -q values.yaml.bak values.yaml > /dev/null; then
|
||
echo "INFO: No changes were made to values.yaml (versions already up to date)"
|
||
cat values.yaml | grep -A 5 "image:"
|
||
else
|
||
echo "Changes detected in values.yaml"
|
||
fi
|
||
|
||
echo "=== Updated values.yaml (image section) ==="
|
||
grep -A 10 "^image:" values.yaml
|
||
|
||
- name: Increment chart version
|
||
if: steps.check.outputs.update_needed == 'true'
|
||
id: increment
|
||
run: |
|
||
# Chart.yamlのバージョンをインクリメント
|
||
if [ -f Chart.yaml ]; then
|
||
CURRENT_CHART_VERSION=$(grep '^version:' Chart.yaml | awk '{print $2}')
|
||
# パッチバージョンをインクリメント(例: 1.0.0 -> 1.0.1)
|
||
NEW_CHART_VERSION=$(echo $CURRENT_CHART_VERSION | awk -F. '{print $1"."$2"."$3+1}')
|
||
sed -i "s/^version: .*/version: $NEW_CHART_VERSION/" Chart.yaml
|
||
echo "Chart version updated: $CURRENT_CHART_VERSION -> $NEW_CHART_VERSION"
|
||
echo "new_chart_version=$NEW_CHART_VERSION" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "Chart.yaml not found, skipping version increment"
|
||
echo "new_chart_version=unknown" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
- name: Commit and push changes
|
||
if: steps.check.outputs.update_needed == 'true'
|
||
run: |
|
||
git add values.yaml Chart.yaml
|
||
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.check.outputs.update_needed == 'true'
|
||
uses: azure/setup-helm@v3
|
||
with:
|
||
version: 'latest'
|
||
|
||
- name: Create Helm package
|
||
if: steps.check.outputs.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"
|
||
git push origin main || echo "Failed to push packages (this may be expected)"
|
||
|
||
- name: Create release tag
|
||
if: steps.check.outputs.update_needed == 'true'
|
||
run: |
|
||
# リリースタグを作成
|
||
TAG_NAME="v${{ steps.increment.outputs.new_chart_version }}"
|
||
|
||
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
|
||
git push origin "$TAG_NAME" || echo "Failed to push tag (tag may already exist)"
|
||
|
||
- 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: ${{ steps.increment.outputs.new_chart_version }}"
|
||
echo "Tag: v${{ steps.increment.outputs.new_chart_version }}"
|
||
fi |