- Local setup: Hardhat सेट करें और workflow file बनाएं और उसका परीक्षण करें।
- Github setup: GitHub Action सेट करें, GitHub secrets और variables कॉन्फ़िगर करें, और build को टेस्ट करें।
CI/CD setup with hardhat-ignition
यह गाइड Hardhat-ignition पर निर्भर एक CI setup प्रदर्शित करती है।
hardhat-verify setup के लिए, प्रक्रिया और configuration समान हैं।
Stage 1: Local setup
पहले, हम आवश्यक dependencies स्थापित करेंगे और एक workflow file बनाएंगे।test jobdeploy jobmode argument CI और CD मान लेता है।CDmode Virtual Environment को सक्रिय रखता है और आप deployed contracts के साथ काम कर सकते हैं।CImode step पूरा होने के बाद Virtual Environment को रोक देता है। आप transactions का निरीक्षण कर सकेंगे लेकिन आगे RPC requests नहीं भेज पाएंगे।
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
## 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 कैसे प्राप्त करेंTENDERLY_ACCOUNT_NAME और TENDERLY_PROJECT_NAME: अपने account और project नाम प्राप्त करने के चरणों का पालन करें
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;
{
"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"
}
}
deploy commands अद्वितीय deployment identifiers बनाने के लिए BUILD_SLUG environment variable (action द्वारा प्रदान) का उपयोग करते हैं।
# Test on mainnet fork
npx hardhat test:1
# Deploy to mainnet fork
npx hardhat deploy:1
# Deploy to Base fork
npx hardhat deploy:8453
अपने action को locally टेस्ट करने के लिए, आप Act का उपयोग कर सकते हैं:
Stage 2: Github Setup
सफल local setup के बाद, environment variables और आवश्यक secrets के साथ Github कॉन्फ़िगर करके आगे बढ़ें।आप इन्हें GitHub UI के माध्यम से या
gh command line का उपयोग करके कॉन्फ़िगर कर सकते हैं: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}
Environment Variables Reference
GitHub Action निम्न network-specific variables को उजागर करती है:| Variable | विवरण |
|---|---|
TENDERLY_TESTNET_ID_{network_id} | Virtual Environment UUID |
TENDERLY_ADMIN_RPC_URL_{network_id} | चीटकोड मेथड्स के साथ Admin RPC endpoint |
TENDERLY_PUBLIC_RPC_URL_{network_id} | Public RPC endpoint |
TENDERLY_CHAIN_ID_{network_id} | Chain ID |
TENDERLY_TESTNET_SLUG_{network_id} | अद्वितीय Virtual Environment slug |
BUILD_SLUG | वर्तमान build के लिए अद्वितीय identifier |