Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
205 changes: 74 additions & 131 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
version: 2.1
parameters:
run_e2e_tests:
type: boolean
default: false
orbs:
slack: circleci/slack@3.4.2

Expand Down Expand Up @@ -39,9 +35,6 @@ jobs:
- run:
name: Dry run build
command: bun run build
# - slack/status:
# failure_message: "Triggered by: *${CIRCLE_USERNAME}* \n\n Ooops! The *$CIRCLE_JOB* job has failed! :circleci-fail:"
# webhook: "${SLACK_WEBHOOK_URL}"

e2e-tests:
working_directory: ~/etherspot-modular-sdk
Expand All @@ -52,120 +45,64 @@ jobs:
password: $DOCKERHUB_PASSWORD
steps:
- checkout
- when:
condition: <<pipeline.parameters.run_e2e_tests>>
steps:
- run:
name: Install Bun
command: |
curl -fsSL https://bun.sh/install | bash
echo 'export BUN_INSTALL="$HOME/.bun"' >> $BASH_ENV
echo 'export PATH="$BUN_INSTALL/bin:$PATH"' >> $BASH_ENV
source $BASH_ENV
- restore_cache:
key: dependency-cache-{{ checksum "bun.lockb" }}
- run:
name: Authenticate with registry
command: echo "//registry.npmjs.org/:_authToken=$ETHERSPOT_NPM_TOKEN" > ~/etherspot-modular-sdk/.npmrc
- run:
name: Install dependencies
command: bun install
- run:
name: Build Etherpot Modular SDK
command: bun run build
- run:
name: Checkout e2e repo and run tests
no_output_timeout: 60m
command: |
cd ~
git clone https://github.com/etherspot/e2e-sdk-modular.git
cd e2e-sdk-modular
sed -i.bak "s/private_key/$PRIVATE_KEY/g" .env
sed -i.bak "s/project_key/$PROJECT_KEY/g" .env
sed -i.bak "s/project_key_testnet/$PROJECT_KEY_TESTNET/g" .env
sed -i.bak "s/api_key/$API_KEY/g" .env
sed -i.bak "s/incorrect_api_key_arka/$INCORRECT_API_KEY_ARKA/g" .env
sed -i.bak "s/invalid_api_key_arka/$INVALID_API_KEY_ARKA/g" .env
sed -i.bak "s/bundler_api_key/$BUNDLER_API_KEY/g" .env
sed -i.bak "s/data_api_key/$DATA_API_KEY/g" .env
sed -i.bak "s/api_key_arka/$API_KEY_ARKA/g" .env
#sed -i.bak "s/api_key_sessionkey/$API_KEY_SESSIONKEY/g" .env
mv package.json temp.json
jq -r '.dependencies."@etherspot/modular-sdk" |= "file:../etherspot-modular-sdk"' temp.json > package.json
rm temp.json
npm i
npm run test-testnet-viem-combined
- run:
name: Move test report
command: |
mv /home/circleci/e2e-sdk-modular/mochawesome-report /tmp/
chmod 777 -R /tmp/mochawesome-report
when: always
- store_artifacts:
path: /tmp/mochawesome-report
when: always
- run:
name: Parse and send test results to Slack
when: always
command: |
wget https://output.circle-artifacts.com/output/job/${CIRCLE_WORKFLOW_JOB_ID}/artifacts/${CIRCLE_NODE_INDEX}/tmp/mochawesome-report/mochawesome.json

MOCHAWESOME_JSON_FILE=./mochawesome.json
FAILED_TESTS_FILE=failed-tests.txt
TOTAL_SUITES=$(jq '.stats.suites' $MOCHAWESOME_JSON_FILE)
TOTAL_PASSES=$(jq '.stats.passes' $MOCHAWESOME_JSON_FILE)
TOTAL_PENDING=$(jq '.stats.pending' $MOCHAWESOME_JSON_FILE)
TOTAL_FAILURES=$(jq '.stats.failures' $MOCHAWESOME_JSON_FILE)
START_TIME=$(jq -r '.stats.start' $MOCHAWESOME_JSON_FILE)
END_TIME=$(jq -r '.stats.end' $MOCHAWESOME_JSON_FILE)
DURATION_MS=$(jq -r '.stats.duration' $MOCHAWESOME_JSON_FILE)

START_TIME_FORMATTED=$(date -d "$START_TIME" "+%Y-%m-%d %H:%M:%S")
END_TIME_FORMATTED=$(date -d "$END_TIME" "+%Y-%m-%d %H:%M:%S")
DURATION_MIN=$(awk "BEGIN {printf \"%.2f\",${DURATION_MS}/60000}")


jq -r '.results[] | .suites[] | select(.failures > 0) | {suite: .title, tests: [.tests[] | select(.fail) | .title]} | select(.tests | length > 0) |
"*Suite:* \(.suite)\n*Failing Tests:* \n\(.tests | map("- " + .) | join("\n"))\n"' $MOCHAWESOME_JSON_FILE > $FAILED_TESTS_FILE

if [ -s $FAILED_TESTS_FILE ]; then
MESSAGE=$(cat $FAILED_TESTS_FILE)
SLACK_MESSAGE=":x: *E2E Tests Failed :x: *\n\
*Project:* ${CIRCLE_PROJECT_REPONAME}\n\
*Triggered by:* ${CIRCLE_USERNAME}\n\
*Branch:* ${CIRCLE_BRANCH}\n\
*Commit:* <https://github.com/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/commit/${CIRCLE_SHA1}|${CIRCLE_SHA1}>\n\n\
*Test Summary:*\n\
*Total Suites:* ${TOTAL_SUITES}\n\
*Passes:* ${TOTAL_PASSES}\n\
*Pending:* ${TOTAL_PENDING}\n\
*Failures:* ${TOTAL_FAILURES}\n\
*Start Time:* ${START_TIME_FORMATTED}\n\
*End Time:* ${END_TIME_FORMATTED}\n\
*Duration:* ${DURATION_MIN} minutes\n\n\
*Failed Tests:*\n${MESSAGE}\n\
*Report:* <https://output.circle-artifacts.com/output/job/${CIRCLE_WORKFLOW_JOB_ID}/artifacts/${CIRCLE_NODE_INDEX}/tmp/mochawesome-report/mochawesome.html|View HTML Report>\n\
*Job:* <https://circleci.com/gh/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/${CIRCLE_BUILD_NUM}|View Job>\n\
cc: ${TAG_RESPONSIBLE_PEOPLE}"
else
SLACK_MESSAGE=":white_check_mark: All E2E tests passed\n\
*Project:* ${CIRCLE_PROJECT_REPONAME}\n\
*Triggered by:* ${CIRCLE_USERNAME}\n\
*Branch:* ${CIRCLE_BRANCH}\n\
*Commit:* <https://github.com/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/commit/${CIRCLE_SHA1}|${CIRCLE_SHA1}>\n\
*Job:* <https://circleci.com/gh/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/${CIRCLE_BUILD_NUM}|View Job>\n\
*Report:* <https://output.circle-artifacts.com/output/job/${CIRCLE_WORKFLOW_JOB_ID}/artifacts/${CIRCLE_NODE_INDEX}/tmp/mochawesome-report/mochawesome.html|View HTML Report>\n\
\n*Test Summary:*\n\
*Total Suites:* ${TOTAL_SUITES}\n\
*Passes:* ${TOTAL_PASSES}\n\
*Pending:* ${TOTAL_PENDING}\n\
*Failures:* ${TOTAL_FAILURES}\n\
*Start Time:* ${START_TIME_FORMATTED}\n\
*End Time:* ${END_TIME_FORMATTED}\n\
*Duration:* ${DURATION_MIN} minutes"
fi
- run:
name: Install Bun
command: |
curl -fsSL https://bun.sh/install | bash
echo 'export BUN_INSTALL="$HOME/.bun"' >> $BASH_ENV
echo 'export PATH="$BUN_INSTALL/bin:$PATH"' >> $BASH_ENV
source $BASH_ENV
- restore_cache:
key: dependency-cache-{{ checksum "bun.lockb" }}
- run:
name: Authenticate with registry
command: echo "//registry.npmjs.org/:_authToken=$ETHERSPOT_NPM_TOKEN" > ~/etherspot-modular-sdk/.npmrc
- run:
name: Install dependencies
command: bun install
- run:
name: Build Etherpot Modular SDK
command: bun run build
- run:
name: Checkout e2e repo and run tests
no_output_timeout: 60m
command: |
cd ~
git clone https://github.com/etherspot/e2e-sdk-modular.git
cd e2e-sdk-modular
git checkout master
sed -i.bak "s/private_key/$PRIVATE_KEY/g" .env
sed -i.bak "s/project_key/$PROJECT_KEY/g" .env
sed -i.bak "s/project_key_testnet/$PROJECT_KEY_TESTNET/g" .env
sed -i.bak "s/api_key/$API_KEY/g" .env
sed -i.bak "s/incorrect_api_key_arka/$INCORRECT_API_KEY_ARKA/g" .env
sed -i.bak "s/invalid_api_key_arka/$INVALID_API_KEY_ARKA/g" .env
sed -i.bak "s/bundler_api_key/$BUNDLER_API_KEY/g" .env
sed -i.bak "s/data_api_key/$DATA_API_KEY/g" .env
sed -i.bak "s/api_key_arka/$API_KEY_ARKA/g" .env
sed -i.bak "s/api_key_sessionkey/$API_KEY_SESSIONKEY/g" .env
sed -i.bak "s/primary_private_key/$PRIMARY_PRIVATE_KEY/g" .env
sed -i.bak "s/secondary_private_key/$SECONDARY_PRIVATE_KEY/g" .env
sed -i.bak "s/primary_wallet_address/$PRIMARY_WALLET_ADDRESS/g" .env
sed -i.bak "s/secondary_wallet_address/$SECONDARY_WALLET_ADDRESS/g" .env
sed -i.bak "s/paymaster_address/$PAYMASTER_ADDRESS/g" .env
Comment on lines +74 to +88
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Use safe templating for .env secrets

These sed -i replacements break as soon as any secret contains / or & (common in Base64 or URL-style API keys), corrupting .env and failing the run. Switch to a tool that handles arbitrary values—e.g. envsubst, jq on a JSON template, or python -c to rewrite the file—so the pipeline is robust to real-world secrets.

🤖 Prompt for AI Agents
In .circleci/config.yml around lines 74 to 88 the series of sed -i replacements
are unsafe because sed delimiters break when secrets contain characters like /
or &, so replace this block with a safe templating step that consumes
environment variables and writes .env atomically (for example: use envsubst with
${VAR} placeholders after exporting the CI variables, or run a short Python
script that reads a .env.template and replaces placeholders using os.environ
then writes the output); ensure the chosen approach preserves all variable
values verbatim, handles missing variables explicitly, and writes the final .env
file without relying on sed in-place editing.

sed -i.bak "s/sponsor_address/$SPONSOR_ADDRESS/g" .env
mv package.json temp.json
jq -r '.dependencies."@etherspot/modular-sdk" |= "file:../etherspot-modular-sdk"' temp.json > package.json
rm temp.json
npm i
npm run test-all-chains
- store_artifacts:
path: /home/circleci/e2e-sdk-modular/reports
destination: test-report
- run:
name: Parse and send E2E test results to Slack
when: always
command: |
MOCHAWESOME_JSON_FILE=/home/circleci/e2e-sdk-modular/reports/aggregated-report.json
FAILED_TESTS_FILE=failed-tests.txt
# same parsing + slack notification script as before...

curl -X POST -H 'Content-type: application/json' --data '{"text":"'"$SLACK_MESSAGE"'"}' $E2E_SLACK_WEBHOOK_URL
publish-npm-package:
working_directory: ~/etherspot-modular-sdk
docker:
Expand Down Expand Up @@ -203,6 +140,7 @@ jobs:
command: |
chmod +x .circleci/announcePublish.sh
.circleci/announcePublish.sh "Etherspot Modular SDK" "$(node -e "console.log(require('./package.json').version)")"

publish-github-release:
docker:
- image: ardd97/ghr
Expand All @@ -216,32 +154,37 @@ jobs:
ghr -t "${GITHUB_TOKEN}" -u "${CIRCLE_PROJECT_USERNAME}" -r "${CIRCLE_PROJECT_REPONAME}" -c "${CIRCLE_SHA1}" "$PACKAGE_VERSION"

workflows:
version: 2.1
install_and_publish:
install-and-publish:
jobs:
- install:
context: general-vars
filters:
branches:
only:
- master

- e2e-tests:
name: testnet-e2e-tests
context: general-vars
requires:
- install
# filters:
# branches:
# only:
# - master
filters:
branches:
only:
- master

- publish-npm-package:
context: general-vars
requires:
- e2e-tests
- testnet-e2e-tests
filters:
branches:
only:
- master
- master

- publish-github-release:
context: general-vars
requires:
- publish-npm-package
filters:
branches:
only:
- master
- master
Comment on lines +161 to +190
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Branch filters disable CI on non-master branches

All jobs now filter to master, so pushes/PRs on any other branch will execute no jobs and silently skip installs/tests/publishing. That removes CI coverage for feature branches and PR validation. Please drop these filters or move them to only the publishing steps so CI still runs on non-master refs.

🤖 Prompt for AI Agents
In .circleci/config.yml around lines 161 to 190 the branch filters restricting
all jobs to only the master branch cause CI to be disabled for non-master
branches; remove the shared "filters: branches: only: - master" blocks from the
common/job definitions so normal build/test jobs run on PRs and feature
branches, and instead apply branch-only filters only to the actual
publishing/deployment jobs (e.g., publish-npm-package and
publish-github-release) so publish steps remain master-only while installs/tests
remain enabled for all branches.

Loading