Publicando uma api REST Go no Heroku.
Tags: go, heroku, docker, cloud
Published: 2022-03-25 21:00:41

Com nossa api pronta, testada e com a documentação em dia, chegou a hora de botar isso rodar em cloud né? Para isso vamos usar uma ferramente sensacional da SalesForce chamada Heroku.
Heroku é uma plataforma de nuvem como serviço que suporta várias linguagens de programação.

## Configurando nossa API
Primeiro passo é nós configurar o arquivo docker para rodar no container do heroku. Vamos lá!
Na raiz do projeto crie um arquivo chamado Dockerfile. No arquivo vamos configurar um multstage build para deixar nossa imagem com somente os recursos necessários para rodar a aplicação.

```Dockerfile
FROM golang:latest AS builder
ADD . /go/api
WORKDIR /go/api

RUN go install github.com/swaggo/swag/cmd/swag@latest
RUN rm -rf deploy
RUN mkdir deploy
RUN swag init -d adapter/http --parseDependency --parseInternal --parseDepth 2 -o adapter/http/docs
RUN go mod tidy
RUN CGO_ENABLED=0 go build -o goapp adapter/http/main.go
RUN mv goapp ./deploy/goapp
RUN mv adapter/http/docs ./deploy/docs
RUN mv config.json ./deploy/config.json
RUN mv database ./deploy/database


FROM scratch AS production
COPY --from=builder /go/api/deploy /api/

WORKDIR /api
ENTRYPOINT  ./goapp
```
Com o Dockerfile pronto vamos configurar nosso deploy no github actions no arquivo `.github/workflows/deploy.yaml`.

```yaml
name: Deploy to heroku app

on:
  create:
    tags:
      - v*

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Config file access
        run: |
          rm -rf config.json
          touch config.json 
          json='{"database": {"url": "://$DB_USER:$DB_PASS@$DB_HOST:$DB_PORT/$DB_NAME"},"server": {"port": ""}}'
          echo "$json" > config.json
          sed -i -e 's/$DB_PORT/'${{ secrets.DB_PORT }}'/g' config.json
          sed -i -e 's/$DB_USER/'${{ secrets.DB_USER }}'/g' config.json
          sed -i -e 's/$DB_PASS/'${{ secrets.DB_PASS }}'/g' config.json
          sed -i -e 's/$DB_NAME/'${{ secrets.DB_NAME }}'/g' config.json
          sed -i -e 's/$DB_HOST/'${{ secrets.DB_HOST }}'/g' config.json
          cat config.json

      - uses: akhileshns/heroku-deploy@v3.10.9
        with:
          heroku_api_key: ${{secrets.HEROKU_API_KEY}}
          heroku_app_name: "clean-go"
          heroku_email: ${{secrets.HEROKU_MAIL}}
          usedocker: true
```
Esse arquivo `deploy.yaml` precisa de algumas variaveis de ambiente para funcionar corretamente. 
- **secrets.HEROKU_MAIL:** Seu e-mail da conta heroku
- **secrets.HEROKU_API_KEY**: Va nas configurações da sua conta

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yiz7l9iz48uiexarxsyr.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/94cz3g04i03uxd1x6svd.png)
- **secrets.DB_PORT, secrets.DB_USER, secrets.DB_PASS, secrets.DB_NAME, secrets.DB_HOST:** Adicione um addon com o postgres.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0hzoliwyhi2nzljgn0on.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ddfgemnyazfjhc7pzr3s.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qllwf5p9z8cu8tcz3iq4.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5wpkh6bq8gmo2q9jmqxa.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ze9ljpfo197tu3vcfogb.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iaorr9h0zdkbg31l886y.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ztwrargoqh80zvut6ybt.png)

Copie as credencias do banco de dados e adicione nos secrets do github:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w3gxiiec8o6nihponnim.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j7ygr03ekpqy7kaubv5k.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qdrne1pt762dzqg6x97d.png)

Crie uma release com uma tag com prefixo `v`:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5k5x4fj3fr51nl9gf3b1.png)

E pronto! Seu action esta rodando para o deploy no heroku:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v7vzaw43bpq8t3diabg0.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v00qhe5d8k6fifby8kqs.png)

Quando ele ficar verdinho. Verifique o endpoint do app no heroku que vai estar rodando lisinho! :D

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/57ycyibze8qdr6j3vgf6.png)

## Sua vez
Vai na fé! Acredito totalmente em você, independente do seu nível de conhecimento técnico, você vai criar a melhor api em GO.
Se você se deparar com problemas que não consegue resolver, sinta-se à vontade para entrar em contato. Vamos resolver isso juntos.

## Como eu rodo os testes no Github Actions?
Próximo post vamos configurar e rodar os testes no actions integrando com a ferramenta do [CodeCov](https://about.codecov.io/).