Skip to content

Commit ac92668

Browse files
authored
feat: allow setting evm, sdk, comet versions (#116)
1 parent e35e422 commit ac92668

File tree

14 files changed

+212
-22
lines changed

14 files changed

+212
-22
lines changed

activities/builder/builder.go

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,16 +120,64 @@ func (a *Activity) createRepositoryIfNotExists(ctx context.Context) error {
120120
return nil
121121
}
122122

123+
// generateReplace generates a replace directive for a specific module version
124+
// This forces a specific version of a dependency
123125
func generateReplace(dependencies map[string]string, owner, repo, tag string) string {
124126
orig := dependencies[fmt.Sprintf("%s/%s", owner, repo)]
125127
return fmt.Sprintf("go mod edit -replace %s=github.com/%s/%s@%s", orig, owner, repo, tag)
126128
}
127129

128-
func generateTag(imageName, version, repo, sha string) string {
130+
func generateMultipleReplaces(req messages.BuildDockerImageRequest) string {
131+
var replaceCommands []string
132+
133+
// For cometbft builds, replace cometbft dependency in cosmos-sdk simapp
134+
if req.Repo == "cometbft" {
135+
replaceCommands = append(replaceCommands,
136+
generateReplace(dependencies, repoOwners[req.Repo], req.Repo, req.SHA))
137+
}
138+
139+
// For EVM builds with optional SDK version override
140+
if req.CosmosSdkSha != "" {
141+
replaceCommands = append(replaceCommands,
142+
generateReplace(dependencies, repoOwners["cosmos-sdk"], "cosmos-sdk", req.CosmosSdkSha))
143+
}
144+
145+
// For EVM builds with optional CometBFT version override
146+
if req.CometBFTSha != "" {
147+
replaceCommands = append(replaceCommands,
148+
generateReplace(dependencies, repoOwners["cometbft"], "cometbft", req.CometBFTSha))
149+
}
150+
151+
return strings.Join(replaceCommands, " && ")
152+
}
153+
154+
func generateTag(req messages.BuildDockerImageRequest) string {
155+
imageName := req.ImageConfig.Image
156+
version := req.ImageConfig.Version
157+
repo := req.Repo
158+
sha := req.SHA
159+
129160
if repo == "cometbft" {
130161
return fmt.Sprintf("%s-%s-%s-%s", imageName, version, repo, sha)
131162
}
132-
return fmt.Sprintf("%s-%s", repo, sha)
163+
164+
// For EVM builds, include SDK and CometBFT versions in tag if specified
165+
// This ensures different dependency versions get different image tags
166+
tag := fmt.Sprintf("%s-%s", repo, sha)
167+
if req.CosmosSdkSha != "" {
168+
// Sanitize the version string to be tag-friendly (remove @ and special chars)
169+
sdkVersion := strings.ReplaceAll(req.CosmosSdkSha, "@", "-")
170+
sdkVersion = strings.ReplaceAll(sdkVersion, "/", "-")
171+
tag = fmt.Sprintf("%s-sdk-%s", tag, sdkVersion)
172+
}
173+
if req.CometBFTSha != "" {
174+
// Sanitize the version string to be tag-friendly
175+
cometVersion := strings.ReplaceAll(req.CometBFTSha, "@", "-")
176+
cometVersion = strings.ReplaceAll(cometVersion, "/", "-")
177+
tag = fmt.Sprintf("%s-comet-%s", tag, cometVersion)
178+
}
179+
180+
return tag
133181
}
134182

135183
func (a *Activity) imageExistsInECR(ctx context.Context, tag string) (bool, error) {
@@ -165,7 +213,7 @@ func (a *Activity) imageExistsInECR(ctx context.Context, tag string) (bool, erro
165213
func (a *Activity) BuildDockerImage(ctx context.Context, req messages.BuildDockerImageRequest) (messages.BuildDockerImageResponse, error) {
166214
logger, _ := zap.NewDevelopment()
167215

168-
tag := generateTag(req.ImageConfig.Image, req.ImageConfig.Version, req.Repo, req.SHA)
216+
tag := generateTag(req)
169217

170218
var username, password string
171219
var err error
@@ -242,15 +290,22 @@ func (a *Activity) BuildDockerImage(ctx context.Context, req messages.BuildDocke
242290
buildArguments := make(map[string]string)
243291
buildArguments["GIT_SHA"] = tag
244292

293+
// Generate replace commands for go.mod modifications
294+
replaceCmd := generateMultipleReplaces(req)
295+
245296
// When load testing CometBFT, we build a simapp image using a specified SDK version, and then edit go.mod to replace
246297
// CometBFT with the specified commit SHA
247298
if req.Repo == "cometbft" {
248299
buildArguments["CHAIN_SRC"] = "https://github.com/cosmos/cosmos-sdk"
249300
buildArguments["CHAIN_TAG"] = req.ImageConfig.Version
250-
buildArguments["REPLACE_CMD"] = generateReplace(dependencies, repoOwners[req.Repo], req.Repo, req.SHA)
301+
buildArguments["REPLACE_CMD"] = replaceCmd
251302
} else {
252303
buildArguments["CHAIN_TAG"] = req.SHA
253304
buildArguments["CHAIN_SRC"] = fmt.Sprintf("https://github.com/%s/%s", repoOwners[req.Repo], req.Repo)
305+
// For EVM builds with optional replacements
306+
if replaceCmd != "" {
307+
buildArguments["REPLACE_CMD"] = replaceCmd
308+
}
254309
}
255310

256311
for k, v := range buildArguments {

frontend/src/api/workflowApi.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ export const convertToGrpcCreateWorkflowRequest = (request: TestnetWorkflowReque
9393
const grpcRequest = new CreateWorkflowRequest({
9494
repo: request.Repo || (request as any).repo,
9595
sha: request.SHA || (request as any).sha,
96+
cosmosSdkSha: request.CosmosSdkSha || (request as any).cosmos_sdk_sha || '',
97+
cometbftSha: request.CometBFTSha || (request as any).cometbft_sha || '',
9698
isEvmChain: request.IsEvmChain !== undefined ? request.IsEvmChain : (request as any).isEvmChain,
9799
chainConfig: chainConfig,
98100
runnerType: request.RunnerType || (request as any).runner_type,
@@ -141,6 +143,8 @@ const convertFromGrpcWorkflow = (workflow: any): WorkflowStatus => {
141143
config = {
142144
Repo: workflow.config.repo,
143145
SHA: workflow.config.sha,
146+
CosmosSdkSha: workflow.config.cosmosSdkSha || undefined,
147+
CometBFTSha: workflow.config.cometbftSha || undefined,
144148
IsEvmChain: workflow.config.isEvmChain,
145149
RunnerType: workflow.config.runnerType,
146150
LongRunningTestnet: workflow.config.longRunningTestnet,

frontend/src/gen/proto/ironbird_pb.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,20 @@ export class CreateWorkflowRequest extends Message<CreateWorkflowRequest> {
7272
*/
7373
baseMnemonic = "";
7474

75+
/**
76+
* Optional: cosmos-sdk version/SHA for EVM builds with replacements
77+
*
78+
* @generated from field: string cosmos_sdk_sha = 14;
79+
*/
80+
cosmosSdkSha = "";
81+
82+
/**
83+
* Optional: cometbft version/SHA for EVM builds with replacements
84+
*
85+
* @generated from field: string cometbft_sha = 15;
86+
*/
87+
cometbftSha = "";
88+
7589
constructor(data?: PartialMessage<CreateWorkflowRequest>) {
7690
super();
7791
proto3.util.initPartial(data, this);
@@ -92,6 +106,8 @@ export class CreateWorkflowRequest extends Message<CreateWorkflowRequest> {
92106
{ no: 11, name: "launch_load_balancer", kind: "scalar", T: 8 /* ScalarType.BOOL */ },
93107
{ no: 12, name: "catalyst_version", kind: "scalar", T: 9 /* ScalarType.STRING */ },
94108
{ no: 13, name: "base_mnemonic", kind: "scalar", T: 9 /* ScalarType.STRING */ },
109+
{ no: 14, name: "cosmos_sdk_sha", kind: "scalar", T: 9 /* ScalarType.STRING */ },
110+
{ no: 15, name: "cometbft_sha", kind: "scalar", T: 9 /* ScalarType.STRING */ },
95111
]);
96112

97113
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): CreateWorkflowRequest {

frontend/src/pages/CreateWorkflow.tsx

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,19 @@ const CreateWorkflow = () => {
450450
hasChanges = true;
451451
console.log("Setting SHA:", newFormData.SHA);
452452
}
453-
453+
454+
if (params.get('CosmosSdkSha') || params.get('cosmos_sdk_sha')) {
455+
newFormData.CosmosSdkSha = params.get('CosmosSdkSha') || params.get('cosmos_sdk_sha') || '';
456+
hasChanges = true;
457+
console.log("Setting CosmosSdkSha:", newFormData.CosmosSdkSha);
458+
}
459+
460+
if (params.get('CometBFTSha') || params.get('cometbft_sha')) {
461+
newFormData.CometBFTSha = params.get('CometBFTSha') || params.get('cometbft_sha') || '';
462+
hasChanges = true;
463+
console.log("Setting CometBFTSha:", newFormData.CometBFTSha);
464+
}
465+
454466
if (params.get('runnerType')) {
455467
newFormData.RunnerType = params.get('runnerType')!;
456468
hasChanges = true;
@@ -865,6 +877,8 @@ const CreateWorkflow = () => {
865877
const submissionData: TestnetWorkflowRequest = {
866878
Repo: formData.Repo,
867879
SHA: formData.SHA,
880+
CosmosSdkSha: formData.CosmosSdkSha,
881+
CometBFTSha: formData.CometBFTSha,
868882
ChainConfig: {
869883
Name: formData.ChainConfig.Name,
870884
Image: formData.ChainConfig.Image,
@@ -962,6 +976,8 @@ const CreateWorkflow = () => {
962976
return {
963977
Repo: repo,
964978
SHA: raw.sha || raw.SHA || '',
979+
CosmosSdkSha: raw.cosmos_sdk_sha || raw.CosmosSdkSha || '',
980+
CometBFTSha: raw.cometbft_sha || raw.CometBFTSha || '',
965981
IsEvmChain: isEvmChain,
966982
RunnerType: raw.runner_type || raw.RunnerType || '',
967983
ChainConfig: {
@@ -1182,6 +1198,40 @@ const CreateWorkflow = () => {
11821198
/>
11831199
</FormControl>
11841200

1201+
{formData.IsEvmChain && (
1202+
<>
1203+
<FormControl>
1204+
<FormLabel color="text">Cosmos SDK Version/SHA (Optional)</FormLabel>
1205+
<Input
1206+
value={formData.CosmosSdkSha || ''}
1207+
onChange={(e) => setFormData({ ...formData, CosmosSdkSha: e.target.value })}
1208+
bg="surface"
1209+
color="text"
1210+
borderColor="divider"
1211+
placeholder="e.g., v0.50.10 or commit SHA"
1212+
/>
1213+
<FormHelperText>
1214+
Optional: Specify a cosmos-sdk version/SHA to replace the default dependency in the EVM build
1215+
</FormHelperText>
1216+
</FormControl>
1217+
1218+
<FormControl>
1219+
<FormLabel color="text">CometBFT Version/SHA (Optional)</FormLabel>
1220+
<Input
1221+
value={formData.CometBFTSha || ''}
1222+
onChange={(e) => setFormData({ ...formData, CometBFTSha: e.target.value })}
1223+
bg="surface"
1224+
color="text"
1225+
borderColor="divider"
1226+
placeholder="e.g., v0.38.12 or commit SHA"
1227+
/>
1228+
<FormHelperText>
1229+
Optional: Specify a cometbft version/SHA to replace the default dependency in the EVM build
1230+
</FormHelperText>
1231+
</FormControl>
1232+
</>
1233+
)}
1234+
11851235
<FormControl isRequired>
11861236
<FormLabel color="text">Chain Name</FormLabel>
11871237
<Input

frontend/src/pages/WorkflowDetails.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,8 @@ const WorkflowDetails = () => {
151151
// Basic workflow parameters
152152
if (workflow.config.Repo) params.append('repo', workflow.config.Repo);
153153
if (workflow.config.SHA) params.append('sha', workflow.config.SHA);
154+
if (workflow.config.CosmosSdkSha) params.append('CosmosSdkSha', workflow.config.CosmosSdkSha);
155+
if (workflow.config.CometBFTSha) params.append('CometBFTSha', workflow.config.CometBFTSha);
154156
if (workflow.config.RunnerType) params.append('runnerType', workflow.config.RunnerType);
155157

156158
// IsEvmChain flag - always include it regardless of value

frontend/src/types/workflow.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ export interface TestnetWorkflowRequest {
7777
IsEvmChain: boolean;
7878
ChainConfig: ChainConfig;
7979
RunnerType: string;
80+
CosmosSdkSha?: string; // Optional: cosmos-sdk version/SHA for EVM builds
81+
CometBFTSha?: string; // Optional: cometbft version/SHA for EVM builds
8082
LoadTestSpec?: LoadTestSpec;
8183
EthereumLoadTestSpec?: LoadTestSpec;
8284
CosmosLoadTestSpec?: LoadTestSpec;

hack/evm.Dockerfile

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,20 @@ RUN git clone $CHAIN_SRC /src/app && \
1919
git checkout $CHAIN_TAG
2020

2121
WORKDIR /src/app/evmd
22-
RUN echo "$REPLACE_CMD" > replace_cmd.sh
23-
RUN chmod +x replace_cmd.sh && sh replace_cmd.sh
24-
RUN cat go.mod
25-
RUN go mod tidy
22+
RUN if [ -n "$REPLACE_CMD" ]; then \
23+
go mod tidy && \
24+
echo "After go mod tidy, applying replace commands:" && \
25+
echo "$REPLACE_CMD" > replace_cmd.sh && \
26+
chmod +x replace_cmd.sh && \
27+
sh replace_cmd.sh && \
28+
echo "Final go.mod:" && \
29+
cat go.mod && \
30+
echo "Updating go.sum with replaced modules:" && \
31+
go get ./... && \
32+
echo "Done updating go.sum"; \
33+
else \
34+
go mod tidy; \
35+
fi
2636
WORKDIR /src/app
2737

2838
RUN make build

hack/simapp.Dockerfile

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,20 @@ RUN git clone $CHAIN_SRC /src/app && \
1919
git checkout $CHAIN_TAG
2020

2121
WORKDIR /src/app/simapp
22-
RUN echo "$REPLACE_CMD" > replace_cmd.sh
23-
RUN chmod +x replace_cmd.sh && sh replace_cmd.sh
24-
RUN cat go.mod
25-
RUN go mod tidy
22+
RUN if [ -n "$REPLACE_CMD" ]; then \
23+
go mod tidy && \
24+
echo "After go mod tidy, applying replace commands:" && \
25+
echo "$REPLACE_CMD" > replace_cmd.sh && \
26+
chmod +x replace_cmd.sh && \
27+
sh replace_cmd.sh && \
28+
echo "Final go.mod:" && \
29+
cat go.mod && \
30+
echo "Updating go.sum with replaced modules:" && \
31+
go get ./... && \
32+
echo "Done updating go.sum"; \
33+
else \
34+
go mod tidy; \
35+
fi
2636
WORKDIR /src/app
2737

2838
RUN make build

messages/builder.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package messages
22

33
type BuildDockerImageRequest struct {
4-
Repo string
5-
SHA string
6-
ImageConfig ImageConfig
4+
Repo string
5+
SHA string
6+
ImageConfig ImageConfig
7+
CosmosSdkSha string // Optional: SHA/version to replace cosmos-sdk dependency
8+
CometBFTSha string // Optional: SHA/version to replace cometbft dependency
79
}
810

911
type ImageConfig struct {

messages/testnet.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ type TestnetWorkflowRequest struct {
8080
ChainConfig types.ChainsConfig
8181
RunnerType RunnerType
8282

83+
// Optional: SHA/version to replace cosmos-sdk dependency (for EVM chains)
84+
CosmosSdkSha string
85+
// Optional: SHA/version to replace cometbft dependency (for EVM chains)
86+
CometBFTSha string
87+
8388
EthereumLoadTestSpec *ctlttypes.LoadTestSpec
8489
CosmosLoadTestSpec *ctlttypes.LoadTestSpec
8590

0 commit comments

Comments
 (0)