Ir al contenido

Integración continua (CI)

Para ejecutar comandos de Tuist en tus flujos de trabajo de integración continua, deberás instalarlo en tu entorno de CI.

La autenticación es opcional, pero necesaria si quieres usar funcionalidades del servidor como caché.

Las siguientes secciones ofrecen ejemplos de cómo hacerlo en distintas plataformas de CI.

Ejemplos#

GitHub Actions#

En GitHub Actions puedes usar autenticación OIDC para una autenticación segura y sin secretos:

yaml
name: Build Application
on:
pull_request:
branches:
- main
push:
branches:
- main
permissions:
id-token: write
contents: read
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- uses: jdx/mise-action@v2
- run: tuist auth login
- run: tuist setup cache
yaml
name: Build Application
on:
pull_request:
branches:
- main
push:
branches:
- main
permissions:
id-token: write
contents: read
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- run: brew install --formula [email protected]
- run: tuist auth login
- run: tuist setup cache
yaml
name: Build Application
on:
pull_request:
branches:
- main
push:
branches:
- main
env:
TUIST_TOKEN: ${{ secrets.TUIST_TOKEN }}
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- uses: jdx/mise-action@v2
- run: tuist setup cache
yaml
name: Build Application
on:
pull_request:
branches:
- main
push:
branches:
- main
env:
TUIST_TOKEN: ${{ secrets.TUIST_TOKEN }}
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- run: brew install --formula [email protected]
- run: tuist setup cache
Configuración de OIDC

Antes de usar la autenticación OIDC, debes conectar tu repositorio de GitHub a tu proyecto de Tuist. El permissions: id-token: write es necesario para que OIDC funcione. Como alternativa, puedes usar un token de cuenta con el secreto TUIST_TOKEN.

Tip

Recomendamos usar mise use --pin en tus proyectos de Tuist para fijar la versión de Tuist en todos los entornos. El comando creará un archivo .tool-versions con la versión de Tuist.

Xcode Cloud#

En Xcode Cloud, que usa proyectos de Xcode como fuente de verdad, tendrás que añadir un script post-clone para instalar Tuist y ejecutar los comandos que necesites, por ejemplo tuist generate:

bash
#!/bin/sh
# Mise installation taken from https://mise.jdx.dev/continuous-integration.html#xcode-cloud
curl https://mise.run | sh # Install Mise
export PATH="$HOME/.local/bin:$PATH"
mise install # Installs the version from .mise.toml
# Runs the version of Tuist indicated in the .mise.toml file {#runs-the-version-of-tuist-indicated-in-the-misetoml-file}
mise exec -- tuist install --path ../ # `--path` needed as this is run from within the `ci_scripts` directory
mise exec -- tuist generate -p ../ --no-open # `-p` needed as this is run from within the `ci_scripts` directory
bash
#!/bin/sh
brew install --formula [email protected]
tuist generate
Autenticación

Usa un token de cuenta configurando la variable de entorno TUIST_TOKEN en la configuración de tu flujo de trabajo de Xcode Cloud.

CircleCI#

En CircleCI puedes usar autenticación OIDC para una autenticación segura y sin secretos:

yaml
version: 2.1
jobs:
build:
macos:
xcode: "15.0.1"
steps:
- checkout
- run:
name: Install Mise
command: |
curl https://mise.jdx.dev/install.sh | sh
echo 'export PATH="$HOME/.local/bin:$PATH"' >> $BASH_ENV
- run:
name: Install Tuist
command: mise install
- run:
name: Authenticate
command: mise exec -- tuist auth login
- run:
name: Build
command: mise exec -- tuist setup cache
yaml
version: 2.1
jobs:
build:
macos:
xcode: "15.0.1"
environment:
TUIST_TOKEN: $TUIST_TOKEN
steps:
- checkout
- run:
name: Install Mise
command: |
curl https://mise.jdx.dev/install.sh | sh
echo 'export PATH="$HOME/.local/bin:$PATH"' >> $BASH_ENV
- run:
name: Install Tuist
command: mise install
- run:
name: Build
command: mise exec -- tuist setup cache
Autenticación

Antes de usar la autenticación OIDC, debes conectar tu repositorio de GitHub a tu proyecto de Tuist. Los tokens OIDC de CircleCI incluyen tu repositorio de GitHub conectado, que Tuist usa para autorizar el acceso a tus proyectos. Como alternativa, puedes usar un token de cuenta con la variable de entorno TUIST_TOKEN.

Bitrise#

En Bitrise puedes usar autenticación OIDC para una autenticación segura y sin secretos:

yaml
workflows:
build:
steps:
- git-clone@8: {}
- script@1:
title: Install Mise
inputs:
- content: |
curl https://mise.jdx.dev/install.sh | sh
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
- script@1:
title: Install Tuist
inputs:
- content: mise install
- get-identity-token@0:
inputs:
- audience: tuist
- script@1:
title: Authenticate
inputs:
- content: mise exec -- tuist auth login
- script@1:
title: Build
inputs:
- content: mise exec -- tuist setup cache
yaml
workflows:
build:
steps:
- git-clone@8: {}
- script@1:
title: Install Mise
inputs:
- content: |
curl https://mise.jdx.dev/install.sh | sh
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
- script@1:
title: Install Tuist
inputs:
- content: mise install
- script@1:
title: Build
inputs:
- content: mise exec -- tuist setup cache
Autenticación

Antes de usar la autenticación OIDC, debes conectar tu repositorio de GitHub a tu proyecto de Tuist. Los tokens OIDC de Bitrise incluyen tu repositorio de GitHub conectado, que Tuist usa para autorizar el acceso a tus proyectos. Como alternativa, puedes usar un token de cuenta con la variable de entorno TUIST_TOKEN.

Codemagic#

En Codemagic, puedes añadir un paso adicional a tu flujo de trabajo para instalar Tuist:

yaml
workflows:
build:
name: Build
max_build_duration: 30
environment:
xcode: 15.0.1
vars:
TUIST_TOKEN: ${{ secrets.TUIST_TOKEN }}
scripts:
- name: Install Mise
script: |
curl https://mise.jdx.dev/install.sh | sh
mise install # Installs the version from .mise.toml
- name: Build
script: mise exec -- tuist setup cache
yaml
workflows:
build:
name: Build
max_build_duration: 30
environment:
xcode: 15.0.1
vars:
TUIST_TOKEN: ${{ secrets.TUIST_TOKEN }}
scripts:
- name: Install Tuist
script: |
brew install --formula [email protected]
- name: Build
script: tuist setup cache
Autenticación

Crea un token de cuenta y añádelo como variable de entorno secreta llamada TUIST_TOKEN.

Appcircle#

En Appcircle, puedes usar los pasos de flujo de trabajo integrados Tuist Install y Tuist Commands, o añadir un paso Custom Script después del paso Git Clone para instalar Tuist tú mismo:

bash
cd $AC_REPOSITORY_DIR
curl https://mise.jdx.dev/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"
mise install
mise exec -- tuist setup cache
bash
cd $AC_REPOSITORY_DIR
brew install --formula [email protected]
tuist setup cache
Pasos del flujo de trabajo

El paso Tuist Install instala Tuist con Homebrew y ejecuta tuist generate. Configura la entrada Tuist Version para fijar la versión y, a continuación, añade un paso Tuist Commands para ejecutar comandos como tuist test o tuist build.

Autenticación

Crea un token de cuenta, añádelo como variable llamada TUIST_TOKEN a un grupo de variables de entorno y selecciona ese grupo en la configuración de tu build. Marca la variable como secreta con el icono del candado.

Informe de ejecución#

Cuando Tuist sube una ejecución, las URL del panel para esa ejecución se imprimen en los registros. Para obtenerlas sin analizar los registros —por ejemplo, para publicar el enlace al informe de tests en Slack cuando falla un job, o para alimentar una ejecución en tus propias herramientas— pasa --run-report-path (o establece TUIST_RUN_REPORT_PATH) a tuist test, tuist xcodebuild test o tuist xcodebuild build. Tuist escribe un informe JSON en esa ruta una vez que la ejecución se ha subido:

json
{
"runId": "0193f8c1-...",
"status": "success",
"runURL": "https://tuist.dev/acme/app/runs/0193f8c1-...",
"testRunURL": "https://tuist.dev/acme/app/tests/test-runs/...",
"buildRunURL": "https://tuist.dev/acme/app/builds/build-runs/...",
"testRuns": [
{
"scheme": "App",
"succeeded": true,
"totalTests": 42,
"skippedTests": 0,
"ranTests": 42,
"failedTestNames": [],
"ranTestModules": 3,
"skippedTestModules": 5
}
],
"buildRuns": [
{ "scheme": "App", "succeeded": true, "durationInSeconds": 12.3 }
]
}
CampoTipoDescripción
runIdstringEl identificador único de la ejecución.
statusstring"success" o "failure".
runURLstringLa URL del panel para la ejecución. Siempre presente.
testRunURLstring?La URL del panel para la ejecución de tests, presente cuando el comando ejecutó tests.
buildRunURLstring?La URL del panel para la ejecución de build, presente cuando el comando compiló.
testRunsarrayResultados de tests por esquema: scheme, succeeded, totalTests, skippedTests, ranTests, failedTestNames, ranTestModules y skippedTestModules. Los recuentos de tests son casos de test, y skippedTests cuenta los que el paquete de resultados indica como omitidos. skippedTestModules cuenta los módulos de test que los tests selectivos omitieron, y se omite cuando los tests selectivos no se aplicaron o la ejecución es un fragmento de test.
buildRunsarrayResultados de build por esquema: scheme, succeeded, durationInSeconds.

testRunURL y buildRunURL son independientes: un comando que compila y ejecuta tests escribe ambas, algo que los registros no pueden hacer —solo imprimen una URL por ejecución.

Cuándo se escribe el informe

El informe se escribe solo para las ejecuciones que se suben al servidor, lo cual requiere autenticación y ocurre automáticamente en CI. La ruta se limpia al inicio de cada ejecución, de modo que una ejecución que no genera informe no deja nada atrás en lugar de dejar uno obsoleto de una ejecución anterior.

En GitLab CI, un uso común es exponer una URL a jobs posteriores mediante un informe dotenv:

yaml
test:
script:
- tuist test --run-report-path tuist-run.json
- echo "TUIST_TEST_RUN_URL=$(jq -r '.testRunURL // empty' tuist-run.json)" >> run.env
artifacts:
reports:
dotenv: run.env