Перейти к основному содержанию
Узнайте, как настроить GitHub Action для организации пайплайна непрерывной интеграции и непрерывного развёртывания (CI/CD) с Foundry на Tenderly Virtual Environments. Используйте action Tenderly Virtual Environment Setup, чтобы включить автоматические сборки для тестирования и стейджинга ваших контрактов. Этот подход позволяет:
  • Интеграция CI/CD: запускать тесты против форкнутых сетей и настраивать стейджинг-окружения
  • Тестирование в нескольких сетях: разворачивать несколько сетей за один шаг
  • Автоматизированные развёртывания: деплоить и верифицировать контракты с полными логами развёртывания
  • Сбор артефактов: отслеживать развёртывания в разных сетях со структурированными логами
В этом руководстве нужно пройти два этапа:
  1. Локальная настройка: настройте Foundry, создайте и протестируйте файл workflow
  2. Настройка в GitHub: настройте GitHub Action, сконфигурируйте GitHub-секреты и переменные, протестируйте сборку
Для справки используйте этот пример проекта:

Настройка CI/CD с Foundry

Continuous integration (CI) and continous deployment (CD) with Virtual Environments

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

Сначала создайте файл workflow с необходимыми настройками.
1
Создайте файл workflow
2
В вашем Foundry-проекте создайте новую директорию workflows и файл ci-cd.yaml:
3
mkdir -p .github/workflows
touch .github/workflows/ci-cd.yaml
4
Затем вставьте следующую конфигурацию в ci-cd.yaml, которая настраивает две задачи:
5
  • test — запускает тесты Foundry
  • deploy — деплоит контракты в стейджинговую Virtual Environment
  • 6
    Этот пример workflow-файла:
    7
  • Использует tenderly/vnet-github-action для развёртывания Virtual Environments по заданному network_id (Mainnet и Base) с пользовательским chain_id
  • Использует update_foundry_config_and_build, чтобы отредактировать foundry.toml с правильным chain ID (особенно важно, если вы используете пользовательский chain_id) и передать информацию о верификации
  • Пополняет EOA DEPLOYER_WALLET_ADDRESS 100 ETH с помощью set_wallet_balance
  • Деплоит контракты в Virtual Environment
  • Собирает информацию о развёртывании в $BUILD_OUTPUT_FILE_1 и $BUILD_OUTPUT_FILE_8453 соответственно, используя опцию --json в Foundry
  • Пушит собранную информацию о развёртывании в репозиторий
  • 8
    Аргумент mode в Tenderly/vnet-github-action принимает значения CI и CD.
    • Режим CD оставляет Virtual Environment активной, и вы можете работать с задеплоенными контрактами.
    • Режим CI приостанавливает Virtual Environment после завершения шага. Вы сможете просматривать транзакции, но не сможете отправлять дальнейшие RPC-запросы.
    9
    name: Foundry CI/CD
    
    on:
      push:
      pull_request:
    
    env:
      TENDERLY_ACCESS_KEY: ${{ secrets.TENDERLY_ACCESS_KEY }}
      DEPLOYER_WALLET_ADDRESS: ${{ vars.DEPLOYER_WALLET_ADDRESS }}
      DEBUG: tenderly/vnet-github-action@v1.0.14
    jobs:
      deploy:
        runs-on: ubuntu-latest
        defaults:
          run:
            working-directory: ./examples/foundry
        permissions:
          contents: write
        steps:
          - uses: actions/checkout@v4
            with:
              submodules: recursive
    
          - 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: 7357
              public_explorer: true
              verification_visibility: 'src'
              push_on_complete: true
    
          - name: Install Foundry
            uses: foundry-rs/foundry-toolchain@v1
    
          - name: Fund Deployer Account on Mainnet
            run: |
              source ../../fixtures/load-fixtures.sh
              update_foundry_config_and_build $TENDERLY_ACCESS_KEY $TENDERLY_FOUNDRY_VERIFICATION_URL_1  $TENDERLY_CHAIN_ID_1
              set_wallet_balance $TENDERLY_ADMIN_RPC_URL_1 ${{ vars.DEPLOYER_WALLET_ADDRESS }} $HUNDRED_ETH
    
          - name: Deploy Contracts Mainnet
            run: |
              forge build --sizes
              forge script script/Counter.s.sol \
                --private-key ${{ secrets.DEPLOYER_PRIVATE_KEY }} \
                --rpc-url ${{ env.TENDERLY_PUBLIC_RPC_URL_1 }} \
                --verifier-url ${{ env.TENDERLY_FOUNDRY_VERIFICATION_URL_1 }} \
                --etherscan-api-key $TENDERLY_ACCESS_KEY \
                --slow \
                --broadcast \
                --verify \
                --json > $BUILD_OUTPUT_FILE_1
    
          - name: Fund Deployer Account on Base
            run: |
              source ../../fixtures/load-fixtures.sh
              update_foundry_config_and_build $TENDERLY_ACCESS_KEY $TENDERLY_FOUNDRY_VERIFICATION_URL_8453  $TENDERLY_CHAIN_ID_8453
              set_wallet_balance $TENDERLY_ADMIN_RPC_URL_8453 ${{ vars.DEPLOYER_WALLET_ADDRESS }} $HUNDRED_ETH
    
          - name: Deploy Contracts Base
            working-directory: ./examples/foundry
            run: |
              forge script script/Counter.s.sol \
                --private-key ${{ secrets.DEPLOYER_PRIVATE_KEY }} \
                --rpc-url ${{ env.TENDERLY_PUBLIC_RPC_URL_8453 }} \
                --verifier-url ${{ env.TENDERLY_FOUNDRY_VERIFICATION_URL_8453 }} \
                --etherscan-api-key $TENDERLY_ACCESS_KEY \
                --slow \
                --broadcast \
                --verify \
                --json > $BUILD_OUTPUT_FILE_8453
    
    10
    Настройте Foundry
    11
    Создайте или обновите файл конфигурации foundry.toml. Чтобы использовать автоматическую верификацию контрактов, у вас должна быть запись unknown_chain с key, chain и url.
    12
    При использовании Virtual Environments с вашего локального компьютера замените chain \= 0 на chain ID Virtual Environment, к которой вы подключились.
    13
    [profile.default]
    src = "src"
    out = "out"
    libs = ["lib"]
    cbor_metadata = true
    # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options
    
    [etherscan]
    
    ## placeholders must be replaced with key ("string"), chain_id (number, non-quoted), and tenderly_foundry_verification_url ("string")
    unknown_chain = { key = "$TENDERLY_ACCESS_KEY", chain = 0, url = "$TENDERLY_FOUNDRY_VERIFICATION_URL" }
    
    14
    Подготовьте переменные окружения
    15
    Для локального тестирования настройте файл .env со следующими переменными:
    16
    # Access parameters
    TENDERLY_ACCESS_KEY=...
    TENDERLY_PROJECT_NAME=...
    TENDERLY_ACCOUNT_NAME=...
    
    # Deployment parameters
    DEPLOYER_PRIVATE_KEY=...
    DEPLOYER_WALLET_ADDRESS=...
    
    17
    Обязательные переменные:
    18
  • TENDERLY_ACCESS_KEY: ваш Tenderly access key
  • TENDERLY_ACCOUNT_NAME и TENDERLY_PROJECT_NAME: имена вашего аккаунта и проекта
  • DEPLOYER_PRIVATE_KEY: приватный ключ для кошелька развёртывания
  • DEPLOYER_WALLET_ADDRESS: адрес, соответствующий приватному ключу
  • 19
    Добавьте скрипт fixtures
    20
    Добавьте следующий fixtures.sh в ваш репозиторий, чтобы легко пополнять аккаунты и адаптировать foundry.toml.
    21
    Этот файл предоставляет:
    22
  • функцию set_wallet_balance для пополнения баланса (RPC_URL WALLET_ADDRESS BALANCE_HEX)
  • функцию update_foundry_config_and_build для замены placeholder’ов в foundry.toml
  • HUNDRED_ETH — значение wei, соответствующее 100 ETH
  • 23
    #!/bin/bash
    
    set_wallet_balance() {
        if [ "$#" -ne 3 ]; then
            echo "Usage: set_wallet_balance RPC_URL WALLET_ADDRESS BALANCE_HEX"
            return 1
        fi
    
        local rpc_url="$1"
        local wallet_address="$2"
        local balance_hex="$3"
    
        curl --location "$rpc_url" \
            --header 'Content-Type: application/json' \
            --data "{
                \"jsonrpc\": \"2.0\",
                \"method\": \"tenderly_setBalance\",
                \"params\": [\"$wallet_address\", \"$balance_hex\"],
                \"id\": \"1\"
            }"
    }
    
    update_foundry_config_and_build() {
        if [ "$#" -ne 3 ]; then
            echo "Usage: update_foundry_config_and_build ACCESS_KEY VERIFICATION_URL CHAIN_ID"
            return 1
        fi
    
        local access_key="$1"
        local verification_url="$2"
        local chain_id="$3"
    
        # Create temporary file and update foundry.toml
        sed -e "s|\${TENDERLY_ACCESS_KEY}|$access_key|g" \
            -e "s|\${TENDERLY_FOUNDRY_VERIFICATION_URL}|$verification_url|g" \
            -e "s/\(unknown_chain[[:space:]]*=[[:space:]]*{[^}]*chain[[:space:]]*=[[:space:]]*\)[0-9][0-9]*/\1$chain_id/g" \
            foundry.toml > foundry.toml.tmp && mv foundry.toml.tmp foundry.toml
    }
    
    # Export constant
    HUNDRED_ETH="0xDE0B6B3A7640000"
    export HUNDRED_ETH
    
    24
    GitHub Action предоставляет RPC-ссылки и URL верификации через разные переменные окружения:
    25
    ПеременнаяОписаниеTENDERLY_TESTNET_ID_{network_id}UUID Virtual Environment, уникально идентифицирующий её в TenderlyTENDERLY_ADMIN_RPC_URL_{network_id}Эндпоинт Admin RPC с методами чит-кодовTENDERLY_PUBLIC_RPC_URL_{network_id}Публичный RPC-эндпоинтTENDERLY_CHAIN_ID_{network_id}Chain IDTENDERLY_TESTNET_SLUG_{network_id}Уникальный слаг Virtual EnvironmentTENDERLY_FOUNDRY_VERIFICATION_URL_{network_id}URL верификации FoundryBUILD_OUTPUT_FILE_{network_id}Путь к файлу вывода сборки
    26
    Протестируйте GitHub Action локально
    27
    Можно протестировать ваш GitHub Action локально с помощью Act без пуша на GitHub.
    28
    Используйте файл .env для заполнения GitHub-секретов и переменных окружения так:
    29
    act --secret-file .env --var-file .env
    

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

    После того как локальная настройка подтверждена, настройте ваш GitHub-репозиторий, выполнив следующие шаги.
    1
    Настройте секреты и переменные
    2
    Настройте следующие GitHub-секреты и переменные:
    3
    Секреты:
    4
  • TENDERLY_ACCESS_KEY: Tenderly Access Key
  • DEPLOYER_PRIVATE_KEY: приватный ключ для EOA деплойера
  • 5
    Переменные:
    6
  • TENDERLY_PROJECT_NAME: имя проекта Tenderly
  • TENDERLY_ACCOUNT_NAME: имя владельца проекта
  • DEPLOYER_WALLET_ADDRESS: EOA деплойера
  • 7
    Это можно сделать через GitHub UI или с помощью командной строки gh:
    8
    # Load environment variables
    source .env
    
    # Set variables
    gh variable set TENDERLY_PROJECT_NAME --body ${TENDERLY_PROJECT_NAME}
    gh variable set TENDERLY_ACCOUNT_NAME --body ${TENDERLY_ACCOUNT_NAME}
    gh variable set DEPLOYER_WALLET_ADDRESS --body ${DEPLOYER_WALLET_ADDRESS}
    
    # Set secrets
    gh secret set TENDERLY_ACCESS_KEY --body ${TENDERLY_ACCESS_KEY}
    gh secret set DEPLOYER_PRIVATE_KEY --body ${DEPLOYER_PRIVATE_KEY}
    
    9
    Запушьте обновления
    10
    Наконец, закоммитьте и запушьте изменения:
    11
    git add .
    git commit -m "Add CI/CD workflow for Foundry"
    git push
    
    12
    Проверьте ваш action
    13
    Перейдите в ваш GitHub-репозиторий и посмотрите вкладку Actions. Поздравляем, вы запустили ваш CI/CD workflow с Virtual Environments и Foundry.
    14
    Получите RPC-ссылку
    15
    Чтобы получить RPC-ссылку, перейдите в Tenderly dashboard > Virtual Environments и найдите вашу CD Virtual Environment.

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