# Создание и тестирование Rust

Узнайте, как создать рабочий процесс непрерывной интеграции (CI) для создания и тестирования проекта Rust.

> \[!NOTE]
> GitHub Enterprise Serverразмещенные в данный момент средства выполнения не поддерживаются в GitHub.

## Введение

В этом руководстве показано, как создавать, тестировать и публиковать пакет Rust.

GitHub-размещенные средства запуска имеют кэш средств с предварительно установленным программным обеспечением, которое включает зависимости для Rust. Полный список актуального программного обеспечения и предварительно установленных версий Rust см. в разделе [Средства выполнения тестов, размещенные в GitHub](/ru/enterprise-server@3.22/actions/concepts/runners/github-hosted-runners#preinstalled-software-for-github-owned-images).

## Необходимые компоненты

Вы уже должны быть знакомы с синтаксисом YAML и его использованием GitHub Actions. Дополнительные сведения см. в разделе [Синтаксис рабочего процесса для GitHub Actions](/ru/enterprise-server@3.22/actions/reference/workflows-and-actions/workflow-syntax).

Мы рекомендуем иметь базовое представление о языке Rust. Дополнительные сведения см. в статье ["Начало работы с Rust](https://www.rust-lang.org/learn)".

## Использование шаблона рабочего процесса Rust

Чтобы быстро приступить к работе, добавьте шаблон рабочего процесса в `.github/workflows` каталог репозитория.

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

1. На GitHubперейдите на главную страницу репозитория.

2. Под именем репозитория щелкните **<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-play" aria-label="play" role="img"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path></svg> Actions**.

   ![Снимок экрана: вкладки для репозитория github/docs. Вкладка "Действия" выделена оранжевым контуром.](/assets/images/help/repository/actions-tab-global-nav-update.png)

3. Если в вашем репозитории уже используется рабочий процесс, нажмите кнопку **Создать рабочий процесс**.

4. На странице "Выбор рабочего процесса" показан выбор рекомендуемых шаблонов рабочих процессов. Найдите "Rust".

5. Отфильтруйте выбор рабочих процессов, щелкнув **"Непрерывная интеграция**".

6. В рабочем процессе Rust (Rust — по GitHub Actions) нажмите кнопку **"Настроить**".

   ![Снимок экрана: страница "Выбор рабочего процесса". Кнопка "Настроить" в рабочем процессе Rust выделена оранжевым контуром.](/assets/images/help/actions/starter-workflow-rust.png)
   Если шаблон рабочего процесса Rust GitHub Actionsне указан, скопируйте следующий код рабочего процесса в новый файл, вызываемый `rust.yml` в `.github/workflows` каталоге репозитория.

   ```yaml copy
   name: Rust

   on:
     push:
       branches: [ "main" ]
     pull_request:
       branches: [ "main" ]

   env:
     CARGO_TERM_COLOR: never

   jobs:
     build:

       runs-on: ubuntu-latest

       steps:
       - uses: actions/checkout@v6
       - name: Build
         run: cargo build --verbose
       - name: Run tests
         run: cargo test --verbose
   ```

7. Измените рабочий процесс по мере необходимости. Например, измените версию Rust.

8. Щелкните **Зафиксировать изменения**.

## Указание версии Rust

GitHub-размещенные средства выполнения включают в себя последнюю версию цепочки инструментов Rust. С помощью rustup можно сообщить о версии, установленной в средстве выполнения, переопределить версию и установить различные цепочки инструментов. Дополнительные сведения см. в книге [](https://rust-lang.github.io/rustup/)rustup.

В этом примере показаны шаги, которые можно использовать для настройки среды запуска, чтобы использовать ночную сборку rust и сообщить о версии.

```yaml copy
      - name: Temporarily modify the rust toolchain version
        run: rustup override set nightly
      - name: Output rust version for educational purposes
        run: rustup --version
```

### Кэширование зависимостей

Можно кэшировать и восстанавливать зависимости с помощью действия "Кэш". В этом примере предполагается, что репозиторий содержит `Cargo.lock` файл.

```yaml copy
      - name: Cache
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
```

Если у вас есть пользовательские требования или требуются более подробные элементы управления для кэширования, следует изучить другие параметры конфигурации для [`cache` действия](https://github.com/marketplace/actions/cache). Дополнительные сведения см. в разделе [Справочник по кэшированию зависимостей](/ru/enterprise-server@3.22/actions/reference/workflows-and-actions/dependency-caching).

## Создание и тестирование кода

Вы можете использовать те же команды, которые используются для создания и тестирования кода в локальной среде. В этом примере рабочего процесса показано, как использовать `cargo build` и `cargo test` в задании:

```yaml copy
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        BUILD_TARGET: [release] # refers to a cargo profile
    outputs:
      release_built: ${{ steps.set-output.outputs.release_built }}
    steps:
      - uses: actions/checkout@v6
      - name: Build binaries in "${{ matrix.BUILD_TARGET }}" mode
        run: cargo build --profile ${{ matrix.BUILD_TARGET }}
      - name: Run tests in "${{ matrix.BUILD_TARGET }}" mode
        run: cargo test --profile ${{ matrix.BUILD_TARGET }}
```

Ключевое слово, используемое `release` в этом примере, соответствует профилю грузов. Вы можете использовать любой профиль[, определенный ](https://doc.rust-lang.org/cargo/reference/profiles.html)в `Cargo.toml` файле.

## Публикация пакета или библиотеки в crates.io

После настройки рабочего процесса для создания и тестирования кода можно использовать секрет для входа [в систему для crates.io](https://crates.io/) и публикации пакета.

```yaml copy
      - name: Login into crates.io
        run: cargo login ${{ secrets.CRATES_IO }}
      - name: Build binaries in "release" mode
        run: cargo build -r
      - name: "Package for crates.io"
        run: cargo package # publishes a package as a tarball
      - name: "Publish to crates.io"
        run: cargo publish # publishes your crate as a library that can be added as a dependency
```

Если возникают ошибки в сборке и упаковке ящика, проверьте метаданные в манифесте, `Cargo.toml` файле, см [. раздел "Формат](https://doc.rust-lang.org/cargo/reference/manifest.html) манифеста". Вы также должны проверить `Cargo.lock` файл, см. статью [Cargo.toml vs Cargo.lock](https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html).

## Упаковка данных рабочего процесса в виде артефактов

После завершения рабочего процесса можно отправить полученные артефакты для анализа или использовать в другом рабочем процессе. Эти примеры можно добавить в рабочий процесс для отправки приложения для использования другим рабочим процессом.

```yaml copy
      - name: Upload release artifact
        uses: actions/upload-artifact@v3
        with:
          name: <my-app>
          path: target/${{ matrix.BUILD_TARGET }}/<my-app>
```

Чтобы использовать отправленный артефакт в другом задании, убедитесь, что рабочие процессы имеют правильные разрешения для репозитория, см [. раздел AUTOTITLE](/ru/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token). Эти примеры можно использовать для скачивания приложения, созданного в предыдущем рабочем процессе, и его публикации.GitHub

```yaml copy
      - uses: actions/checkout@v6
      - name: Download release artifact
        uses: actions/download-artifact@v3
        with:
          name: <my-app>
          path: ./<my-app>
      - name: Publish built binary to GitHub releases
      - run: |
          gh release create --generate-notes ./<my-app>/<my-project>#<my-app>
```