GitHub管理のリポジトリをCircleci2.0 + Herokuと連携しgit tagをトリガーにしてデプロイする

## はじめに
git管理のリポジトリのリリース時に`git tag`でタグを付ける事があると思います。
そんな`git tag`ですがCircleCiと連携させるとタグ付けに反応してそのままデプロイさせることが出来ます。
ただ[CircleCi公式ドキュメントの手順](https://circleci.com/docs/2.0/deployment-integrations/#heroku)とgithubリポジトリの場合は少し手順が違ったのでその手順を残したいと思います。

## 注意点
今回の想定はGitHubにあるリポジトリをデプロイすることを想定しています。
GitHub以外のリポジトリをtagデプロイしたい場合は公式の手順をご覧ください。

 - https://circleci.com/docs/2.0/deployment-integrations/#heroku

## 前提条件
 - GitHubにあるリポジトリがCircleCiとherokuに連携している状態
 - CircleCiは2.0を対象としています


また今回デプロイ先はHerokuとします。

## CircleCiの設定
 - CircleCi画面のBUILD SETTINGS → Environment Variables画面で環境変数`HEROKU_API_KEY`と`HEROKU_LOGIN`を以下のように設定します
    - `HEROKU_API_KEY` → Herokuのアカウント設定画面から取得できるAPI KEYを値に設定
    - `HEROKU_LOGIN` → Herokuにログインする際に使用するメールアドレス

GitHubとHerokuとCircleCiが連携していればこれだけで準備は完了です。


## circleci.ymlにtagデプロイ用の記載を追加
いよいよcircleci.ymlにtagをトリガーにする処理を書いていきます
以下でやっている事としては`jobs`にデプロイに必要な処理や設定を記載し`workflows`に`jobs`を実行するタイミングを記載しています

今回は本番環境デプロイ用job(`deploy_to_heroku`)は`v_1.0.0`のようなtagをpushした時のみ反応させ、stg環境デプロイ用job(`deploy_to_heroku_stg`)は`stg_v_1.0.0`のようなtagをpushした時とmasterにマージした時に反応させるようにしました
またどちらのjobも実行前に`test`jobを実行させるようにしています。


```yaml
# .circleci/circleci.yml

defaults: &defaults
  working_directory: ~/your_repository
  environment:
    TZ: "/usr/share/zoneinfo/Asia/Tokyo"

deploy: &deploy
  <<: *defaults
  machine:
      enabled: true
  steps:
    - checkout
    - run:
        name: Setup Heroku
        command: bash .circleci/setup-heroku.sh # 後述
    - run:
        command: |
          git push https://heroku:$HEROKU_API_KEY@git.heroku.com/$HEROKU_APP_NAME.git HEAD:refs/heads/master
          # 他デプロイに必要なタスクがあれば記載
          sleep 5  # sleep for 5 seconds to wait for dynos
          heroku restart --app $HEROKU_APP_NAME

version: 2
jobs:
  test:
    <<: *defaults
    docker:
      # 省略 ここにはテスト実行用の処理・設定を記載

  deploy_to_heroku:
    <<: *deploy
    environment:
      HEROKU_APP_NAME: "your-app" #　本番のapp_nameを設定

  deploy_to_heroku_stg:
    <<: *deploy
    environment:
      HEROKU_APP_NAME: "your-app-stg" #stg環境ののapp_nameを設定

workflows:
  version: 2
  build:
    jobs:
      - test:
          filters:
            branches:
              only: /.*/
            tags:
              only: /.*/
      - deploy_to_heroku:
          requires:
            - test
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /^v_[0-9](\.[0-9]){2}$/
      - deploy_to_heroku_stg:
          requires:
            - test
          filters:
            branches:
              only: master
            tags:
              only: /^stg_v_[0-9](\.[0-9]){2}$/

```

 - herokuでデプロイする際は別途shファイルが必要とのこと
 - .circleci/setup-heroku.shに以下を記載

```sh
 #!/bin/bash
 wget https://cli-assets.heroku.com/branches/stable/heroku-linux-amd64.tar.gz
 sudo mkdir -p /usr/local/lib /usr/local/bin
 sudo tar -xvzf heroku-linux-amd64.tar.gz -C /usr/local/lib
 sudo ln -s /usr/local/lib/heroku/bin/heroku /usr/local/bin/heroku

 cat > ~/.netrc << EOF
 machine api.heroku.com
   login $HEROKU_LOGIN
   password $HEROKU_API_KEY
 EOF

 cat >> ~/.ssh/config << EOF
 VerifyHostKeyDNS yes
 StrictHostKeyChecking no
 EOF
```

これで設定は完了です！
あとは`git tag v_1.0.0`でタグを付けて`git push origin v_1.0.0`でtagをpushしたらデプロイが自動で始まります。

## 参考
https://circleci.com/docs/2.0/deployment-integrations/
https://christina04.hatenablog.com/entry/circleci-workflow