M1 MacからHerokuにデプロイするには（１）

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

https://medium.com/geekculture/deploy-to-heroku-from-a-macbook-m1-heroku-cli-or-githubactions-868bc3a50935

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


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

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

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

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

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

#### 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が２つ入っていることになりますが、`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](https://github.com/features/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_KEY`と`HEROKU_APP_NAME`が必要になりますが、大丈夫。いずれもGitHubリポジトリ（`Settings->Secrets->New repository secret`）に格納され、ソースコードには表れない感じです。


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