> ## 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 GitHub

> Faites des deploys depuis GitHub avec client.apps.deploys : configurez un webhook, liez un dépôt via la GitHub App et consultez l'historique.

`client.apps.deploys` connecte une application à GitHub pour qu'un push la déploie. Il existe deux façons de procéder : un **webhook** que vous ajoutez au dépôt, ou la **GitHub App de Square Cloud**.

Les exemples utilisent le `client` présenté dans [Créer le client](/fr/sdks/py/client#créer-le-client). `app_id` est l'identifiant de l'une de vos applications : [`client.account.me()`](/fr/sdks/py/client#compte) les liste.

## Webhook

`deploys.set_webhook(app_id, access_token)` configure les deploys par webhook GitHub avec un jeton d'accès GitHub (`ghp_...` ou `github_pat_...`) et renvoie l'URL du webhook à ajouter à votre dépôt.

```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
```

Passez `"@"` comme jeton pour supprimer le webhook. La méthode renvoie alors `''`.

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

Un jeton invalide donne 400 `INVALID_ACCESS_TOKEN`.

## GitHub App

`deploys.link_github_app(app_id, repository, branch)` lie un dépôt installé via la GitHub App de Square Cloud. Elle nécessite le scope `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)` supprime la liaison. Pour lier un autre dépôt ou une autre branche, supprimez d'abord la liaison.

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

La liaison et sa suppression partagent une limite de **3 appels par 60 secondes**.

| Statut | Code | Quand |
| - | - | - |
| 400 | `GIT_ALREADY_CONFIGURED` | L'application a déjà un dépôt lié : supprimez d'abord la liaison |
| 400 | `GIT_NOT_CONFIGURED` | `unlink_github_app` sans rien de lié |
| 400 | `BRANCH_NOT_FOUND`, `INVALID_BRANCH_LENGTH` | La branche n'existe pas, ou son nom dépasse 256 caractères |
| 403 | `GITHUB_NOT_CONNECTED` | Votre compte n'a aucune installation de la GitHub App |
| 403 | `REPOSITORY_NOT_AVAILABLE` | La GitHub App n'est pas installée sur le dépôt via votre compte GitHub |
| 403 | `REPOSITORY_PERMISSION_REQUIRED` | Votre compte GitHub n'a pas d'accès en écriture au dépôt |
| 404 | `REPOSITORY_NOT_FOUND` | Le dépôt n'existe pas ou n'est pas visible |
| 409 | `REPOSITORY_BRANCH_ALREADY_CONFIGURED` | Une autre application, de n'importe quel compte, lie déjà ce dépôt et cette branche. Son identifiant figure dans `message` uniquement si cette application est la vôtre |
| 502 | `FAILED_TO_FETCH` | GitHub n'a pas confirmé la branche : vous pouvez réessayer sans risque |

## Configuration actuelle

`deploys.current(app_id)` renvoie ce qui est configuré : `app` pour la liaison à la GitHub App, `webhook` pour l'URL du webhook. Elle renvoie `{}` quand rien n'est défini.

```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"])
```

## Historique des deploys

`deploys.list(app_id)` renvoie une **chronologie par deploy**, chacune étant une liste d'événements, du plus ancien au plus récent. Seuls les deploys Git (pushes par webhook et par GitHub App) sont enregistrés.

```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"))
```

| Champ | Description |
| - | - |
| `id` | Le SHA du commit |
| `state` | `pending`, `clone`, `commit`, `restarting`, `success` ou `error` |
| `date` | Le moment où l'événement s'est produit |
| `source` | Toujours `"git"` |
| `branch` | Sur les événements `clone` |
| `files` | Sur les événements `commit` : `{ added, removed, modified }` |
| `code` / `message` | Sur les événements `error` : la raison de l'échec du deploy (par exemple `CLONE_FAILED`) |

## Prochaines étapes

<CardGroup cols={3}>
  <Card title="Réseau" icon="globe" href="/fr/sdks/py/network">
    Analytics, DNS, domaines personnalisés et cache.
  </Card>

  <Card title="Référence de l'API des deploys" icon="code" href="/fr/api-reference/endpoint/apps/deploy/list">
    Les endpoints REST derrière ces méthodes.
  </Card>

  <Card title="Deploys GitHub depuis la CLI" icon="terminal" href="/fr/cli-reference/github-deploys">
    Les mêmes actions depuis le terminal.
  </Card>
</CardGroup>
