最近、個人で作成したアプリをHerokuへデプロイした時のメモです。
とりあえず手動デプロイの手順もメモする。
温かみのある手動デプロイ
基本的には以下の手順に書かれた通り。
ハマるポイントしては ビルドコンテキストが常に Dockerfile が格納されているディレクトリに設定され、個別に構成できないこと。 今回のheroku.ymlは以下のようになった。
build: docker: web: Dockerfile run: web: /web-service-gin
git add heroku.yml git commit -m "Add heroku.yml" heroku stack:set container git push heroku main
git push heroku main
をしたらDockerのbuildが始まる。
GitHub Actionsを使ってHerokuへデプロイ
Deploy to Heroku
というActionを使った。
基本的にはREADMEに書いてある通り。test
というjobの後に起動させたいので needs: test
という記述を追加した。
走らせるとこんな感じ
deploy: name: deploy needs: test runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: deploy uses: akhileshns/heroku-deploy@v3.12.12 with: heroku_api_key: ${{secrets.HEROKU_API_KEY}} heroku_app_name: ${{secrets.APP_NAME}} heroku_email: ${{secrets.HEROKU_EMAIL}} usedocker: true
heroku logs -t
でデプロイできていることが確認できる。
ファイル全体は以前書いたCIの設定も含めると以下のようになる。
name: Gin API on: push: branches: - main jobs: test: name: test runs-on: ubuntu-latest services: gin_service_db: image: mysql:8.0 ports: - 3306:3306 env: MYSQL_USER: ginuser MYSQL_PASSWORD: password MYSQL_DATABASE: gin-service MYSQL_ROOT_PASSWORD: password MYSQL_HOST: gin_service_db steps: - uses: actions/checkout@v2 - name: Set up Go uses: actions/setup-go@v2 with: go-version: 1.17.7 - name: Install golang-migrate CLI run: | curl -L https://packagecloud.io/golang-migrate/migrate/gpgkey | sudo apt-key add - echo "deb https://packagecloud.io/golang-migrate/migrate/ubuntu/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/migrate.list sudo apt-get update sudo apt-get install -y migrate - name: Run Migration run: migrate -database="mysql://ginuser:password@tcp(localhost:3306)/gin-service" -path "./db/migrations" --verbose up - name: Build run: go build -v ./... - name: Test run: TEST_CLIENT=CI bash -c 'go test ./... -v' deploy: name: deploy needs: test runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: deploy uses: akhileshns/heroku-deploy@v3.12.12 with: heroku_api_key: ${{secrets.HEROKU_API_KEY}} heroku_app_name: ${{secrets.APP_NAME}} heroku_email: ${{secrets.HEROKU_EMAIL}} usedocker: true