release について
Remotion monorepo のリリース手順を詳しく定めたスキルです。認証、ビルドとバージョン設定、npm パッケージの検証とタグ昇格、後続の公開を扱い、実行条件やロールバック、変更履歴の承認も定義します。
主な機能
- 01リリース認証と環境の確認
- 02パッケージのビルドとバージョン設定
- 03一時 npm タグでのパッケージ公開
- 04latest 昇格前のパッケージ検証
- 05一部昇格時の復旧とロールバック
- 06変更履歴の準備と承認
活用シーン
- 01Remotion monorepo リリースの準備
- 02昇格前の npm パッケージ公開確認
- 03タグの一部昇格後の復旧
- 04承認用リリースノートの作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ remotion-dev/ remotion --skill releaseインストール後、Claude Code で/releaseを入力して読み込まれたか確認します。
詳細
- 実行中の可能性がある
turboプロセスをすべて SIGKILL で終了します。 - リリースを開始する前に、
gcloud auth print-access-token >/dev/nullを実行して gcloud にログイン済みであることを確認します。失敗した場合はgcloud auth loginを実行してから、確認を繰り返します。この確認が成功するまではリリースを続行しないでください。 - Codex 固有:リリースコマンドを実行する前に、macOS のシステム Ruby より rbenv が優先されることを確認します。Codex は非対話シェルを起動する際、
~/.rbenv/shimsより/usr/binが先になることがあり、ユーザーのターミナルでは Ruby 3.3.x が使われていても Ruby 2.6 が使われる場合があります。Ruby/Bundler を呼び出す可能性のあるリリースコマンドは、次のように実行します。PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH" <command>PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH" ruby --versionで確認します。/usr/bin/rubyではなく、ユーザーの rbenv Ruby が使われている必要があります。lambda Ruby パッケージが現在、Ruby >= 2.7 を必要とするjsonなどの gem を解決するため、これは重要です。 npm whoamiを確認します。失敗した場合に限り、npm loginを実行します(ブラウザーでの 2FA は手動で行います)。- NPM のパスワードを取得するには、
op item get "Npmjs" --fields password --reveal --account remotiondev.1password.comを使用します。 - 2FA 用のワンタイムパスワードを取得するには、
op item get "Npmjs" --otp --account remotiondev.1password.comを使用します。 npm token create --name="PublishRemotionXXXXXX" --packages "remotion" --packages "create-video" --packages-and-scopes-permission read-write --bypass-2fa --scopes "@remotion" --otp=<otp>を実行します。XXXXXX は一意の名前になるようランダムな文字列に置き換えます。op item get "Npmjs" --otp --account remotiondev.1password.comで OTP を取得し、--otp=経由で渡します。パスワードを求められたら、echo "$PASSWORD" |を使ってパスワードをパイプで渡します。--jsonは渡さないでください。npm は JSON 出力でトークンをnpm_***とマスクするため、使用できなくなります。通常の出力をスクラッチパッド内のファイルにリダイレクトし、grep -oE 'npm_[A-Za-z0-9]{20,}'を使ってトークンをスクラッチパッドのファイル(例:$SP/npm_token)に抽出します。トークンは絶対に表示しないでください。トークンが使えないと判明した場合は、npm token listで ID を確認し、npm token revoke <id> --otp=<otp>で無効化します。
bun iを実行します。bun run buildを実行します。npm view remotion versionを実行して現在のバージョン番号を取得します。- 現在のバージョンに 1 を加えた値を
<version>として、bun set-version.ts <version>を実行します。終了コードが 0 以外の場合は、リリースプロセス全体を直ちに中止します。出力を(たとえばtailに)パイプしないでください。シェルは zsh のため$PIPESTATUSが使えず、終了コードが失われます。代わりにログファイルにリダイレクトし、v<version>のコミットとタグが存在することを確認します。 cd packages/example && sh runlambda.sh && cd ../..を実行します。失敗した場合はリリースを中止します。- 一時的な npm dist-tag を使って公開パッケージを公開し、すべてのパッケージがインストール可能になってから
latestに昇格します。validatingは通常の公開に対する npm の自動スキャンであり、npm stageを使う理由にはなりません。bun run releaseは実行しないでください。現在のスクリプトはlatestに直接公開し、公開可能性の確認前に非公開パッケージの公開と Git のプッシュを開始します。-
リポジトリのルートから、
set-version.tsの実行後に次を実行します。releaseVersion=$(node -p "require('./packages/core/package.json').version") releaseTag="remotion-release-$(printf '%s' "$releaseVersion" | tr . -)" releaseManifest="/tmp/remotion-release-${releaseVersion}-packages.txt" bun publish.ts --list > "$releaseManifest"このマニフェストが、確認および昇格の対象となる正確なパッケージ一覧です。一部の昇格をロールバックできるよう、各パッケージの以前の
latestタグを記録します。 -
マニフェスト内のいずれかのパッケージが npm に初めて公開されるかどうかを確認します。Bun は
--tagを指定しても、パッケージの初回公開時にlatestを追加します。新しいパッケージがある場合は、一括公開の前に停止し、それらの初回公開を別途計画してください。このフローでは、初回バージョンをlatestから外すことはできません。 -
上で作成したトークンを使用して
NPM_CONFIG_TOKEN=<token> bun publish.ts --tag="$releaseTag"を実行します。Bun は引き続きパッケージをパックし、workspace:およびcatalog:依存関係を書き換えます。このタグ付きパスは再公開エラーを許容しません。アップロードの成功は、npm のスキャンが完了した証拠にはなりません。マニフェスト、正確なパッケージバージョン、一時タグを確認してください。スキャンが保留中の間は、同じバージョンを再度アップロードしないでください。公開試行が失敗し、そのバージョンが存在しないことが確認された場合は、同じトークンを使用してbun publish.ts --tag="$releaseTag" --only=<package>でそのパッケージのみを再開してください。マニフェスト全体を盲目的に再実行しないでください。 -
マニフェスト内の各パッケージについて、プロモーションの前に
npm view <package>@<version> version --jsonおよびnpm pack <package>@<version> --pack-destination <temporary-directory>の成功を必須とします。pack チェックは、tarball を実際に取得できることを確認します。パッケージごとのチェックはwhile read -r p; do ( ... ) & done < "$releaseManifest"; waitループで実行してください(「command line cannot be assembled」で失敗するxargs -Iは使用しないでください)。公開直後は、およそ 3 分の 1 のパッケージがまだvalidatingであると想定してください。これには約 15 分かかっています。ポーリングループをスクリプトとして記述してバックグラウンドで実行し、その間に changelog を作成してください。未解決のパッケージを約 1 分に 1 回ポーリングします。利用可能な場合は npm lifecycle status API を使用してください:GET https://registry.npmjs.org/-/package/<encoded-package-name>/version/<version>/statusを公開アクセス権で認証して使用します。@remotion%2Fwhisper-webのようにスコープ付き名を URL エンコードし、認証情報をログに残さないでください。パッケージが 1 時間経過してもvalidatingのままである場合は、リリースを保留として報告し、すべてのlatestタグを前回のリリースのままにしてください。blocked、rejected、manual-review、missing、unknown の状態もプロモーションを停止します。これらをスキャンの遅延として扱わず、調査してください。 -
すべてのパッケージがインストール可能になったら、リリーストークンを使用して、マニフェスト内のすべてのパッケージに対して
npm dist-tag add <package>@<version> latestを実行します。npm CLI はNPM_CONFIG_TOKENを無視し(bun publishのみがこれを尊重します)、ログインセッションにフォールバックしてEOTPで失敗します。代わりに次のようにトークンを渡してください:env "npm_config_//registry.npmjs.org/:_authToken=$TOKEN" npm dist-tag add ...。これはパッケージごとに 1 回のレジストリ操作です。npm には複数パッケージのアトミックなプロモーションはありません。すべてのパッケージについてnpm view <package> dist-tags.latest --prefer-onlineがリリースバージョンと一致することを確認してください。並列チェックでは、一部のパッケージについて古いキャッシュされたタグが返されることがあります。失敗として扱う前に、不一致を順次再確認してください。プロモーションが途中で失敗した場合は、すでに変更されたパッケージについて記録された以前のlatestタグを復元し、不完全なリリースとして報告してください。プロモーションの成功後、各パッケージから一時タグを削除し、最終的なタグを確認してください。リリーストークンはdist-tag rmでE403を受け取るため、呼び出しごとに新しい OTP を使用してログインセッションを使用してください:npm dist-tag rm <package> <releaseTag> --otp=$(op item get "Npmjs" --otp --account remotiondev.1password.com)。OTP のロールオーバーにより呼び出しが失敗した場合は、30 秒待ってから 1 回再試行してください。 -
npm が明示的に
E_STAGE_REQUIREDを返した場合、そのパッケージでは直接公開を利用できません。このリリースを停止し、ステージングされたワークフローを別途評価してください。ステージングされた承認にはパッケージごとに 2FA アクションが必要です。ステージングされたパッケージをこの直接公開フローに黙って混在させないでください。
-
- 公開用のすべての
latestタグを検証した後にのみ、リポジトリのルートからbunx turbo run publishprivate --concurrency=1を実行し、続けてgit push --tagsとgit pushを実行します。いずれかの手順が失敗した場合は中止し、影響を受けたリリースの状態を報告してください。 - 公開パッケージの昇格後、リポジトリのルートから
bun run publishtemplatesを実行して、すべてのテンプレートを再公開します。いずれかのテンプレートの公開に失敗した場合は、リリースワークフローを中止して、失敗を報告してください。 - 変更履歴を markdown 形式で生成し、
/tmp/release-<version>.mdに保存します。git log v<previous_version>..v<new_version> --onelineを実行して、すべてのコミットを取得します- マージコミットから PR 番号を抽出します
- 各 PR について、
gh pr view <number> --json title,author,number,url --jq '"* \(.title) by @\(.author.login) in \(.url)"'を実行します - PR を「What's Changed」、「Templates」、「Docs」、「Internal」のセクションに分類します
- 前回のリリースで「Elements」と「Internal and Experimental」のセクションが使われている場合は、それらも使用します
- 「What's Changed」では、主要な機能(特に新しいドキュメントページを伴うもの)を先頭に置き、同じパッケージの項目が隣り合うように並べ替えます(小見出しは使わず、並べ替えのみとします)。
remotionコアパッケージの変更を先頭に置きます - PR のタイトルから冗長な接頭辞を削除します(例:「Docs」セクションの項目から「Docs:」を削除)
- PR に新しいドキュメントページが追加されている項目にはリンクを設定します。
git diff --diff-filter=A --name-only v<previous_version>..v<new_version> -- 'packages/docs/docs/**/*.mdx' 'packages/docs/docs/**/*.md'を実行して追加されたドキュメントページを一覧表示し、追加された各ページを、そのページを導入した PR に対応付けます。その項目のタイトルを、ページへの markdown リンクで囲みます(例:* [<title>](https://remotion.dev/docs/<slug>) by @author in <url>)。URL は、ページの frontmatter にslug:があればそこから取得し、なければpackages/docs/docs/からの相対ファイルパスを使用します。新しいドキュメントページがない項目にはリンクを設定しません - 「Templates」は、template-* に関する変更をまとめる独立したセクションです
- PR の作成者と照合するため、
gh api repos/remotion-dev/remotion/contributors --paginate --jq '.[].login'を実行して、実際に新規のコントリビューターを確認します。このリストに含まれない作成者がいる場合にのみ、「New Contributors」セクションを追加します - 最後に
**Full Changelog**: https://github.com/remotion-dev/remotion/compare/v<previous_version>...v<new_version>を追加します - 以前の GitHub リリースを確認し、同じ形式を使用します(
gh release view v<previous_version>を実行) - 承認を得るまではリリースしないでください。編集できるようにしてください。ただし、これは npm の手順を妨げるものではありません。npm パッケージのスキャン中に変更履歴を作成し、承認を待たずに昇格、プライベート公開、プッシュ、テンプレートの公開を続けます
- 承認後、
/tmp/release-<version>.mdを再読み込みします(編集されている可能性があります)。その後、gh release create v<version> --title v<version> --notes-file /tmp/release-<version>.md --verify-tagを実行します
- 最後に、スクラッチパッドから npm トークンのローカルコピーを削除します。トークンは7日後に自動的に期限切れになります。