ユアマイスター株式会社エンジニアブログ

ユアマイスター株式会社のエンジニアが日々徒然。

Circle CI で mysql-client が apt-get install できなくなってCI環境が壊れた話

f:id:yourmystar_engineer:20190715123832p:plain

どうも。ユアマイスター星(@inase17000)です。

ある日突然Circle CIのビルドが通らなくなり、つらい思いをしたのでシェアしておこうと思います。 暫定ではありますが解決済みですので、万が一同じことで困ってる人がいたら途中は読み飛ばしてください。

背景

ユアマイスターでは Circle CI を使って、mysqlのコンテナを立ち上げ、CakePHP/PHPUnitでテストを動かしています。

その際、テスト用データベースの作成のために、mysqlコマンドを使う必要があるのですが、Circle CIのデフォルトのイメージにはインストールされていないので、自前で入れる必要があります。

.circleci/config.yml にはこんな感じで追記していました。

      - run:
          name: setup database
          command: |
              sudo -E docker-php-ext-install pdo_mysql
              sudo apt-get install mysql-client

参考:https://circleci.com/docs/2.0/postgres-config/#example-mysql-project

特にバージョン指定することもなく、元気に動いていたのですが...

ある日突然

Circle CIのビルド結果をSlack通知しています。普段はSuccessしかみない通知に、突如Failedが現れました。

f:id:yourmystar_engineer:20190715124617p:plain

特定のブランチではなく複数ブランチで起きていることを確認すると、単なるプログラムミスじゃないなということで調査に乗り出しました。

E: Package 'mysql-client' has no installation candidate
Exited with code 100

こんなエラーコードを吐いていますが、いろいろググってもあんまり出てきません。 いろいろ試行錯誤をしてみます。

  • sudo apt update をしてパッケージを最新化してみる

が、結果は同じ。

  • Circle CIはSSHでコンテナに入っていろいろ試せる機能があるので、実際の環境に入ってinstallも叩いてみる
circleci@774ffee1a5e8:~$ sudo apt-get install mysql-client
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package mysql-client is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package 'mysql-client' has no installation candidate

が、結果は同じ。

原因

Debianの最新版のパッケージ情報を確認しにいくと、 mysql-client というのがなくなっている!!!

参考:https://packages.debian.org/stable/database/

そのかわり、 default-mysql-client っていうのがいるので中身を見てみる。

default-mysql-client (1.0.5)
MySQL database client binaries (metapackage)

中身を見ると、実際は中身すっかすかで、 mariadb-client-10.3 に依存がはられている状況。

つまり、 mysql-client はなくなり、 mariadb-client に統合されたことで、インストールができなくなった模様。

解決策

.circleci/config.yml を下記のように書き換えてCircle CIのビルド再実行で事なきを得ました。

      - run:
          name: setup database
          command: |
              sudo -E docker-php-ext-install pdo_mysql
              sudo apt update
              sudo apt-get install default-mysql-client

※ちなみに、 default-mysql-client としているところを、直接 mariadb-client-10.3 指定しても(当たり前ですが)インストールできること確認済みです。

あとから Twitter を見に行ってみると、同じような解決策に至った方がいらっしゃって、先にちゃんと読めばよかったと後悔しました...

mysql-client - Twitter Search

Oracleオープンソースプロジェクトの喧嘩にこんな形で巻き込まれるって面白い経験になりましたw

ということで、ググったら出てくるようにブログに残しておきます。さらばだ!