ubuntu-latest(Ubuntu 26.04)の sudo -E:「preserving the entire environment is not supported, '-E' is ignored」
ubuntu-latest は、2026年10月19日から11月19日にかけて Ubuntu 24.04 から 26.04 に移ります(ほかに変わること)。26.04 の sudo は sudo-rs で、sudo-rs は -E に対応していません。警告を出したうえで、渡すつもりだった変数なしでコマンドを動かします:
sudo: preserving the entire environment is not supported, '-E' is ignored
どこで落ちるか
警告にすぎないので、落ちるのはそのあと、コマンドが変数を必要としたところです。set -u のスクリプトは最初の変数で止まります(edge-addition-planarity-suite #378・jirutka/setup-alpine):
Run sudo -E ./setup-alpine.sh sudo: preserving the entire environment is not supported, '-E' is ignored /home/runner/work/_actions/jirutka/setup-alpine/.../setup-alpine.sh: line 134: INPUT_APK_TOOLS_URL: unbound variable Error: Process completed with exit code 1.
インストール先を変数から読むインストーラーは、プログラムを違うディレクトリに入れ、次のステップがそれを見つけられません(dagger #15047):
dagger: command not found ##[error]Process completed with exit code 127.
いちばん困るのは、ステップが緑のままの場合です。sudo -E で起動したサーバーが自分のアドレスを持たずに立ち上がり、空の DNS レコードを返していました(stamhoofd #1487)。エージェントのジョブが API キーを失った例もあります。24.04 で Anthropic=true だったログの行が、26.04 では Anthropic=false になっていました(agentmeter-action #32)。sudo -E を使うジョブの動きが10月19日のあとに変わったなら、ログでこの警告を探します。
なぜか
sudo-rs は、-E と一覧の無い --preserve-env を同じに扱います。警告して無視します(sudo-rs の src/sudo/cli/mod.rs)。-E に対応してほしいという要望は sudo-rs #1299 で、まだ開いています。--preserve-env= に名前の一覧を付ければ通ります。古い sudo も 26.04 のイメージに /usr/bin/sudo.ws として入っています。
直し方:変数の名前を並べる
一覧は sudo でも sudo-rs でも通るので、同じ行が 24.04 でも 26.04 でも動きます:
sudo --preserve-env=SERVER_IP,GOCOVERDIR ./start.sh
または env で渡します。env は渡された値のまま root で動きます:
sudo env SERVER_IP="$SERVER_IP" ./start.sh
PATH は別の話です。Ubuntu の sudoers は secure_path を設定しているので、-E を付けても、どちらの sudo もあなたの PATH を残しませんでした。sudo -E env "PATH=$PATH" ... と書いていたなら、env "PATH=$PATH" の部分はそのままにして、-E を一覧に置き換えます。
自分で作っているアクションでは、入力は INPUT_* の変数で届きます。action.yml の sudo -E ./script.sh は、そのすべてを失います。スクリプトが読む INPUT_* と GITHUB_* の名前を並べます(setup-alpine #35 がそうしています)。gh-aw 1.0 のようにすべてを渡すなら、エクスポートされた名前から一覧を作ります:
sudo --preserve-env="$(compgen -e | paste -sd, -)" ./script.sh
sudo -E が、使っているアクションの中にあるとき
jirutka/setup-alpine のいちばん新しいリリースの v1.4.1 は、まだ sudo -E ./setup-alpine.sh を動かしており、直しはまだ取り込まれていないプルリクエストです。直しの入ったリリースが出るまでは、そのジョブを runs-on: ubuntu-24.04 に固定するか、そのステップの前でジョブを古い sudo に戻します:
- name: Use the classic sudo
run: |
if [ -x /usr/bin/sudo.ws ]; then
sudo update-alternatives --set sudo /usr/bin/sudo.ws
fi
24.04 には sudo.ws が無いので、そこでは if が飛ばします。10月と11月の直しの多くは 24.04 への固定で、GitHub が 24.04 を引退させるまでは持ちます。どちらにしても「Set up job」を見ます。Runner Image のグループに ubuntu-26.04 か ubuntu-24.04 と出ます。11月19日までは、やり直しが 24.04 に当たって通ることがあるので、やり直しで緑になっても何も証明されません。
26.04 の sudo-rs のほかの違い
- 自分で書く sudoers のファイルで、コマンドの引数にワイルドカードを使うと拒まれます:
syntax error: wildcards are not allowed in command arguments(safer-runner-action #5)。 - パスワードの入力の催促や「incorrect password attempt」など、sudo のメッセージを読む道具は、sudo-rs の違う言い回しを見落とすことがあります。
bwrapの中のサンドボックスは、AppArmor のbwrap-userns-restrictの下で「No permissions to create a new namespace」で落ちます:Ubuntu 26.04 の bubblewrap。- 26.04 では基本のコマンドのほとんどが uutils なので、名前を変えた
sleepのコピーは「coreutils: unknown program」で落ち、timeout -kはプロセスグループを止めなくなりました:「coreutils: unknown program」と uutils のほかの違い。 - 名前の変わった apt のパッケージから Playwright まで、26.04 のほかの失敗:Ubuntu 26.04 の apt・Ubuntu 26.04 の Playwright。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、Ubuntu は Canonical Ltd. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・Canonical・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「The ubuntu-latest label will migrate to Ubuntu 26」 · Ubuntu 26.04 の apt · Ubuntu 26.04 の Playwright · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English