Drone CI 搭配 MySQL 服務時,跑測試發現連不到 MySQL

通常在執行 CI/CD 步驟的時候,我們可能會想要在發布之前順帶執行測試。執行測試時我們可能會需要資料庫的服務做協助,例如使用 MySQL。

在 Drone 設定 MySQL 服務

以下是一個在 Drone CI yaml 檔案中設定 MySQL 服務的範例:

services:
  - name: mysql-server
    image: mysql
    environment:
      MYSQL_DATABASE: testing
      MYSQL_ALLOW_EMPTY_PASSWORD: yes

如果你在步驟中執行測試,那麼你可能會發現你無法連線到上面的 MySQL,原因可能有兩個:

第一個原因:主機位址錯誤

你不能使用 localhost 或是 127.0.0.1 來做連線,你需要使用 mysql-server 位址來做連線,這個位址取決於你的 MySQL Service name 取名為什麼。

第二個原因:MySQL 還沒準備好

在執行測試之前,要先確認 MySQL 已經完成準備,通常完成準備會需要一百二十秒。

因此我們會需要在執行測試的步驟前做檢查,以下是一個不斷檢查直到 MySQL 準備完成。

- name: mysql healthcheck
  image: mysql
  commands:
    - while ! mysqladmin ping -h mysql-server -u root --silent; do sleep 1; done
    - mysql -h mysql-server -u root -e "CREATE TABLE IF NOT EXISTS testing.pipelines (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL);"