Перейти к содержимому

Непрерывная интеграция (CI)

Чтобы запускать команды Tuist в ваших рабочих процессах непрерывной интеграции, необходимо установить её в среде CI.

Аутентификация необязательна, но требуется, если вы хотите использовать серверные возможности, такие как кэш.

В следующих разделах приведены примеры настройки для различных платформ CI. Once подключается через собственный нативный провайдер Tuist; ему не нужен CLI Tuist. См. раздел Once для этого рабочего процесса.

Once#

Зафиксируйте провайдер и привязку кэша из руководства Начало работы с Once. Установите Once в задаче, следуя инструкциям по установке Once, затем выполните аутентификацию перед запуском задач, использующих кэш.

GitHub Actions, CircleCI и Bitrise поддерживают безголовый вход через OpenID Connect для Once. Подключите репозиторий к вашему проекту Tuist, как описано в разделе аутентификация OIDC. В GitHub Actions предоставьте разрешение identity-token:

yaml
permissions:
id-token: write
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: jdx/mise-action@v2
# Pin Once in your repository's mise.toml.
- run: once auth login --provider tuist --no-browser
- run: once build MyTarget
- run: once test

Выберите ОС с наборами инструментов, требуемыми вашими таргетами. Замените MyTarget на ваш таргет и зафиксируйте версию Once через ваш существующий процесс установки инструментов. Полученная сессия будет переиспользоваться для доступа к кэшу, отчётности и публикации артефактов во время выполнения задачи.

На других провайдерах установите TUIST_TOKEN в значение токена аккаунта, авторизованного для необходимых операций. Храните его в хранилище секретов CI, никогда не сохраняйте в once.toml или исходном коде рабочего процесса. При использовании этого токена интерактивный вход не требуется.

Для наборов с несколькими воркерами следуйте руководству шардирование тестов в Once. Чтобы публиковать приложения, добавьте явный шаг публикации превью в Once. Обычные сборки не публикуют превью неявно.

Примеры#

GitHub Actions#

В GitHub Actions можно использовать аутентификацию OIDC для безопасного входа без использования секретов:

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
Настройка OIDC

Перед использованием аутентификации OIDC необходимо подключить ваш GitHub-репозиторий к проекту Tuist. Разрешение permissions: id-token: write обязательно для работы OIDC. В качестве альтернативы можно использовать токен аккаунта с секретом TUIST_TOKEN.

Tip

Рекомендуем использовать mise use --pin в проектах Tuist, чтобы зафиксировать версию Tuist для всех сред. Эта команда фиксирует версию Tuist в файле mise.toml.

Xcode Cloud#

В Xcode Cloud, где проекты Xcode являются источником истины, нужно добавить скрипт post-clone для установки Tuist и запуска необходимых команд, например 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
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
Аутентификация

Используйте токен аккаунта, установив переменную окружения TUIST_TOKEN в настройках рабочего процесса Xcode Cloud.

CircleCI#

В CircleCI можно использовать аутентификацию OIDC для безопасного входа без использования секретов:

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
Аутентификация

Перед использованием аутентификации OIDC необходимо подключить ваш GitHub-репозиторий к проекту Tuist. Токены OIDC CircleCI включают подключённый GitHub-репозиторий, который Tuist использует для авторизации доступа к вашим проектам. В качестве альтернативы можно использовать токен аккаунта с переменной окружения TUIST_TOKEN.

Bitrise#

В Bitrise можно использовать аутентификацию OIDC для безопасного входа без использования секретов:

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
Аутентификация

Перед использованием аутентификации OIDC необходимо подключить ваш GitHub-репозиторий к проекту Tuist. Токены OIDC Bitrise включают подключённый GitHub-репозиторий, который Tuist использует для авторизации доступа к вашим проектам. В качестве альтернативы можно использовать токен аккаунта с переменной окружения TUIST_TOKEN.

Codemagic#

В Codemagic можно добавить дополнительный шаг в рабочий процесс для установки 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
Аутентификация

Создайте токен аккаунта и добавьте его как секретную переменную окружения с именем TUIST_TOKEN.

Appcircle#

В Appcircle можно использовать встроенные шаги рабочего процесса Tuist Install и Tuist Commands или добавить шаг Custom Script после шага Git Clone, чтобы самостоятельно установить Tuist:

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
Шаги рабочего процесса

Шаг Tuist Install устанавливает Tuist через Homebrew и выполняет tuist generate. Укажите версию в поле ввода Tuist Version, чтобы зафиксировать её, затем добавьте шаг Tuist Commands для выполнения команд, таких как tuist test или tuist build.

Аутентификация

Создайте токен аккаунта, добавьте его как переменную с именем TUIST_TOKEN в группу переменных окружения и выберите эту группу в конфигурации сборки. Пометьте переменную как секретную, нажав на значок замка.

Отчёт о запуске#

Когда Tuist загружает запуск, URL-адреса дашборда для него выводятся в логи. Чтобы получить их без парсинга логов — например, чтобы отправить ссылку на отчёт о тестах в Slack при сбое задачи или передать данные запуска в ваши собственные инструменты — передайте --run-report-path (или установите TUIST_RUN_REPORT_PATH) в команды tuist test, tuist xcodebuild test или tuist xcodebuild build. После загрузки запуска Tuist записывает JSON-отчёт по указанному пути:

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 }
]
}
ПолеТипОписание
runIdстрокаУникальный идентификатор запуска.
statusстрока"success" или "failure".
runURLстрокаURL-адрес дашборда для запуска. Всегда присутствует.
testRunURLстрока?URL-адрес дашборда для запуска тестов; присутствует, если команда выполняла тесты.
buildRunURLстрока?URL-адрес дашборда для запуска сборки; присутствует, если команда выполняла сборку.
testRunsмассивРезультаты тестов по схемам: scheme, succeeded, totalTests, skippedTests, ranTests, failedTestNames, ranTestModules и skippedTestModules. Счётчики тестов относятся к тест-кейсам, а skippedTests показывает количество кейсов, которые бандл результатов отмечает как пропущенные. skippedTestModules показывает количество тестовых модулей, пропущенных благодаря выборочному тестированию, и отсутствует, если выборочное тестирование не применялось или запуск является шардом тестов.
buildRunsмассивРезультаты сборки по схемам: scheme, succeeded, durationInSeconds.

testRunURL и buildRunURL независимы: команда, которая одновременно собирает и тестирует, записывает оба URL, чего не могут сделать логи — они выводят только один URL на запуск.

Когда записывается отчёт

Отчёт записывается только для запусков, которые загружаются на сервер, что требует аутентификации и происходит автоматически в CI. Путь очищается в начале каждого запуска, поэтому запуск, не создавший отчёт, не оставляет старых данных от предыдущих запусков.

В GitLab CI распространённый способ предоставить URL последующим задачам — использовать отчёт 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