M1 MacからHerokuにデプロイするには(1)


はじめに

この記事の和訳です。エッセイ風味の部分や背景説明は省いて、手順だけを抜粋しました。

※ 動作確認はしていません

結論:Rosettaを噛ませる

2021年3月現在、M1 MacからHerokuにデプロイするにはRosettaを使うしかないようです。以下その手順です。

1. 「ターミナル」アプリを複製

ファインダー>アプリケーション>ユーティリティに「ターミナル」アプリを複製して、適当な名前をつけます(「ターミナル with Rosetta」とか)。

右クリック→「情報を見る」→「Rosettaで開く」にチェックします。

これでARM用とIntel用、計2つのターミナルができた感じです。

2. Rosettaをインストール

さっき複製した「ターミナル with Rosetta」の初回使用時にRosettaインストールが促されます(ここでインストールするのが楽)。

手動で入れたい時は下記です。

/usr/sbin/softwareupdate --install-rosetta

3. brewを(再)インストール

Homebrewが事前にインストールしてあれば、M1対応のはず。下記で確認できます。

% which brew
/opt/homebrew/bin/brew

複製したほうの「ターミナル with Rosetta」を開いていることを確認して、Homebrewを再インストールします。

/bin/bash -c "$(curl -fsSL 
https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

==> Checking for `sudo` access (which may request your password).Password:
==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
/usr/local/share/man/man1/brew.1
/usr/local/share/zsh/site-functions/_brew
/usr/local/etc/bash_completion.d/brew
/usr/local/Homebrew
....

これで/usr/local/binにインストールされているはずです。

Homebrewが2つ入っていることになりますが、brewで先に呼び出された方だけが走る感じなので大丈夫。紛らわしくないようにaliasしておくと良さげです。

alias rbrew='/usr/local/bin/brew'

# Rosetta brew
% which rbrew
rbrew: aliased to /usr/local/bin/brew

# Native brew
% which brew
/opt/homebrew/bin/brew

4. Herokuをインストール

複製したほうの「ターミナル with Rosetta」を開いていることを確認して、Herokuインストールです。

rbrew tap heroku/brew && rbrew install heroku

これでHerokuが使えるはず。ログインします。

% heroku --version
% heroku login
% heroku apps

以上です!

補足:Dockerを使う場合

Dockerを使う場合、HerokuのコマンドラインでもOKですが、GitHubのCIツール(GitHub Actions)でさらにいい感じになります。下記の要領です。

1. GitHubに新規Workflowを作成

Git repositoryのActionsタブで新規Workflowを作成します。

下記はJDK11とMavenを使ったJavaのアプリケーションの例ですが、他言語でも同じような感じになります。

name: Build & Push to Heroku Docker Registry
on:
  push:
    branches: [ main ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    # checkout source
    - name: Git Checkout
      uses: actions/checkout@v1
    # config JDK
    - name: Set up JDK 11
      uses: actions/setup-java@v1
      with:
        java-version: 11
    # Build the Jar
    - name: Build with Maven
      run: mvn -B package --file pom.xml
    # Login in Heroku
    - name: Heroku Container Registry login
      env: 
        HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }}
      run: heroku container:login 
    # Build and push Docker image
    - name: Build and push
      env:
        HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }}
      run: heroku container:push -a ${{ secrets.HEROKU_APP_NAME }} web 
    # Release 
    - name: Release
      env:
        HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }}
      run: heroku container:release -a ${{ secrets.HEROKU_APP_NAME }} web

上記のパイプラインが、main branchでgit pushするたびに走ります。手動なら下記です。

on:
  push:
    branches: [ main ]

2. 補足の補足:APIキーとアプリ名について

上記パイプラインにはHEROKU_API_KEYHEROKU_APP_NAMEが必要になりますが、大丈夫。いずれもGitHubリポジトリ(Settings->Secrets->New repository secret)に格納され、ソースコードには表れない感じです。

おわりに

初心者なので記事内容の良し悪しがわかりませんが、訳してみました。