koudenpaのブログ

趣味のブログです。株式会社はてなでWebアプリケーションエンジニアをやっています。職業柄IT関連の記事が多いと思います。

Bitbucket から GitHub への移行事例

WebアプリケーションのリポジトリBitbucketからGitHubへ移行したので事例としてメモしておく。

動機

Bitbucketの機能面には特に不満や不足はなかったのだけれど、特定の時間帯(多分アメリカのビジネス時間)の応答が非常に遅くてストレスフルでにっちもさっちもいかなかった。これを回避するならまぁGitHub使っとけと言う感じで移行した。

構成

移行対象はPHPのWebアプリケーションで、Bitbucket固有の機能はデプロイをPipelinesで行っていた程度。なのでそれをGitHub Actions移行するだけ。

やっていることは以下程度。

  • CI環境からいくつかのVPSサーバにSSH接続
  • SSHした各サーバから git pull して最新のアプリケーションコードを取得

具体的には↓これ。

koudenpa.hatenablog.com

移行の流れ

事前準備

  • GitのリモートにGitHubも追加して人力で同期しておく
  • GitHub Actions からのデプロイを検証しておく
  • 検証したGitHub ActionsでのデプロイのPRを作っておく

大体こんな感じのワークフローになった。Bitbucket Pipelinesと大差ない

name: Deploy Staging

on:
  push:
    branches: [ staging ]
    paths:
      - .github/workflows/deploy-staging.yml
      - front/**
      - admin/**

jobs:
  deploy:
    runs-on: ubuntu-latest
    timeout-minutes: 10

    steps:
    - uses: actions/checkout@v2

    # https://www.webfactory.de/blog/use-ssh-key-for-private-repositories-in-github-actions
    # https://github.com/webfactory/ssh-agent
    - uses: webfactory/ssh-agent@v0.5.3
      with:
          ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

    - run: cat .github/workflows/deploy/known_hosts >> ~/.ssh/known_hosts

    - run: chmod +x deployer.phar
    - name: Deploy admin
      run: ./deployer.phar -f=./admin/deployer/deploy.php deploy staging -v
    - name: Deploy front
      run: ./deployer.phar -f=./front/deployer/deploy.php deploy staging -v

移行

  1. 関係各位に移行するのでBitbucketを触らないように周知する
  2. bitbucket-pipelines.yml を削除してBitbucketからのデプロイを止める
  3. GitHubリポジトリを同期する
  4. 検証済のGitHub ActionsでのデプロイのPRをマージする
  5. デプロイの疎通を確認する

ざっくりこんな感じで処理した。

各自の作業環境の切り替えは「Gitに自信がなかったらこれまでと別のディレクトリにCloneしなおして」と案内した。なにしろ自分もそうしている。複数のリモートを切り替えてGitを使えるほど器用ではない。器用な人はそんなにいないと思う。

留意点

移行というよりはサーバにSSHして、サーバから git pull するデプロイをGitHub Actionsで構成する場合の留意点になる。

大体認証系の設定。他は既に動いているデプロイ構成がそのまま動いた(もちろんデプロイ元リポジトリの設定は変える)。

Actions -> サーバ

  • 適当にSSH鍵を作ってGitHubリポジトリシークレットに登録( secrets.SSH_PRIVATE_KEY
  • 各サーバの authorized_keys に登録
  • known_hostsリポジトリにコミットして実行時に設定

サーバ -> Actions

  • 各サーバのSSH鍵をGitHubリポジトリのDeploy keysに登録
    • リポジトリのSettingsのSecurityにDeploy keys項目がある
    • 自分ユーザーのSSH鍵に登録、のようなことは避けられたい
  • known_hosts は手で設定して回った

感想

移行自体は認証情報をしっかり処理すればスムーズだった。 (サーバは大事なペットとして1台ずつ管理しているので漏れがあって慌てて処理した。VPSの管理は大変なのでもうやりたくない)

周辺事情については色々思うところがあった。

GitリポジトリサービスはGitHub寡占になっていると思う。

GitHub以外のリポジトリを使うことは運用面で大きなハンデを抱えた状態になる。些細な例ではあるけれど、最近出てきたAWSのApp Runnerでも連携できるリポジトリはGitHubのみBitbucketはサポートされていない。そもそもAWS謹製のCodeCommitを差し置いてのGitHubサポートだ。

二番手以降も頑張っていい感じに競争してほしいし、BitbucketはブランチのSyncをWeb上からできたり、Pipelinesにちょこちょこ面白いものがあったり、機能面では使い出があると思う。それが「動作が重い」とどうしようもない理由で移行せざるを得なかったのはとても残念に思う。