GitLab Runnerが署名の鍵の期限切れでアップデートできなかったのを解消した話

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

以下の記事を書いたのですが、GitLab Runnerは以下の方法では更新できなかったので、Fix方法を書いておきます。

GitLabとRunnerが署名の鍵の期限切れでアップデートできなかったのを解消した話 #GitLab - Qiita
https://qiita.com/ynott/items/930558bdb5456746f40c

# 1. Runnerの署名エラー

GitLab Runnerで `apt update`すると以下のようなエラーが出ます。

```io
$ sudo apt update
[sudo] password for user:
取得:2 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
ヒット:3 http://jp.archive.ubuntu.com/ubuntu jammy InRelease
取得:4 http://jp.archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
ヒット:1 https://packages.gitlab.com/runner/gitlab-runner/ubuntu jammy InRelease
エラー:1 https://packages.gitlab.com/runner/gitlab-runner/ubuntu jammy InRelease
  以下の署名が無効です: EXPKEYSIG 3F01618A51312F3F GitLab B.V. (package repository signing key) <packages@gitlab.com>
取得:5 http://jp.archive.ubuntu.com/ubuntu jammy-backports InRelease [109 kB]
取得:6 http://jp.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [1,462 kB]
取得:7 http://jp.archive.ubuntu.com/ubuntu jammy-updates/main i386 Packages [587 kB]
取得:8 http://jp.archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages [1,559 kB]
取得:9 http://jp.archive.ubuntu.com/ubuntu jammy-updates/restricted Translation-en [259 kB]
取得:10 http://jp.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [1,057 kB]
取得:11 http://jp.archive.ubuntu.com/ubuntu jammy-updates/universe i386 Packages [696 kB]
取得:12 http://jp.archive.ubuntu.com/ubuntu jammy-updates/universe Translation-en [239 kB]
6,196 kB を 5秒 で取得しました (1,305 kB/s)
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
アップグレードできるパッケージが 8 個あります。表示するには 'apt list --upgradable' を実行してください。
W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: https://packages.gitlab.com/runner/gitlab-runner/ubuntu jammy InRelease: 以下の署名が無効です: EXPKEYSIG 3F01618A51312F3F GitLab B.V. (package repository signing key) <packages@gitlab.com>
W: https://packages.gitlab.com/runner/gitlab-runner/ubuntu/dists/jammy/InRelease の取得に失敗しました  以下の署名が無効です: EXPKEYSIG 3F01618A51312F3F GitLab B.V. (package repository signing key) <packages@gitlab.com>
W: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。
```

# 2. 対応方法

以下のように対応します。

# 2-1. apt-key または signed-by のどちらを使用しているかどうかを確認

Ubuntuのパッケージ認証方式は、apt-keyとsigned-byの2つの方式があります。
apt-keyが古い方式でsigned-byが新しい方式です。徐々にsigned-byに切り替わっている途中かと思います。

まず、どちらを使っているか以下のコマンドで確認します。

```
grep 'deb \[signed-by=' /etc/apt/sources.list.d/runner_gitlab-runner.list
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/d560747d-d6bb-7c53-cc3c-31a0ee9aa351.png)

# 2-2. signed-by形式の鍵を更新する

ルート権限で以下のコマンドを実行してください。

```bash
awk '/deb \[signed-by=/{
    pubkey = $2;
    sub(/\[signed-by=/, "", pubkey);
    sub(/\]$/, "", pubkey);
    print pubkey
  }' /etc/apt/sources.list.d/runner_gitlab-runner.list | \
  while read line; do
    curl -s "https://packages.gitlab.com/gpg.key" | gpg --dearmor > $line
  done
```

OKとかメッセージは出ませんが、以下のコマンドでファイルの更新日が新しくなっていたらOKです。

```
ls -la /usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg
```

# 3. 更新できたか確認

2-2.で何も返ってきていませんでしたが、更新できていればapt updateが成功するはずです。
実行してみます。

エラーなく実行終了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/bde24090-afb1-f915-ae4d-b69518599f80.png)

# 4. なぜ？GitLabの署名の鍵の更新方法でGitLab Runnerでは更新できなかったか。

1. aptの`/etc/apt/sources.list.d/`のファイル名が違う

GitLabの`sources.list.d`のファイルは以下ですが、
```
/etc/apt/sources.list.d/gitlab_gitlab-?e.list
```
GitLab Runnerのファイルは、以下です。

```
/etc/apt/sources.list.d/runner_gitlab-runner.list
```

ファイル名が違うので、2-2.で実行する時のコマンドが実行できていませんでした。


# 4. まとめ

特になし