- Интеграция CI/CD: запускать тесты против форкнутых сетей и настраивать стейджинг-окружения
- Тестирование в нескольких сетях: разворачивать несколько сетей за один шаг
- Автоматизированные развёртывания: деплоить и верифицировать контракты с полными логами развёртывания
- Сбор артефактов: отслеживать развёртывания в разных сетях со структурированными логами
- Локальная настройка: настройте Foundry, создайте и протестируйте файл workflow
- Настройка в GitHub: настройте GitHub Action, сконфигурируйте GitHub-секреты и переменные, протестируйте сборку
Настройка CI/CD с Foundry

Этап 1: локальная настройка
Сначала создайте файл workflow с необходимыми настройками.tenderly/vnet-github-action для развёртывания Virtual Environments по заданному network_id (Mainnet и Base) с пользовательским chain_idupdate_foundry_config_and_build, чтобы отредактировать foundry.toml с правильным chain ID (особенно важно, если вы используете пользовательский chain_id) и передать информацию о верификацииDEPLOYER_WALLET_ADDRESS 100 ETH с помощью set_wallet_balance$BUILD_OUTPUT_FILE_1 и $BUILD_OUTPUT_FILE_8453 соответственно, используя опцию --json в FoundryАргумент
mode в Tenderly/vnet-github-action принимает значения CI и CD.- Режим
CDоставляет Virtual Environment активной, и вы можете работать с задеплоенными контрактами. - Режим
CIприостанавливает Virtual Environment после завершения шага. Вы сможете просматривать транзакции, но не сможете отправлять дальнейшие RPC-запросы.
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
Создайте или обновите файл конфигурации
foundry.toml. Чтобы использовать автоматическую верификацию контрактов, у вас должна быть запись unknown_chain с key, chain и url.При использовании Virtual Environments с вашего локального компьютера замените
chain \= 0 на chain ID Virtual Environment, к которой вы подключились.[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" }
# Access parameters
TENDERLY_ACCESS_KEY=...
TENDERLY_PROJECT_NAME=...
TENDERLY_ACCOUNT_NAME=...
# Deployment parameters
DEPLOYER_PRIVATE_KEY=...
DEPLOYER_WALLET_ADDRESS=...
TENDERLY_ACCESS_KEY: ваш Tenderly access keyTENDERLY_ACCOUNT_NAME и TENDERLY_PROJECT_NAME: имена вашего аккаунта и проектаDEPLOYER_PRIVATE_KEY: приватный ключ для кошелька развёртыванияDEPLOYER_WALLET_ADDRESS: адрес, соответствующий приватному ключуДобавьте следующий
fixtures.sh в ваш репозиторий, чтобы легко пополнять аккаунты и адаптировать foundry.toml.set_wallet_balance для пополнения баланса (RPC_URL WALLET_ADDRESS BALANCE_HEX)update_foundry_config_and_build для замены placeholder’ов в foundry.tomlHUNDRED_ETH — значение wei, соответствующее 100 ETH#!/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
TENDERLY_TESTNET_ID_{network_id}TENDERLY_ADMIN_RPC_URL_{network_id}TENDERLY_PUBLIC_RPC_URL_{network_id}TENDERLY_CHAIN_ID_{network_id}TENDERLY_TESTNET_SLUG_{network_id}TENDERLY_FOUNDRY_VERIFICATION_URL_{network_id}BUILD_OUTPUT_FILE_{network_id}Можно протестировать ваш GitHub Action локально с помощью Act без пуша на GitHub.
Этап 2: настройка GitHub
После того как локальная настройка подтверждена, настройте ваш GitHub-репозиторий, выполнив следующие шаги.TENDERLY_PROJECT_NAME: имя проекта TenderlyTENDERLY_ACCOUNT_NAME: имя владельца проектаDEPLOYER_WALLET_ADDRESS: EOA деплойераЭто можно сделать через GitHub UI или с помощью командной строки
gh:# 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}
Перейдите в ваш GitHub-репозиторий и посмотрите вкладку Actions. Поздравляем, вы запустили ваш CI/CD workflow с Virtual Environments и Foundry.
Дальнейшие шаги
- Изучите пример Foundry на GitHub.
- Изучите пример Hardhat на GitHub.
- Используйте balance fixtures.