> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tenderly.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Hardhat и Github Actions

> Используйте Tenderly GitHub Action, чтобы настроить непрерывную интеграцию и непрерывное развёртывание (CI/CD) для тестирования и стейджинга Solidity смарт-контрактов с Hardhat.

Узнайте, как настроить GitHub Action для организации пайплайна непрерывной интеграции и непрерывного развёртывания (CI/CD) с Hardhat на Tenderly Virtual Environments.

Используйте [Tenderly Virtual Environment Setup](https://github.com/marketplace/actions/tenderly-virtual-testnet-setup), чтобы включить автоматизированные сборки, тестирующие и деплоящие ваши контракты в несколько сетей. После успешного тестирования вы можете передать их остальной команде, развернув в подготовленных Virtual Environments.

В этом руководстве нужно пройти два этапа:

1. Локальная настройка: настройте Hardhat и создайте и протестируйте файл workflow.
2. Настройка в GitHub: настройте GitHub Action, сконфигурируйте GitHub-секреты и переменные, протестируйте сборку.

Для справки используйте этот пример проекта:

<Card title="Настройка CI/CD с hardhat-ignition" href="" />

<Note>
  Это руководство демонстрирует настройку CI, полагающуюся на Hardhat-ignition. Для настройки `hardhat-verify` процесс и конфигурация аналогичны.
</Note>

<Frame caption="Непрерывная интеграция (CI) и непрерывное развёртывание (CD) с Virtual Environments">
  <img src="https://mintcdn.com/tenderly/XsEZlaGXYskrtN68/images/testnets/ci.png?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=2feac85321ea229193ae44bdbc1c1c38" alt="Continuous integration (CI) and continous deployment (CD) with Virtual Environments" width="1920" height="1080" data-path="images/testnets/ci.png" />
</Frame>

## Этап 1: локальная настройка

Сначала мы установим необходимые зависимости и создадим файл workflow.

<Steps>
  ### Установите зависимости

  Убедитесь, что установлены следующие пакеты:

  ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  npm install --save-dev @tenderly/hardhat-tenderly @nomicfoundation/hardhat-ignition
  ```

  ### Создайте файл workflow

  Чтобы настроить GitHub Action, создайте новый workflow:

  ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  mkdir -p .github/workflows
  touch ci-cd.yaml
  ```

  Затем вставьте следующий yaml-файл, который настраивает две задачи:

  * **`test`** — запускает тесты Hardhat, используя одну сеть для тестирования
  * **`deploy`** — деплоит контракты в несколько сетей (Mainnet и Base) после успешного тестирования

  <Note>
    Аргумент `mode` принимает значения `CI` и `CD`.

    * Режим `CD` оставляет Virtual Environment активной, и вы можете работать с задеплоенными контрактами.
    * Режим `CI` приостанавливает Virtual Environment после завершения шага. Вы сможете просматривать транзакции, но не сможете отправлять дальнейшие RPC-запросы.
  </Note>

  ```yaml showLineNumbers title="ci-cd.yaml" theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  name: Hardhat CI/CD Multichain

  on: [push, pull_request]
  env:
    ## Needed available as env variables for hardhat.config.js
    TENDERLY_PROJECT_NAME: ${{ vars.TENDERLY_PROJECT_NAME }}
    TENDERLY_ACCOUNT_NAME: ${{ vars.TENDERLY_ACCOUNT_NAME }}
  jobs:
    test:
      runs-on: ubuntu-latest
      steps:
        - uses: actions/checkout@v4

        - name: Setup Node.js
          uses: actions/setup-node@v4
          with:
            node-version: '20'
            cache: 'npm'

        - name: Setup Virtual Environment
          uses: tenderly/vnet-github-action@v1.0.14
          with:
            mode: CI    # pauses the Virtual Environment after deployment
            access_key: ${{ secrets.TENDERLY_ACCESS_KEY }}
            project_name: ${{ vars.TENDERLY_PROJECT_NAME }}
            account_name: ${{ vars.TENDERLY_ACCOUNT_NAME }}
            testnet_name: "Testing"
            network_id: 1
            chain_id_prefix: 7357
            public_explorer: true
            verification_visibility: 'src'
            push_on_complete: true

        - name: Install dependencies
          run: npm install
          working-directory: examples/hardhat-ignition

        - name: Run Tests
          run: npm run test:1
          working-directory: examples/hardhat-ignition

    deploy:
      needs: test
      runs-on: ubuntu-latest
      permissions:
        contents: write
      steps:
        - uses: actions/checkout@v4

        - name: Setup Node.js
          uses: actions/setup-node@v4
          with:
            node-version: '20'
            cache: 'npm'

        - name: Setup Virtual Environment
          uses: tenderly/vnet-github-action@v1.0.14
          with:
            mode: CD
            access_key: ${{ secrets.TENDERLY_ACCESS_KEY }}
            project_name: ${{ vars.TENDERLY_PROJECT_NAME }}
            account_name: ${{ vars.TENDERLY_ACCOUNT_NAME }}
            testnet_name: "Staging"
            network_id: |
              1
              8453
            chain_id_prefix: ""
            public_explorer: true
            verification_visibility: 'src'
            push_on_complete: true

        - name: Install dependencies
          run: npm install
          working-directory: examples/hardhat-ignition

        - name: Deploy Contracts Mainnet
          run: npm run deploy:1 -- --deployment-id deploy-1-${BUILD_SLUG}
          working-directory: examples/hardhat-ignition

        - name: Deploy Contracts Base
          run: npm run deploy:8453 -- --deployment-id deploy-8453-${BUILD_SLUG}
          working-directory: examples/hardhat-ignition
  ```

  ### Подготовьте переменные окружения

  Для локального тестирования настройте файл `.env`, используя этот шаблон:

  ```dotenv theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  ## Access parameters
  TENDERLY_ACCESS_KEY=...
  TENDERLY_PROJECT_NAME=...
  TENDERLY_ACCOUNT_NAME=...

  ## Network-specific parameters (populated by the action in CI/CD)
  TENDERLY_ADMIN_RPC_URL_1=...    # Mainnet RPC
  TENDERLY_ADMIN_RPC_URL_8453=... # Base RPC
  TENDERLY_CHAIN_ID_1=...         # Mainnet chain ID
  TENDERLY_CHAIN_ID_8453=...      # Base chain ID
  ```

  Обязательные переменные:

  * `TENDERLY_ACCESS_KEY`: узнайте, как [получить ваш access key](/platform/account/projects/api-tokens)
  * `TENDERLY_ACCOUNT_NAME` и `TENDERLY_PROJECT_NAME`: следуйте шагам, чтобы [получить имена вашего аккаунта и проекта](/platform/account/projects/api-tokens)

  ### Настройте Hardhat

  Добавьте конфигурацию Virtual Environment в `hardhat.config.ts`:

  ```typescript title='hardhat.config.ts' showLineNumbers theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}

  dotenv.config();

  const config: HardhatUserConfig = {
    solidity: "0.8.27",
    networks: {
      mainnet: {
        url: process.env.TENDERLY_ADMIN_RPC_URL_1,
        chainId: parseInt(process.env.TENDERLY_CHAIN_ID_1 || "1")
      },
      base: {
        url: process.env.TENDERLY_ADMIN_RPC_URL_8453,
        chainId: parseInt(process.env.TENDERLY_CHAIN_ID_8453 || "8453")
      }
    },
    etherscan: {
      apiKey: {
        mainnet: process.env.TENDERLY_ACCESS_KEY!,
        base: process.env.TENDERLY_ACCESS_KEY!
      },
      customChains: [
        {
          network: "mainnet",
          chainId: parseInt(process.env.TENDERLY_CHAIN_ID_1!),
          urls: {
            apiURL: `${process.env.TENDERLY_ADMIN_RPC_URL_1}/verify`,
            browserURL: process.env.TENDERLY_ADMIN_RPC_URL_1!
          }
        },
        {
          network: "base",
          chainId: parseInt(process.env.TENDERLY_CHAIN_ID_8453!),
          urls: {
            apiURL: `${process.env.TENDERLY_ADMIN_RPC_URL_8453}/verify`,
            browserURL: process.env.TENDERLY_ADMIN_RPC_URL_8453!
          }
        }
      ]
    },
    tenderly: {
      project: process.env.TENDERLY_PROJECT_NAME!,
      username: process.env.TENDERLY_ACCOUNT_NAME!,
      accessKey: process.env.TENDERLY_ACCESS_KEY!
    },
    sourcify: {
      enabled: false
    }
  };

  export default config;
  ```

  ### Добавьте скрипты тестирования и развёртывания

  Добавьте следующие скрипты в ваш `package.json` для мультисетевого тестирования и развёртывания:

  ```json theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  {
    "scripts": {
      "deploy:1": "npx hardhat ignition deploy ./ignition/modules/Counter.js --network mainnet",
      "deploy:8453": "npx hardhat ignition deploy ./ignition/modules/Counter.js --network base",
      "test:1": "npx hardhat test --network mainnet"
    }
  }
  ```

  Команды деплоя используют переменную окружения BUILD\_SLUG (предоставляемую action'ом), чтобы создавать уникальные идентификаторы развёртывания.

  ### Протестируйте сборку локально

  Чтобы протестировать сборку локально, выполните следующие команды:

  ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  # Test on mainnet fork
  npx hardhat test:1

  # Deploy to mainnet fork
  npx hardhat deploy:1

  # Deploy to Base fork
  npx hardhat deploy:8453
  ```

  ### Протестируйте GitHub Action локально

  Чтобы протестировать ваш action локально, можно использовать [Act](https://github.com/nektos/act):

  ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  act --secret-file .env --var-file .env
  ```
</Steps>

## Этап 2: настройка GitHub

После успешной локальной настройки продолжите, сконфигурировав GitHub переменными окружения и необходимыми секретами.

<Steps>
  ### Настройте секреты и переменные окружения в GitHub

  Нужно настроить следующие переменные и секрет GitHub:

  **Переменные:**

  * `TENDERLY_PROJECT_NAME`
  * `TENDERLY_ACCOUNT_NAME`

  **Секреты:**

  * `TENDERLY_ACCESS_KEY`

  Это можно сделать через [GitHub UI](https://docs.github.com/en/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables#creating-configuration-variables-for-a-repository) или с помощью командной строки `gh`:

  ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  source .env

  gh variable set TENDERLY_PROJECT_NAME --body ${TENDERLY_PROJECT_NAME}
  gh variable set TENDERLY_ACCOUNT_NAME --body ${TENDERLY_ACCOUNT_NAME}
  gh secret set TENDERLY_ACCESS_KEY --body ${TENDERLY_ACCESS_KEY}
  ```

  ### Запушьте обновления

  Чтобы запустить GitHub Action, запушьте ваши изменения:

  ```bash theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
  git add .
  git commit -m "Add CI/CD workflow for multichain deployment"
  git push
  ```

  ### Проверьте ваш action

  Перейдите в ваш GitHub-репозиторий и посмотрите вкладку Actions. Вы должны увидеть:

  1. Задачу test, запускающуюся против форка mainnet
  2. Задачу deploy, создающую две Virtual Environments (mainnet и Base)
  3. Артефакты развёртывания, отправляемые в репозиторий

  ### Получите RPC-ссылки

  Чтобы получить RPC-ссылки для ваших развёрнутых контрактов:

  1. Перейдите в **Tenderly dashboard > Virtual Environments**
  2. Найдите ваши CD Virtual Environments (одна для форка mainnet, одна для форка Base)
  3. Щёлкните на каждой, чтобы получить их RPC URL
</Steps>

## Справочник переменных окружения

GitHub Action предоставляет следующие переменные, специфичные для сети:

| Переменная                             | Описание                                |
| -------------------------------------- | --------------------------------------- |
| `TENDERLY_TESTNET_ID_{network_id}`     | UUID Virtual Environment                |
| `TENDERLY_ADMIN_RPC_URL_{network_id}`  | Эндпоинт Admin RPC с методами чит-кодов |
| `TENDERLY_PUBLIC_RPC_URL_{network_id}` | Публичный RPC-эндпоинт                  |
| `TENDERLY_CHAIN_ID_{network_id}`       | Chain ID                                |
| `TENDERLY_TESTNET_SLUG_{network_id}`   | Уникальный слаг Virtual Environment     |
| `BUILD_SLUG`                           | Уникальный идентификатор текущей сборки |

## Дальнейшие шаги

Изучите другие примеры:

* [Hardhat с ethers-v6](https://github.com/Tenderly/vnet-github-action/tree/main/examples/hardhat)
* [Настройка Foundry](https://github.com/Tenderly/vnet-github-action/tree/main/examples/foundry)
* [Продвинутые шаблоны развёртывания](https://github.com/Tenderly/vnet-github-action/tree/main/examples/advanced)
