Release v1.0.3 #8
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Auto Release on Merge | |
| # リリースブランチ(release/vX.Y.Z)がmainにマージされたら自動的にリリース処理を実行 | |
| on: | |
| pull_request: | |
| types: [closed] | |
| branches: | |
| - main | |
| jobs: | |
| auto-release: | |
| # PRがマージされ、かつブランチ名がrelease/vで始まる場合のみ実行 | |
| if: github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'release/v') | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| pull-requests: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| ref: main | |
| fetch-depth: 0 | |
| - name: Configure git | |
| run: | | |
| git config user.name "github-actions[bot]" | |
| git config user.email "github-actions[bot]@users.noreply.github.com" | |
| - name: Extract version from branch name | |
| id: version | |
| run: | | |
| # ブランチ名からバージョンを抽出 (release/v1.0.1 → v1.0.1) | |
| BRANCH_NAME="${{ github.event.pull_request.head.ref }}" | |
| VERSION_TAG="${BRANCH_NAME#release/}" | |
| VERSION="${VERSION_TAG#v}" | |
| echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT | |
| echo "version_tag=$VERSION_TAG" >> $GITHUB_OUTPUT | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| echo "📦 リリースブランチ: $BRANCH_NAME" | |
| echo "🏷️ バージョンタグ: $VERSION_TAG" | |
| echo "🔢 バージョン番号: $VERSION" | |
| - name: Validate CHANGELOG entry | |
| run: | | |
| VERSION="${{ steps.version.outputs.version }}" | |
| if ! grep -q "## \[$VERSION\]" CHANGELOG.md; then | |
| echo "❌ エラー: CHANGELOG.mdにバージョン [$VERSION] のセクションが見つかりません" | |
| echo "リリースブランチでCHANGELOG.mdを更新してください" | |
| exit 1 | |
| fi | |
| echo "✅ CHANGELOG.mdに [$VERSION] セクションが存在します" | |
| - name: Create and push tag | |
| run: | | |
| VERSION_TAG="${{ steps.version.outputs.version_tag }}" | |
| # タグが既に存在する場合はスキップ | |
| if git rev-parse "$VERSION_TAG" >/dev/null 2>&1; then | |
| echo "⚠️ タグ $VERSION_TAG は既に存在します。スキップします。" | |
| exit 0 | |
| fi | |
| # タグを作成 | |
| git tag "$VERSION_TAG" | |
| # タグをプッシュ | |
| git push origin "$VERSION_TAG" | |
| echo "✅ タグ $VERSION_TAG を作成してプッシュしました" | |
| - name: Extract changelog for release notes | |
| id: changelog | |
| run: | | |
| VERSION="${{ steps.version.outputs.version }}" | |
| TAG="${{ steps.version.outputs.version_tag }}" | |
| # CHANGELOG.mdから該当バージョンのセクションを抽出 | |
| if grep -q "## \[$VERSION\]" CHANGELOG.md; then | |
| # バージョンセクションの開始行を見つける | |
| START_LINE=$(grep -n "## \[$VERSION\]" CHANGELOG.md | cut -d: -f1) | |
| # 次のバージョンセクションの開始行を見つける(または末尾) | |
| NEXT_LINE=$(tail -n +$((START_LINE + 1)) CHANGELOG.md | grep -n "^## \[" | head -1 | cut -d: -f1) | |
| if [ -n "$NEXT_LINE" ]; then | |
| # 次のセクションがある場合 | |
| END_LINE=$((START_LINE + NEXT_LINE - 1)) | |
| sed -n "${START_LINE},${END_LINE}p" CHANGELOG.md > changelog_section.md | |
| else | |
| # 最後のセクションの場合 | |
| sed -n "${START_LINE},\$p" CHANGELOG.md > changelog_section.md | |
| fi | |
| # バージョン見出しを削除 | |
| sed -i '1d' changelog_section.md | |
| # リンクセクションを削除 | |
| sed -i '/^\[.*\]: http/d' changelog_section.md | |
| # 空行を整理 | |
| sed -i '/^$/N;/^\n$/D' changelog_section.md | |
| # リリースノートを整形して作成 | |
| cat > release_notes.md <<EOF | |
| # 🎉 ${TAG} リリース | |
| swift-api-server ${TAG} がリリースされました。 | |
| ## 📝 変更内容 | |
| $(cat changelog_section.md) | |
| ## 📦 インストール | |
| \`\`\`swift | |
| dependencies: [ | |
| .package(url: "https://github.com/no-problem-dev/swift-api-server.git", .upToNextMajor(from: "${VERSION}")) | |
| ] | |
| \`\`\` | |
| ## 🔗 リンク | |
| - [変更履歴](https://github.com/no-problem-dev/swift-api-server/blob/main/CHANGELOG.md) | |
| - [ドキュメント](https://no-problem-dev.github.io/swift-api-server/documentation/apiserver/) | |
| EOF | |
| echo "found=true" >> $GITHUB_OUTPUT | |
| else | |
| echo "found=false" >> $GITHUB_OUTPUT | |
| echo "⚠️ CHANGELOG.mdにバージョン $VERSION が見つかりませんでした" > release_notes.md | |
| fi | |
| - name: Create GitHub Release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: ${{ steps.version.outputs.version_tag }} | |
| name: v${{ steps.version.outputs.version }} | |
| body_path: release_notes.md | |
| draft: false | |
| prerelease: false | |
| generate_release_notes: ${{ steps.changelog.outputs.found != 'true' }} | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Calculate next version | |
| id: next_version | |
| run: | | |
| VERSION="${{ steps.version.outputs.version }}" | |
| # バージョンをMAJOR.MINOR.PATCHに分解 | |
| IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION" | |
| # PATCHをインクリメント | |
| NEXT_PATCH=$((PATCH + 1)) | |
| NEXT_VERSION="$MAJOR.$MINOR.$NEXT_PATCH" | |
| NEXT_VERSION_TAG="v$NEXT_VERSION" | |
| NEXT_BRANCH="release/$NEXT_VERSION_TAG" | |
| echo "next_version=$NEXT_VERSION" >> $GITHUB_OUTPUT | |
| echo "next_version_tag=$NEXT_VERSION_TAG" >> $GITHUB_OUTPUT | |
| echo "next_branch=$NEXT_BRANCH" >> $GITHUB_OUTPUT | |
| echo "📈 次のバージョン: $NEXT_VERSION" | |
| echo "🌿 次のリリースブランチ: $NEXT_BRANCH" | |
| - name: Delete old release branch if exists | |
| run: | | |
| NEXT_BRANCH="${{ steps.next_version.outputs.next_branch }}" | |
| # リモートブランチが存在する場合は削除 | |
| if git ls-remote --heads origin "$NEXT_BRANCH" | grep -q "$NEXT_BRANCH"; then | |
| git push origin --delete "$NEXT_BRANCH" | |
| echo "🗑️ 既存のブランチ $NEXT_BRANCH を削除しました" | |
| fi | |
| - name: Create next release branch | |
| run: | | |
| NEXT_BRANCH="${{ steps.next_version.outputs.next_branch }}" | |
| # mainブランチから新しいリリースブランチを作成 | |
| git checkout -b "$NEXT_BRANCH" | |
| echo "✅ 次のリリースブランチ $NEXT_BRANCH を作成しました" | |
| - name: Update CHANGELOG for next version | |
| run: | | |
| VERSION="${{ steps.version.outputs.version }}" | |
| VERSION_TAG="${{ steps.version.outputs.version_tag }}" | |
| NEXT_VERSION="${{ steps.next_version.outputs.next_version }}" | |
| # 「未リリース」セクションが存在しない場合のみ追加 | |
| if ! grep -q "## \[未リリース\]" CHANGELOG.md; then | |
| # 最初のバージョンセクションの前に挿入 | |
| awk ' | |
| /^## \[/ && !inserted { | |
| print "## [未リリース]" | |
| print "" | |
| print "なし" | |
| print "" | |
| inserted = 1 | |
| } | |
| { print } | |
| ' CHANGELOG.md > CHANGELOG.tmp | |
| mv CHANGELOG.tmp CHANGELOG.md | |
| echo "✅ CHANGELOG.mdに「未リリース」セクションを追加しました" | |
| else | |
| echo "ℹ️ CHANGELOG.mdに既に「未リリース」セクションが存在します" | |
| fi | |
| # 比較リンクを最新バージョンに更新 | |
| sed -i "s|\[未リリース\]: .*|\[未リリース\]: https://github.com/no-problem-dev/swift-api-server/compare/$VERSION_TAG...HEAD|" CHANGELOG.md | |
| # 必ず変更を発生させるため、自動生成コメントを追加 | |
| echo "" >> CHANGELOG.md | |
| echo "<!-- Auto-generated on $(date -u +%Y-%m-%dT%H:%M:%SZ) by release workflow -->" >> CHANGELOG.md | |
| echo "✅ CHANGELOG.mdを更新しました" | |
| - name: Commit and push next release branch | |
| run: | | |
| NEXT_BRANCH="${{ steps.next_version.outputs.next_branch }}" | |
| NEXT_VERSION_TAG="${{ steps.next_version.outputs.next_version_tag }}" | |
| # 変更がある場合のみコミット | |
| if git diff --quiet CHANGELOG.md; then | |
| echo "ℹ️ CHANGELOG.mdに変更がないため、コミットをスキップします" | |
| else | |
| git add CHANGELOG.md | |
| git commit -m "chore: prepare for $NEXT_VERSION_TAG release" | |
| echo "✅ 変更をコミットしました" | |
| fi | |
| # ブランチをプッシュ | |
| git push origin "$NEXT_BRANCH" | |
| echo "✅ ブランチ $NEXT_BRANCH をプッシュしました" | |
| - name: Create draft PR for next release | |
| run: | | |
| NEXT_BRANCH="${{ steps.next_version.outputs.next_branch }}" | |
| NEXT_VERSION_TAG="${{ steps.next_version.outputs.next_version_tag }}" | |
| gh pr create \ | |
| --draft \ | |
| --title "Release $NEXT_VERSION_TAG" \ | |
| --body "$(cat <<EOF | |
| # 🚀 Release $NEXT_VERSION_TAG | |
| 次のリリース準備用のブランチです。 | |
| ## 📝 開発フロー | |
| 1. **開発**: このブランチに新機能・修正をマージ | |
| 2. **CHANGELOG更新**: \`CHANGELOG.md\` の「未リリース」セクションに変更を記録 | |
| 3. **リリース準備**: すべての変更が完了したら、「未リリース」を「$NEXT_VERSION_TAG」セクションに変換 | |
| 4. **リリース実行**: このPRをマージ | |
| ## ⚙️ 自動化 | |
| このPRをmainにマージすると、以下が自動実行されます: | |
| - ✅ タグ $NEXT_VERSION_TAG の自動作成 | |
| - ✅ GitHub Releaseの自動作成 | |
| - ✅ 次のリリースブランチの自動作成 | |
| ## 📋 リリース前チェックリスト | |
| - [ ] CHANGELOG.mdの「未リリース」を「[$NEXT_VERSION_TAG]」に変換 | |
| - [ ] 日付を記載(YYYY-MM-DD形式) | |
| - [ ] 比較リンクセクションを更新 | |
| - [ ] すべてのテストが通過 | |
| - [ ] ドキュメントが最新 | |
| --- | |
| 🤖 このPRは自動生成されました | |
| EOF | |
| )" \ | |
| --base main \ | |
| --head "$NEXT_BRANCH" | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| - name: Summary | |
| run: | | |
| VERSION_TAG="${{ steps.version.outputs.version_tag }}" | |
| NEXT_VERSION_TAG="${{ steps.next_version.outputs.next_version_tag }}" | |
| NEXT_BRANCH="${{ steps.next_version.outputs.next_branch }}" | |
| echo "## 🎉 リリース処理完了" | |
| echo "" | |
| echo "### ✅ 実行された処理" | |
| echo "- タグ $VERSION_TAG を作成・プッシュ" | |
| echo "- GitHub Releaseを作成" | |
| echo "- 次のリリースブランチ $NEXT_BRANCH を作成" | |
| echo "- 次のリリース用のドラフトPRを作成" | |
| echo "" | |
| echo "### 🔗 確認" | |
| echo "- リリース: https://github.com/${{ github.repository }}/releases/tag/$VERSION_TAG" | |
| echo "- 次のPR: https://github.com/${{ github.repository }}/pulls" |