> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cubehosting.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# GitHub Actions

> Deploy a cada push na main: o workflow pronto que instala a CLI cube e envia o repositório para o seu projeto.

Com este workflow, cada push na `main` envia o código para o projeto na Cube e espera a instalação. Se a instalação falhar ou o app cair nos primeiros 15 segundos depois de subir, o passo falha e o GitHub avisa.

<Tip>
  Não precisa de build no CI nem de subpasta? O [deploy pelo GitHub](/github) faz o mesmo sem workflow nem chave de API: é conectar o GitHub em Integrações e escolher o repositório.
</Tip>

## 1. Guarde a chave e o ID

No painel, crie uma chave de **leitura e escrita** em [Chaves de API](https://app.cubehosting.com.br/api-keys) e copie o ID do projeto (fica no topo da página do projeto, ou em `cube projects`).

No repositório do GitHub, em **Settings › Secrets and variables › Actions**:

| Onde              | Nome              | Valor            |
| ----------------- | ----------------- | ---------------- |
| Aba **Secrets**   | `CUBE_API_KEY`    | a chave `cube_…` |
| Aba **Variables** | `CUBE_PROJECT_ID` | o ID do projeto  |

<Warning>
  A chave vai só nos segredos. Nunca escreva a chave no workflow nem em outro arquivo do repositório: quem lê o repositório poderia enviar código e mexer nas variáveis do seu projeto. Se ela vazar, revogue em Chaves de API e crie outra.
</Warning>

## 2. Crie o workflow

```yaml .github/workflows/deploy.yml theme={"dark"}
name: Deploy na Cube
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - uses: actions/setup-node@v5
        with:
          node-version: 22
      - run: npm i -g https://cubehosting.com.br/cli/latest.tgz
      - run: cube deploy --project "$CUBE_PROJECT_ID"
        env:
          CUBE_API_KEY: ${{ secrets.CUBE_API_KEY }}
          CUBE_PROJECT_ID: ${{ vars.CUBE_PROJECT_ID }}
```

Faça o commit e o push: a execução aparece na aba **Actions** do repositório, com a saída da instalação.

## O que é enviado

O `cube deploy` envia a raiz do repositório, respeitando o `.gitignore` e o `.cubeignore`, dentro do [limite do .zip](/hosting/zip-limits) do seu plano. As dependências são instaladas na Cube, então `node_modules` e `venv` nunca vão. Detalhes em [CLI cube](/cli#enviar-com-cube-deploy).

* **Projeto numa subpasta:** `cube deploy ./bot --project "$CUBE_PROJECT_ID"`. O `.gitignore` da raiz do repositório também vale para a subpasta.
* **Build no CI:** rode o build antes do `cube deploy` e traga a pasta gerada de volta no `.cubeignore` (`!dist/`) se o `.gitignore` a deixa de fora. Sem isso, a Cube roda o build do `cube.json` na instalação.
* **Não esperar a instalação:** acrescente `--no-wait`.
* **Travar a versão da CLI:** troque `latest.tgz` pelo número, como `cube-cli-0.1.2.tgz`.

## Sem a CLI

O mesmo envio com `curl` está em [Enviar novo código](/api-reference/projects/upload-code#deploy-a-cada-push-github-actions). Ele não espera a instalação nem respeita o `.gitignore`.
