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

# SDK Python: deploys pelo GitHub

> Faça deploy pelo GitHub com client.apps.deploys: configure um webhook, vincule um repositório pelo GitHub App da Square Cloud e leia o histórico de deploys.

`client.apps.deploys` conecta uma aplicação ao GitHub para que um push faça o deploy dela. Há duas formas de fazer isso: um **webhook** que você adiciona ao repositório, ou o **GitHub App da Square Cloud**.

Os exemplos usam o `client` de [Criando o cliente](/pt-br/sdks/py/client#criando-o-cliente). `app_id` é o id de uma das suas aplicações: [`client.account.me()`](/pt-br/sdks/py/client#conta) lista todas.

## Webhook

`deploys.set_webhook(app_id, access_token)` configura deploys via webhook do GitHub com um token de acesso do GitHub (`ghp_...` ou `github_pat_...`) e retorna a URL do webhook a ser adicionada ao seu repositório.

```python theme={"system"}
url = client.apps.deploys.set_webhook(app_id, os.environ["GITHUB_TOKEN"])

print(url)  # add it as a webhook in the repository settings
```

Passe `"@"` como token para remover o webhook. O método então retorna `''`.

```python theme={"system"}
client.apps.deploys.set_webhook(app_id, "@")
```

Um token inválido resulta em 400 `INVALID_ACCESS_TOKEN`.

## GitHub App

`deploys.link_github_app(app_id, repository, branch)` vincula um repositório instalado pelo GitHub App da Square Cloud. Requer o escopo `apps:deploy`.

```python theme={"system"}
repo = client.apps.deploys.link_github_app(app_id, "octocat/hello-world", "main")

print(repo["id"], repo["full_name"], repo["branch"])
```

`deploys.unlink_github_app(app_id)` remove o vínculo. Para vincular outro repositório ou branch, desvincule primeiro.

```python theme={"system"}
client.apps.deploys.unlink_github_app(app_id)
```

Vincular e desvincular compartilham um limite de **3 chamadas a cada 60 segundos**.

| Status | Código | Quando |
| - | - | - |
| 400 | `GIT_ALREADY_CONFIGURED` | A aplicação já tem um repositório vinculado: desvincule-o primeiro |
| 400 | `GIT_NOT_CONFIGURED` | `unlink_github_app` sem nada vinculado |
| 400 | `BRANCH_NOT_FOUND`, `INVALID_BRANCH_LENGTH` | A branch não existe, ou seu nome tem mais de 256 caracteres |
| 403 | `GITHUB_NOT_CONNECTED` | Sua conta não tem uma instalação do GitHub App |
| 403 | `REPOSITORY_NOT_AVAILABLE` | O GitHub App não está instalado no repositório por meio da sua conta do GitHub |
| 403 | `REPOSITORY_PERMISSION_REQUIRED` | Sua conta do GitHub não tem acesso de escrita ao repositório |
| 404 | `REPOSITORY_NOT_FOUND` | O repositório não existe ou não está visível |
| 409 | `REPOSITORY_BRANCH_ALREADY_CONFIGURED` | Outra aplicação, de qualquer conta, já vincula este repositório e branch. O id dela aparece em `message` apenas quando essa aplicação é sua |
| 502 | `FAILED_TO_FETCH` | O GitHub não confirmou a branch: é seguro tentar novamente |

## Configuração atual

`deploys.current(app_id)` retorna o que está configurado: `app` para o vínculo do GitHub App, `webhook` para a URL do webhook. Retorna `{}` quando nada está configurado.

```python theme={"system"}
current = client.apps.deploys.current(app_id)

if "app" in current:
    print(current["app"]["name"], current["app"]["branch"])  # e.g. "octocat/hello-world" "main"
if "webhook" in current:
    print(current["webhook"])
```

## Histórico de deploys

`deploys.list(app_id)` retorna uma **linha do tempo por deploy**, cada uma uma lista de eventos, do evento mais antigo para o mais recente. Apenas deploys via Git (pushes por webhook e GitHub App) são registrados.

```python theme={"system"}
for timeline in client.apps.deploys.list(app_id):
    last = timeline[-1] if timeline else None
    if last is None:
        continue
    print(last["id"], last["state"], last["date"])

    if last["state"] == "error":
        print(last.get("code"), last.get("message"))
```

| Campo | Descrição |
| - | - |
| `id` | O SHA do commit |
| `state` | `pending`, `clone`, `commit`, `restarting`, `success` ou `error` |
| `date` | Quando o evento aconteceu |
| `source` | Sempre `"git"` |
| `branch` | Em eventos `clone` |
| `files` | Em eventos `commit`: `{ added, removed, modified }` |
| `code` / `message` | Em eventos `error`: por que o deploy falhou (por exemplo, `CLONE_FAILED`) |

## Próximos passos

<CardGroup cols={3}>
  <Card title="Rede" icon="globe" href="/pt-br/sdks/py/network">
    Analytics, DNS, domínios personalizados e cache.
  </Card>

  <Card title="Referência da API de deploy" icon="code" href="/pt-br/api-reference/endpoint/apps/deploy/list">
    Os endpoints REST por trás destes métodos.
  </Card>

  <Card title="Deploys do GitHub pela CLI" icon="terminal" href="/pt-br/cli-reference/github-deploys">
    As mesmas ações pelo terminal.
  </Card>
</CardGroup>
