> For the complete documentation index, see [llms.txt](https://docs.devolutions.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devolutions.net/cli/es/para-devops-y-administradores/automate/ci-sign-in.md).

# Iniciar sesión desde una canalización de CI

Iniciar sesión en Devolutions Cloud o Devolutions Server desde una canalización de CI con Devolutions CLI, mediante una clave leída desde una variable de entorno o un archivo.

Una canalización no puede abrir un navegador ni escribir una contraseña. Devolutions CLI inicia sesión con una clave en su lugar, y lee la parte secreta de esa clave desde una variable de entorno o un archivo que protege su sistema de CI. El secreto no se escribe nunca en la línea de comandos.

## Elegir el método de inicio de sesión adecuado

<table><thead><tr><th width="230">ESPACIO DE TRABAJO</th><th>MÉTODO</th><th>OPCIONES</th></tr></thead><tbody><tr><td><strong>Devolutions Cloud</strong></td><td>Clave de aplicación y secreto de aplicación</td><td><code>--application-key</code> con <code>--application-secret-env</code> o <code>--application-secret-file</code></td></tr><tr><td><strong>Devolutions Server</strong></td><td>Clave de API</td><td><code>--api-key-env</code> or <code>--api-key-file</code></td></tr><tr><td><strong>Devolutions Server</strong></td><td>Usuario de aplicación</td><td><code>--as-application</code> con <code>--username</code> y <code>--password-env</code> o <code>--password-file</code></td></tr></tbody></table>

Cree primero la clave de aplicación, la clave de API o el usuario de aplicación en su espacio de trabajo, y déle acceso solo a las bóvedas que necesita la canalización. Después, guarde su secreto en las variables protegidas o los archivos de secretos de su sistema de CI.

{% hint style="warning" %}
No pase nunca un secreto como argumento. Opciones como `--application-secret-env`, `--api-key-env` y `--password-env` toman el **nombre** de una variable de entorno, no su valor. `devo login` no tiene ninguna opción que acepte el secreto mismo.
{% endhint %}

## Iniciar sesión

{% tabs %}
{% tab title="Devolutions Cloud" %}

```bash
devo login ci-cloud --cloud https://<your-organization>.devolutions.app \
  --application-key <application-key> \
  --application-secret-env DEVO_APP_SECRET
```

`DEVO_APP_SECRET` es el nombre de la variable que contiene el secreto de aplicación. Para leerlo desde un archivo, use `--application-secret-file <path>`.
{% endtab %}

{% tab title="Devolutions Server (API key)" %}

```bash
devo login ci-server --server https://<your-server-address> \
  --api-key-env DEVO_API_KEY
```

Para leer la clave de API desde un archivo en su lugar, use `--api-key-file <path>`.
{% endtab %}

{% tab title="Devolutions Server (application user)" %}

```bash
devo login ci-server --server https://<your-server-address> \
  --as-application --username <application-user> \
  --password-env DEVO_APP_PASSWORD
```

Para leer el secreto desde un archivo en su lugar, use `--password-file <path>`.
{% endtab %}
{% endtabs %}

El contexto en el que inicia sesión pasa a ser el actual, así que los comandos siguientes lo usan. Añada `--json` para obtener un resultado que un script pueda comprobar. Consulte [Leer los resultados como JSON](/cli/es/para-devops-y-administradores/automate/json-output.md).

## Mantener el secreto disponible durante todo el trabajo

Devolutions CLI no copia el secreto en su configuración. Guarda **dónde** está el secreto, el nombre de la variable o la ruta del archivo, y lo vuelve a leer cada vez que se conecta a su espacio de trabajo, incluso desde su proceso en segundo plano. Así que:

* Establezca la variable, o cree el archivo, **antes** del primer comando `devo` del trabajo.
* Déjela definida, o deje el archivo en su sitio, hasta el último comando `devo`.
* Si rota un secreto guardado en un archivo, sustituya el contenido del archivo: la siguiente conexión lee el nuevo valor, sin un nuevo inicio de sesión.

Si más adelante falta la variable o el archivo, los comandos fallan con `secretReferenceUnavailable`.

## Ejemplo: un trabajo de CI genérico

Este trabajo inicia sesión en Devolutions Cloud, ejecuta un script de implementación con una contraseña de base de datos de la bóveda y limpia. Adapte los nombres de las variables a su sistema de CI: la mayoría expone las variables protegidas como variables de entorno.

```bash
#!/usr/bin/env bash
set -euo pipefail

# Keep this job's contexts separate from other jobs on the same runner.
export DEVO_CLI_CONFIG_HOME="$(mktemp -d)"
# Fail instead of waiting for an answer.
export DEVO_NON_INTERACTIVE=1

# DEVO_APP_SECRET is provided by the CI system as a protected variable.
devo login ci-cloud --cloud "https://<your-organization>.devolutions.app" \
  --application-key "<application-key>" \
  --application-secret-env DEVO_APP_SECRET \
  --json > /dev/null

devo secret run \
  --env-ref DB_PASSWORD="<reference>" \
  --timeout-seconds 900 \
  -- ./deploy.sh

devo logout ci-cloud --json > /dev/null
devo daemon stop --wait
rm -rf "$DEVO_CLI_CONFIG_HOME"
```

Para ejecutar la limpieza incluso cuando un paso falla, ponga los tres últimos comandos en el paso «always run» de su sistema de CI o en un `trap` de shell. Hay más sobre la carpeta de configuración y el proceso en segundo plano en [Instalar Devolutions CLI en los agentes de compilación](/cli/es/para-devops-y-administradores/automate/install-on-runners.md).

## Iniciar sesión en un ordenador sin navegador

En un servidor o una sesión remota en la que *usted* está presente pero no puede abrirse ningún navegador, use el flujo de código de dispositivo con `--oauth --use-device-code`. Devolutions CLI imprime una dirección web y un código; abra la dirección en cualquier dispositivo e inicie sesión. Definir la variable de entorno `DEVO_CLI_USE_DEVICE_CODE` en `1` tiene el mismo efecto que `--use-device-code`. En ambos casos, solo se aplica a un inicio de sesión con `--oauth`.

```bash
devo login my-server --server https://<your-server-address> --oauth --use-device-code
```

Este flujo necesita que una persona lo complete, así que no encaja en una canalización desatendida.

{% hint style="warning" %}
En Devolutions Cloud, un inicio de sesión con código de dispositivo no puede leer sus datos: solo permite `devo status` y `devo logout`. Para los comandos de datos en Devolutions Cloud, inicie sesión con el navegador (`--oauth` sin `--use-device-code`) o con una clave de aplicación.
{% endhint %}

## Si no funciona

* El error dice que la variable o el archivo no se encuentra: compruebe el nombre que pasó (el **nombre** de la variable, sin `$`), y que el sistema de CI lo exponga a este paso.
* El inicio de sesión falla o la sesión caduca: consulte [El inicio de sesión falla o la sesión ha caducado](/cli/es/ayuda/troubleshooting/sign-in-fails.md).
* Todos los métodos y opciones de inicio de sesión: [Iniciar sesión en Devolutions Cloud](/cli/es/guias/connect/devolutions-cloud.md), [Iniciar sesión en Devolutions Server](/cli/es/guias/connect/devolutions-server.md).

## Siguiente

* [Install Devolutions CLI on build agents](/cli/es/para-devops-y-administradores/automate/install-on-runners.md)
* [Run without prompts](/cli/es/para-devops-y-administradores/automate/non-interactive.md)
* [Run a command with its secrets](/cli/es/guias/secrets/run-with-secrets.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.devolutions.net/cli/es/para-devops-y-administradores/automate/ci-sign-in.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
