Skip to content

Commit 0061453

Browse files
authored
chore: Fisherman network deployments (#17737)
This PR contains the setup required for fisherman deployments
2 parents 6cdfeab + 2926525 commit 0061453

File tree

8 files changed

+254
-36
lines changed

8 files changed

+254
-36
lines changed
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
# Deploy fisherman network with specified L1 network
2+
# This workflow can be called directly or from other workflows
3+
name: Deploy Fisherman Network
4+
5+
on:
6+
workflow_call:
7+
inputs:
8+
l1_network:
9+
description: "L1 network (sepolia or mainnet)"
10+
required: true
11+
type: string
12+
semver:
13+
description: "Semver version (e.g., 2.3.4)"
14+
required: true
15+
type: string
16+
ref:
17+
description: "Git ref to checkout"
18+
required: false
19+
type: string
20+
workflow_dispatch:
21+
inputs:
22+
l1_network:
23+
description: "L1 network (sepolia or mainnet)"
24+
required: true
25+
type: choice
26+
options:
27+
- sepolia
28+
- mainnet
29+
semver:
30+
description: "Semver version (e.g., 2.3.4)"
31+
required: true
32+
type: string
33+
34+
concurrency:
35+
group: deploy-fisherman-network-${{ inputs.l1_network }}-${{ inputs.semver }}-${{ github.ref || github.ref_name }}
36+
cancel-in-progress: true
37+
38+
jobs:
39+
deploy-fisherman:
40+
runs-on: ubuntu-latest
41+
env:
42+
GOOGLE_APPLICATION_CREDENTIALS: /tmp/gcp-key.json
43+
steps:
44+
- name: Determine checkout ref
45+
id: checkout-ref
46+
run: |
47+
# Use inputs.ref if provided (workflow_call), otherwise use github.ref
48+
if [[ -n "${{ inputs.ref }}" ]]; then
49+
echo "ref=${{ inputs.ref }}" >> $GITHUB_OUTPUT
50+
else
51+
echo "ref=${{ github.ref }}" >> $GITHUB_OUTPUT
52+
fi
53+
54+
- name: Checkout
55+
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
56+
with:
57+
ref: ${{ steps.checkout-ref.outputs.ref }}
58+
fetch-depth: 0
59+
persist-credentials: false
60+
submodules: recursive # Initialize git submodules for l1-contracts dependencies
61+
62+
- name: Validate inputs
63+
run: |
64+
# Validate l1_network
65+
if [[ "${{ inputs.l1_network }}" != "sepolia" && "${{ inputs.l1_network }}" != "mainnet" ]]; then
66+
echo "Error: L1 network must be 'sepolia' or 'mainnet', got '${{ inputs.l1_network }}'"
67+
exit 1
68+
fi
69+
70+
# Validate environment file exists
71+
if [[ ! -f "spartan/environments/ignition-fisherman.env" ]]; then
72+
echo "Error: Environment file not found: spartan/environments/ignition-fisherman.env"
73+
exit 1
74+
fi
75+
76+
# Validate semver format
77+
if ! echo "${{ inputs.semver }}" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+(-.*)?$'; then
78+
echo "Error: Invalid semver format '${{ inputs.semver }}'. Expected format: X.Y.Z or X.Y.Z-suffix"
79+
exit 1
80+
fi
81+
82+
# Extract major version for v2 check
83+
major_version="${{ inputs.semver }}"
84+
major_version="${major_version%%.*}"
85+
echo "MAJOR_VERSION=$major_version" >> $GITHUB_ENV
86+
87+
- name: Store the GCP key in a file
88+
env:
89+
GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}
90+
run: |
91+
set +x
92+
umask 077
93+
printf '%s' "$GCP_SA_KEY" > "$GOOGLE_APPLICATION_CREDENTIALS"
94+
jq -e . "$GOOGLE_APPLICATION_CREDENTIALS" >/dev/null
95+
96+
- name: Setup GCP authentication
97+
run: |
98+
gcloud auth activate-service-account --key-file="$GOOGLE_APPLICATION_CREDENTIALS"
99+
100+
- name: Setup gcloud and install GKE auth plugin
101+
uses: google-github-actions/setup-gcloud@v2
102+
with:
103+
install_components: "gke-gcloud-auth-plugin"
104+
105+
- name: Setup Terraform
106+
uses: hashicorp/setup-terraform@633666f66e0061ca3b725c73b2ec20cd13a8fdd1
107+
with:
108+
terraform_version: "1.7.5"
109+
terraform_wrapper: false # Disable the wrapper that adds debug output, this messes with reading terraform output
110+
111+
- name: Install Foundry
112+
uses: foundry-rs/foundry-toolchain@v1
113+
114+
- name: Set environment variables
115+
run: |
116+
# Set environment variables for ignition-fisherman.env
117+
if [[ "${{ inputs.l1_network }}" == "sepolia" ]]; then
118+
echo "NETWORK=staging-ignition" >> $GITHUB_ENV
119+
echo "NAMESPACE=ignition-fisherman-sepolia" >> $GITHUB_ENV
120+
echo "ETHEREUM_CHAIN_ID=11155111" >> $GITHUB_ENV
121+
echo "L1_NETWORK=sepolia" >> $GITHUB_ENV
122+
echo "SNAPSHOT_BUCKET=testnet-bucket" >> $GITHUB_ENV
123+
echo "USE_NETWORK_CONFIG=true" >> $GITHUB_ENV
124+
elif [[ "${{ inputs.l1_network }}" == "mainnet" ]]; then
125+
echo "NETWORK=mainnet" >> $GITHUB_ENV
126+
echo "NAMESPACE=ignition-fisherman-mainnet" >> $GITHUB_ENV
127+
echo "ETHEREUM_CHAIN_ID=1" >> $GITHUB_ENV
128+
echo "L1_NETWORK=mainnet" >> $GITHUB_ENV
129+
echo "SNAPSHOT_BUCKET=mainnet-bucket" >> $GITHUB_ENV
130+
echo "USE_NETWORK_CONFIG=true" >> $GITHUB_ENV
131+
fi
132+
133+
- name: Deploy fisherman network
134+
env:
135+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
136+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
137+
GITHUB_TOKEN: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }}
138+
RUN_ID: ${{ github.run_id }}
139+
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
140+
GOOGLE_APPLICATION_CREDENTIALS: ${{ env.GOOGLE_APPLICATION_CREDENTIALS }}
141+
REF_NAME: "v${{ inputs.semver }}"
142+
GCP_PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
143+
AZTEC_DOCKER_IMAGE: "aztecprotocol/aztec:${{ inputs.semver }}"
144+
run: |
145+
echo "Deploying fisherman network on L1: ${{ inputs.l1_network }}"
146+
echo "Using image: $AZTEC_DOCKER_IMAGE"
147+
echo "Using branch/ref: ${{ steps.checkout-ref.outputs.ref }}"
148+
echo "Network: $NETWORK"
149+
echo "Namespace: $NAMESPACE"
150+
echo "Ethereum Chain ID: $ETHEREUM_CHAIN_ID"
151+
echo "L1 Network: $L1_NETWORK"
152+
echo "Snapshot Bucket: $SNAPSHOT_BUCKET"
153+
echo "Use Network Config: $USE_NETWORK_CONFIG"
154+
155+
cd spartan
156+
./scripts/install_deps.sh
157+
./scripts/network_deploy.sh ignition-fisherman
158+
159+
- name: Notify Slack on failure
160+
if: failure()
161+
env:
162+
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
163+
run: |
164+
if [ -n "${SLACK_BOT_TOKEN}" ]; then
165+
read -r -d '' data <<EOF || true
166+
{
167+
"channel": "#alerts-fisherman-${{ inputs.l1_network }}",
168+
"text": "Deploy Fisherman Network workflow FAILED for *${{ inputs.l1_network }}* (version ${{ inputs.semver }}): <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|View Run>"
169+
}
170+
EOF
171+
curl -X POST https://slack.com/api/chat.postMessage \
172+
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
173+
-H "Content-type: application/json" \
174+
--data "$data"
175+
fi

.github/workflows/deploy-staging-networks.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,14 @@ jobs:
101101
semver: ${{ needs.determine-semver.outputs.semver }}
102102
ref: ${{ needs.determine-semver.outputs.branch }}
103103
secrets: inherit
104+
105+
deploy-fisherman:
106+
# Depends on testnet until we are confident in concurrent deployments
107+
needs: [determine-semver, deploy-testnet]
108+
if: needs.determine-semver.outputs.should_deploy == 'true' && needs.determine-semver.outputs.major_version == '2'
109+
uses: ./.github/workflows/deploy-fisherman-network.yaml
110+
with:
111+
l1_network: sepolia
112+
semver: ${{ needs.determine-semver.outputs.semver }}
113+
ref: ${{ needs.determine-semver.outputs.branch }}
114+
secrets: inherit

spartan/aztec-keystore/templates/batchjob.yaml

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ spec:
108108
prover_ppk="$(cast wallet private-key --mnemonic "$MNEMONIC" --mnemonic-index "$prover_pub_idx")"
109109
prover_paddr="$(cast wallet address --private-key $prover_ppk)"
110110
111-
echo "Derived prover publisher key index $idx for node $i pulisher $j: $addr"
111+
echo "Derived prover publisher key index $prover_pub_idx for node $i pulisher $p: $prover_paddr"
112112
113113
# write keystore file-separated entries
114114
[[ $p -gt 0 ]] && echo '---' >> "$PROVER_PUB_KS_FILE"
@@ -161,27 +161,48 @@ spec:
161161
[ -f "$f" ] && cp "$f" "/shared/all-keystores/$(basename $f)"
162162
done
163163
164-
# Create single secret with all keystores
164+
# Create single secret with all keystores (only if directory exists)
165165
KEYSTORE_SECRET_NAME="{{ .Values.keystores.secretName | default (printf "%s-%s" .Release.Name "keystores") }}"
166-
kubectl -n "$K8S_NAMESPACE_NAME" create secret generic "$KEYSTORE_SECRET_NAME" \
167-
--from-file /shared/all-keystores \
168-
--dry-run=client -o yaml | kubectl apply -f -
169-
170-
# Keep the existing address configmaps
166+
if [ -d "/shared/all-keystores" ]; then
167+
echo "Creating keystore secret: $KEYSTORE_SECRET_NAME"
168+
kubectl -n "$K8S_NAMESPACE_NAME" create secret generic "$KEYSTORE_SECRET_NAME" \
169+
--from-file /shared/all-keystores \
170+
--dry-run=client -o yaml | kubectl apply -f -
171+
else
172+
echo "Skipping keystore secret creation: /shared/all-keystores not found"
173+
fi
174+
175+
# Keep the existing address configmaps (only if directories exist)
171176
ATTESTER_ADDRESS_CM_NAME="{{ .Values.attesters.addressConfigMap.name | default (printf "%s-%s" .Release.Name "attester-addresses") }}"
172-
kubectl -n "$K8S_NAMESPACE_NAME" create configmap "$ATTESTER_ADDRESS_CM_NAME" \
173-
--from-file /shared/attesters/addresses \
174-
--dry-run=client -o yaml | kubectl apply -f -
177+
if [ -d "/shared/attesters/addresses" ]; then
178+
echo "Creating attester address ConfigMap: $ATTESTER_ADDRESS_CM_NAME"
179+
kubectl -n "$K8S_NAMESPACE_NAME" create configmap "$ATTESTER_ADDRESS_CM_NAME" \
180+
--from-file /shared/attesters/addresses \
181+
--dry-run=client -o yaml | kubectl apply -f -
182+
else
183+
echo "Skipping attester address ConfigMap: /shared/attesters/addresses not found"
184+
fi
175185
176186
PUBLISHER_ADDRESS_CM_NAME="{{ .Values.publishers.addressConfigMap.name | default (printf "%s-%s" .Release.Name "publisher-addresses") }}"
177-
kubectl -n "$K8S_NAMESPACE_NAME" create configmap "$PUBLISHER_ADDRESS_CM_NAME" \
178-
--from-file /shared/publishers/addresses \
179-
--dry-run=client -o yaml | kubectl apply -f -
187+
if [ -d "/shared/publishers/addresses" ]; then
188+
echo "Creating publisher address ConfigMap: $PUBLISHER_ADDRESS_CM_NAME"
189+
kubectl -n "$K8S_NAMESPACE_NAME" create configmap "$PUBLISHER_ADDRESS_CM_NAME" \
190+
--from-file /shared/publishers/addresses \
191+
--dry-run=client -o yaml | kubectl apply -f -
192+
else
193+
echo "Skipping publisher address ConfigMap: /shared/publishers/addresses not found"
194+
fi
180195
181196
PROVER_PUBLISHER_ADDRESS_CM_NAME="{{ .Values.provers.addressConfigMap.name | default (printf "%s-%s" .Release.Name "prover-publisher-addresses") }}"
182-
kubectl -n "$K8S_NAMESPACE_NAME" create configmap "$PROVER_PUBLISHER_ADDRESS_CM_NAME" \
183-
--from-file /shared/prover-publishers/addresses \
184-
--dry-run=client -o yaml | kubectl apply -f -
197+
if [ -d "/shared/prover-publishers/addresses" ]; then
198+
echo "Creating prover publisher address ConfigMap: $PROVER_PUBLISHER_ADDRESS_CM_NAME"
199+
kubectl -n "$K8S_NAMESPACE_NAME" create configmap "$PROVER_PUBLISHER_ADDRESS_CM_NAME" \
200+
--from-file /shared/prover-publishers/addresses \
201+
--dry-run=client -o yaml | kubectl apply -f -
202+
else
203+
echo "Skipping prover publisher address ConfigMap: /shared/prover-publishers/addresses not found"
204+
fi
205+
185206
volumeMounts:
186207
- name: shared
187208
mountPath: /shared

spartan/metrics/values.tmp.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,11 @@ grafana:
119119
PRODUCTION_NAMESPACES_REGEX: "v2-testnet|staging-public|staging-ignition"
120120
NIGHTLY_NAMESPACES_REGEX: "next-rc-1"
121121
STAGING_PUBLIC_REGEX: "staging-public"
122-
STAGING_IGNITION_REGEX: "staging-ignition"
122+
STAGING_IGNITION_REGEX: "staging-ignition|ignition-fisherman-sepolia"
123123
NEXT_SCENARIO_REGEX: "v[0-9]+-scenario|next-scenario"
124124
NEXT_NEXT_REGEX: "next-net"
125125
TESTNET_NAMESPACES_REGEX: "testnet|v[0-9]+-testnet"
126-
MAINNET_NAMESPACES_REGEX: "mainnet|v[0-9]+-mainnet|ignition"
126+
MAINNET_NAMESPACES_REGEX: "mainnet|v[0-9]+-mainnet|ignition|ignition-fisherman-mainnet"
127127
SLACK_WEBHOOK_URL: "http://127.0.0.1" # dummy value
128128
SLACK_WEBHOOK_STAGING_PUBLIC_URL: "http://127.0.0.1" # dummy value
129129
SLACK_WEBHOOK_STAGING_IGNITION_URL: "http://127.0.0.1" # dummy value

spartan/scripts/deploy_network.sh

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ SALT=${SALT:-$(date +%s)}
2222
RESOURCE_PROFILE=$([[ "${CLUSTER}" == "kind" ]] && echo "dev" || echo "prod")
2323
BASE_STATE_PATH="${CLUSTER}/${NAMESPACE}"
2424

25+
# Don't try and retrieve contract addresses, instead allow deployed infra to read from network config
26+
USE_NETWORK_CONFIG=${USE_NETWORK_CONFIG:-false}
27+
2528
# GCP variables, unused if running on kind
2629
GCP_PROJECT_ID=${GCP_PROJECT_ID:-testnet-440309}
2730
GCP_REGION=${GCP_REGION:-us-west1-a}
@@ -279,13 +282,21 @@ if [[ "${VERIFY_CONTRACTS:-}" == "true" ]]; then
279282
${REPO_ROOT}/l1-contracts/scripts/verify-from-json.sh $HOME/l1-verify.json --api-key $ETHERSCAN_API_KEY
280283
fi
281284

282-
REGISTRY_ADDRESS=$(terraform -chdir="${DEPLOY_ROLLUP_CONTRACTS_DIR}" output -raw registry_address)
283-
SLASH_FACTORY_ADDRESS=$(terraform -chdir="${DEPLOY_ROLLUP_CONTRACTS_DIR}" output -raw slash_factory_address)
284-
FEE_ASSET_HANDLER_ADDRESS=$(terraform -chdir="${DEPLOY_ROLLUP_CONTRACTS_DIR}" output -raw fee_asset_handler_address)
285-
[[ -n "${REGISTRY_ADDRESS}" ]] || die "Failed to fetch registry_address"
286-
[[ -n "${SLASH_FACTORY_ADDRESS}" ]] || die "Failed to fetch slash_factory_address"
287-
[[ -n "${FEE_ASSET_HANDLER_ADDRESS}" ]] || die "Failed to fetch fee_asset_handler_address"
288-
log "Got rollup contract addresses"
285+
if [[ "${USE_NETWORK_CONFIG:-false}" != "true" ]]; then
286+
REGISTRY_ADDRESS=$(terraform -chdir="${DEPLOY_ROLLUP_CONTRACTS_DIR}" output -raw registry_address)
287+
SLASH_FACTORY_ADDRESS=$(terraform -chdir="${DEPLOY_ROLLUP_CONTRACTS_DIR}" output -raw slash_factory_address)
288+
FEE_ASSET_HANDLER_ADDRESS=$(terraform -chdir="${DEPLOY_ROLLUP_CONTRACTS_DIR}" output -raw fee_asset_handler_address)
289+
290+
[[ -n "${REGISTRY_ADDRESS}" ]] || die "Failed to fetch registry_address"
291+
[[ -n "${SLASH_FACTORY_ADDRESS}" ]] || die "Failed to fetch slash_factory_address"
292+
[[ -n "${FEE_ASSET_HANDLER_ADDRESS}" ]] || die "Failed to fetch fee_asset_handler_address"
293+
log "Got rollup contract addresses"
294+
else
295+
REGISTRY_ADDRESS=""
296+
SLASH_FACTORY_ADDRESS=""
297+
FEE_ASSET_HANDLER_ADDRESS=""
298+
fi
299+
289300

290301
# -------------------------------
291302
# Deploy Aztec infra

spartan/scripts/setup_gcp_secrets.sh

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ if [[ ! -f "$ENV_FILE" ]]; then
1313
fi
1414

1515
# Read the network name from the env file
16-
NETWORK=$(grep "^NETWORK=" "$ENV_FILE" | cut -d'=' -f2 || true)
1716
NETWORK=${NETWORK:-}
1817

18+
L1_NETWORK=${L1_NETWORK:-sepolia}
19+
1920
echo "Setting up GCP secrets for network: $NETWORK"
2021

2122
# Function to get secret from GCP Secret Manager
@@ -30,15 +31,15 @@ get_secret() {
3031
# Map of environment variables to GCP secret names
3132
# Generic mappings - network-specific secrets use ${NETWORK} in the name
3233
declare -A SECRET_MAPPINGS=(
33-
["ETHEREUM_RPC_URLS"]="sepolia-rpc-urls"
34-
["ETHEREUM_CONSENSUS_HOST_URLS"]="sepolia-consensus-host-urls"
35-
["ETHEREUM_CONSENSUS_HOST_API_KEYS"]="sepolia-consensus-host-api-keys"
36-
["ETHEREUM_CONSENSUS_HOST_API_KEY_HEADERS"]="sepolia-consensus-host-api-key-headers"
37-
["FUNDING_PRIVATE_KEY"]="sepolia-funding-private-key"
38-
["ROLLUP_DEPLOYMENT_PRIVATE_KEY"]="sepolia-labs-rollup-private-key"
34+
["ETHEREUM_RPC_URLS"]="${L1_NETWORK}-rpc-urls"
35+
["ETHEREUM_CONSENSUS_HOST_URLS"]="${L1_NETWORK}-consensus-host-urls"
36+
["ETHEREUM_CONSENSUS_HOST_API_KEYS"]="${L1_NETWORK}-consensus-host-api-keys"
37+
["ETHEREUM_CONSENSUS_HOST_API_KEY_HEADERS"]="${L1_NETWORK}-consensus-host-api-key-headers"
38+
["FUNDING_PRIVATE_KEY"]="${L1_NETWORK}-funding-private-key"
39+
["ROLLUP_DEPLOYMENT_PRIVATE_KEY"]="${L1_NETWORK}-labs-rollup-private-key"
3940
["OTEL_COLLECTOR_ENDPOINT"]="otel-collector-url"
4041
["ETHERSCAN_API_KEY"]="etherscan-api-key"
41-
["LABS_INFRA_MNEMONIC"]="sepolia-labs-${NETWORK}-mnemonic"
42+
["LABS_INFRA_MNEMONIC"]="${L1_NETWORK}-labs-${NETWORK}-mnemonic"
4243
["STORE_SNAPSHOT_URL"]="r2-account-id"
4344
["R2_ACCESS_KEY_ID"]="r2-access-key-id"
4445
["R2_SECRET_ACCESS_KEY"]="r2-secret-access-key"

spartan/terraform/deploy-aztec-infra/main.tf

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ locals {
7373
"global.aztecImage.repository" = local.aztec_image.repository
7474
"global.aztecImage.tag" = local.aztec_image.tag
7575
"global.useGcloudLogging" = true
76+
"global.customAztecNetwork.enabled" = var.NETWORK == null || var.NETWORK == ""
77+
"global.aztecNetwork" = var.NETWORK
7678
"global.customAztecNetwork.registryContractAddress" = var.REGISTRY_CONTRACT_ADDRESS
7779
"global.customAztecNetwork.slashFactoryContractAddress" = var.SLASH_FACTORY_CONTRACT_ADDRESS
7880
"global.customAztecNetwork.feeAssetHandlerContractAddress" = var.FEE_ASSET_HANDLER_CONTRACT_ADDRESS
@@ -130,7 +132,6 @@ locals {
130132
"validator-resources-${var.VALIDATOR_RESOURCE_PROFILE}.yaml"
131133
]
132134
custom_settings = {
133-
"global.customAztecNetwork.enabled" = true
134135
"validator.web3signerUrl" = "http://${var.RELEASE_PREFIX}-signer-web3signer.${var.NAMESPACE}.svc.cluster.local:9000/"
135136
"validator.mnemonic" = var.VALIDATOR_MNEMONIC
136137
"validator.mnemonicStartIndex" = var.VALIDATOR_MNEMONIC_START_INDEX
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
11
global:
22
aztecRollupVersion: "canonical"
3-
customAztecNetwork:
4-
enabled: true

0 commit comments

Comments
 (0)