version: 2.1 parameters: run_flaky_tests: type: boolean default: false orbs: browser-tools: circleci/browser-tools@1.4.4 win: circleci/windows@5.0 jobs: build: docker: - image: cimg/node:20.0.0-browsers resource_class: xlarge working_directory: ~/remix-project steps: - checkout - restore_cache: keys: - v1-deps-{{ checksum "yarn.lock" }} - run: yarn - save_cache: key: v1-deps-{{ checksum "yarn.lock" }} paths: - node_modules - run: name: Build command: | if [ "${CIRCLE_BRANCH}" == "master" ]; then NX_BIN_URL=http://127.0.0.1:8080/assets/js/soljson NX_WASM_URL=http://127.0.0.1:8080/assets/js/soljson NX_NPM_URL=http://127.0.0.1:9090/ yarn build:production else NX_BIN_URL=http://127.0.0.1:8080/assets/js/soljson NX_WASM_URL=http://127.0.0.1:8080/assets/js/soljson NX_NPM_URL=http://127.0.0.1:9090/ yarn build fi - run: yarn run build:e2e - run: grep -ir "[0-9]+commit" apps/* libs/* --include \*.ts --include \*.tsx --include \*.json > soljson-versions.txt - restore_cache: keys: - soljson-v7-{{ checksum "soljson-versions.txt" }} - run: yarn run downloadsolc_assets_e2e - save_cache: key: soljson-v7-{{ checksum "soljson-versions.txt" }} paths: - dist/apps/remix-ide/assets/js/soljson - run: mkdir persist && zip -0 -r persist/dist.zip dist - persist_to_workspace: root: . paths: - "persist" build-desktop: docker: - image: cimg/node:20.0.0-browsers resource_class: xlarge working_directory: ~/remix-project steps: - checkout - restore_cache: keys: - v1-deps-{{ checksum "yarn.lock" }} - run: yarn - save_cache: key: v1-deps-{{ checksum "yarn.lock" }} paths: - node_modules - run: name: Build command: | yarn build:desktop - run: mkdir persist && zip -0 -r persist/desktopbuild.zip dist/apps/remix-ide - persist_to_workspace: root: . paths: - "persist" build-plugin: docker: - image: cimg/node:20.0.0-browsers resource_class: xlarge working_directory: ~/remix-project parameters: plugin: type: string steps: - checkout - restore_cache: keys: - v1-deps-{{ checksum "yarn.lock" }} - run: yarn - save_cache: key: v1-deps-{{ checksum "yarn.lock" }} paths: - node_modules - run: yarn nx build << parameters.plugin >> --configuration=production - run: mkdir persist && zip -0 -r persist/plugin-<< parameters.plugin >>.zip dist - persist_to_workspace: root: . paths: - "persist" test-remixdesktop-linux: machine: image: ubuntu-2004:current resource_class: xlarge working_directory: ~/remix-project steps: - run: ldd --version - checkout - attach_workspace: at: . - run: unzip ./persist/desktopbuild.zip - run: command: | node -v mkdir apps/remixdesktop/build cp -r dist/apps/remix-ide apps/remixdesktop/build cd apps/remixdesktop/ yarn add node-pty yarn --ignore-optional yarn add @remix-project/remix-ws-templates yarn dist yarn run selenium-install-linux - run: name: "Run selenium" command: | cd apps/remixdesktop/ yarn run selenium-linux background: true - run: name: "Run tests" command: | cd apps/remixdesktop/ yarn run build:e2e && yarn run test:app:linux build-remixdesktop-linux: machine: image: ubuntu-2004:current resource_class: xlarge working_directory: ~/remix-project steps: - run: ldd --version - checkout - attach_workspace: at: . - run: unzip ./persist/desktopbuild.zip - run: command: | node -v mkdir apps/remixdesktop/build cp -r dist/apps/remix-ide apps/remixdesktop/build cd apps/remixdesktop/ yarn add node-pty yarn --ignore-optional yarn add @remix-project/remix-ws-templates yarn dist rm -rf release/*-unpacked - save_cache: key: remixdesktop-linux-deps-{{ checksum "apps/remixdesktop/yarn.lock" }} paths: - apps/remixdesktop/node_modules - run: name: "remove unnecessary files" command: | rm -rf ~/remix-project/apps/remixdesktop/release/.icon* rm -rf ~/remix-project/apps/remixdesktop/release/builder* - store_artifacts: path: apps/remixdesktop/release/ destination: remixdesktop-linux - persist_to_workspace: root: apps/remixdesktop paths: - "release" build-remixdesktop-windows: executor: name: win/default # executor type size: xlarge # can be medium, large, xlarge, 2xlarge shell: bash.exe working_directory: ~/remix-project steps: - checkout - attach_workspace: at: . - run: unzip ./persist/desktopbuild.zip - restore_cache: key: node-20-windows-v3 - run: command: | nvm install 20.0.0 nvm use 20.0.0 node -v npx -v npm install --global yarn yarn -v - save_cache: key: node-20-windows-v3 paths: - /ProgramData/nvm/v20.0.0 - restore_cache: keys: - remixdesktop-windows-deps-{{ checksum "apps/remixdesktop/yarn.lock" }} - run: command: | mkdir apps/remixdesktop/build cp -r dist/apps/remix-ide apps/remixdesktop/build cd apps/remixdesktop/ yarn yarn dist rm -rf release/*-unpacked - save_cache: key: remixdesktop-windows-deps-{{ checksum "apps/remixdesktop/yarn.lock" }} paths: - apps/remixdesktop/node_modules - persist_to_workspace: root: apps/remixdesktop paths: - "release" test-remixdesktop-windows: executor: name: win/default # executor type size: xlarge # can be medium, large, xlarge, 2xlarge shell: bash.exe working_directory: ~/remix-project steps: - checkout - attach_workspace: at: . - run: unzip ./persist/desktopbuild.zip - restore_cache: key: node-20-windows-v3 - run: command: | nvm install 20.0.0 nvm use 20.0.0 node -v npx -v npm install --global yarn yarn -v - run: name: start selenium command: | cd "apps/remixdesktop/" yarn -v shell: powershell.exe - save_cache: key: node-20-windows-v3 paths: - /ProgramData/nvm/v20.0.0 - restore_cache: keys: - remixdesktop-windows-deps-{{ checksum "apps/remixdesktop/yarn.lock" }} - run: command: | mkdir apps/remixdesktop/build cp -r dist/apps/remix-ide apps/remixdesktop/build cd apps/remixdesktop/ nvm use 20.0.0 node -v yarn yarn run selenium-install-win - run: name: start selenium command: | cd "apps/remixdesktop/" yarn -v yarn run selenium-win shell: powershell.exe - run: name: start tests command: | cd "apps/remixdesktop/" yarn -v sleep 15 yarn run test:app:win shell: powershell.exe # see https://docs.digicert.com/en/software-trust-manager/ci-cd-integrations/script-integrations/github-integration-ksp.html sign-remixdesktop-windows: executor: win/default # executor type working_directory: ~/remix-project steps: - checkout - attach_workspace: at: . - run: name: "Certificate-Setup" shell: powershell.exe command: | cd C:\ New-Item C:\CERT_FILE.p12.b64 Set-Content -Path C:\CERT_FILE.p12.b64 -Value $env:SM_CLIENT_CERT_FILE_B64 certutil -decode CERT_FILE.p12.b64 Certificate_pkcs12.p12 cat Certificate_pkcs12.p12 - restore_cache: name: Restore smtools-windows-x64.msi keys: - dl-smtools-windows-x64.msi - run: name: "Client-Tool-Download" shell: powershell.exe command: | cd C:\ if (Test-Path 'c:\smtools-windows-x64.msi') { echo 'File exists, skipping download...' } else { echo 'Downloading smtools-windows-x64.msi ...' curl.exe -X GET https://one.digicert.com/signingmanager/api-ui/v1/releases/smtools-windows-x64.msi/download -H "x-api-key:$env:SM_API_KEY" -o smtools-windows-x64.msi } - save_cache: key: dl-smtools-windows-x64.msi paths: - c:\smtools-windows-x64.msi - run: name: "Client-Tool-Setup" shell: powershell.exe command: | cd C:\ msiexec.exe /i smtools-windows-x64.msi /quiet /qn | Wait-Process & $env:SSM\smksp_cert_sync.exe & $env:SSM\smctl.exe healthcheck - run: name: "Find Signtool" shell: powershell.exe command: | Get-ChildItem -Path 'C:\Program Files (x86)\Windows Kits\10\App Certification Kit' -Filter signtool.exe -Recurse - run: name: read env shell: powershell.exe command: | # Specify the path to your package.json file $packageJsonPath = "C:\Users\circleci\remix-project\apps\remixdesktop\package.json" # Check if the file exists if (Test-Path $packageJsonPath) { # Read the content of the package.json file $packageJsonContent = Get-Content $packageJsonPath -Raw | ConvertFrom-Json # Check if the 'version' field exists in the package.json if ($packageJsonContent.'version' -ne $null) { # Store the version value in an environment variable $version = $packageJsonContent.version $file = "C:\Users\circleci\remix-project\release\Remix-Desktop-Setup-$($version).exe" Write-Host "Version $(file) stored in PACKAGE_VERSION environment variable." "Set-Variable -Name 'PACKAGE_VERSION' -Value '$file' -Scope Global" > SetEnvVars.ps1 dir Env: } else { Write-Host "Error: 'version' field not found in package.json." } } else { Write-Host "Error: package.json file not found at $packageJsonPath." } - run: name: "Signtool-Signing" shell: powershell.exe command: | . .\SetEnvVars.ps1 dir Env: & $env:Signtool sign /sha1 $env:SM_CODE_SIGNING_CERT_SHA1_HASH /tr http://timestamp.digicert.com /td SHA256 /fd SHA256 $PACKAGE_VERSION - run: name: "Signtool-Verification" shell: powershell.exe command: | . .\SetEnvVars.ps1 $verify_output = $(& $env:Signtool verify /v /pa $PACKAGE_VERSION) echo ${verify_output} if (!$verify_output.Contains("Number of files successfully Verified: 1")) { echo 'Verification failed' exit 1 } - run: name: "remove unnecessary files" shell: bash.exe command: | rm -rf ~/remix-project/release/.icon* rm -rf ~/remix-project/release/builder* - store_artifacts: path: ~/remix-project/release/ destination: remixdesktop-windows - persist_to_workspace: root: ~/remix-project/ paths: - "release" environment: SM_CLIENT_CERT_FILE: 'C:\Certificate_pkcs12.p12' Signtool: 'C:\Program Files (x86)\Windows Kits\10\App Certification Kit\signtool.exe' SSM: 'C:\Program Files\DigiCert\DigiCert One Signing Manager Tools' build-remixdesktop-mac: macos: xcode: 14.2.0 resource_class: macos.m1.large.gen1 working_directory: ~/remix-project steps: - checkout - attach_workspace: at: . - run: name: Install Apple Certificate command: | echo $APPLE_CERTIFICATE_BASE64 | base64 --decode > /tmp/certificate.p12 security create-keychain -p ci-password build.keychain security default-keychain -s build.keychain security unlock-keychain -p ci-password build.keychain curl -o DeveloperIDG2CA.cer "https://www.apple.com/certificateauthority/DeveloperIDG2CA.cer" sudo security import DeveloperIDG2CA.cer -k /Library/Keychains/System.keychain -T /usr/bin/codesign sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain DeveloperIDG2CA.cer security import /tmp/certificate.p12 -k build.keychain -P $APPLE_CERTIFICATE_PASSWORD -T /usr/bin/codesign security set-key-partition-list -S apple-tool:,apple: -s -k ci-password build.keychain security find-identity -v -p codesigning - run: unzip ./persist/desktopbuild.zip - run: command: | ls -la dist/apps/remix-ide nvm install 20.0.0 nvm use 20.0.0 - restore_cache: keys: - remixdesktop-deps-mac-{{ checksum "apps/remixdesktop/yarn.lock" }} - run: command: | nvm use 20.0.0 cd apps/remixdesktop && yarn yarn add @remix-project/remix-ws-templates - save_cache: key: remixdesktop-deps-mac-{{ checksum "apps/remixdesktop/yarn.lock" }} paths: - apps/remixdesktop/node_modules # use USE_HARD_LINK=false https://github.com/electron-userland/electron-builder/issues/3179 - run: command: | nvm use 20 mkdir apps/remixdesktop/build cp -r dist/apps/remix-ide apps/remixdesktop/build cd apps/remixdesktop yarn - run: command: | nvm use 20 cd apps/remixdesktop yarn installRipGrepMacOXarm64 PUBLISH_FOR_PULL_REQUEST='false' USE_HARD_LINKS=false yarn dist --arm64 - run: command: | nvm use 20 cd apps/remixdesktop yarn installRipGrepMacOXx64 PUBLISH_FOR_PULL_REQUEST='false' USE_HARD_LINKS=false yarn dist --x64 - run: name: Notarize the app command: | brew install jq cd apps/remixdesktop zsh notarizedmg.sh - run: name: "remove unnecessary files" command: | rm -rf ~/remix-project/apps/remixdesktop/release/.icon* rm -rf ~/remix-project/apps/remixdesktop/release/builder* rm -rf ~/remix-project/apps/remixdesktop/release/*.blockmap rm -rf ~/remix-project/apps/remixdesktop/release/_.* - store_artifacts: path: apps/remixdesktop/release/ destination: remixdesktop-mac - persist_to_workspace: root: apps/remixdesktop paths: - "release" uploadartifacts: docker: - image: cimg/node:20.0.0-browsers resource_class: xlarge working_directory: ~/remix-project steps: - checkout - attach_workspace: at: . - restore_cache: keys: - v1-deps-{{ checksum "yarn.lock" }} - run: yarn - run: name: "Upload Artifacts" command: npx ts-node apps/remix-ide/ci/update_desktop_release_assets.ts lint: docker: - image: cimg/node:20.0.0-browsers resource_class: xlarge working_directory: ~/remix-project steps: - checkout - restore_cache: keys: - v1-deps-{{ checksum "yarn.lock" }} - run: yarn - run: yarn nx graph --file=./projects.json - run: name: Remix Libs Linting command: node ./apps/remix-ide/ci/lint-targets.js remix-libs: docker: - image: cimg/node:20.0.0-browsers resource_class: xlarge working_directory: ~/remix-project steps: - checkout - attach_workspace: at: . - restore_cache: keys: - v1-deps-{{ checksum "yarn.lock" }} - run: yarn --version - run: yarn - run: yarn build:libs - run: cd dist/libs/remix-tests && yarn - run: cd dist/libs/remix-tests && yarn add @remix-project/remix-url-resolver ../../libs/remix-url-resolver - run: cd dist/libs/remix-tests && yarn add @remix-project/remix-lib ../../libs/remix-lib - run: cd dist/libs/remix-tests && yarn add @remix-project/remix-solidity ../../libs/remix-solidity - run: cd dist/libs/remix-tests && yarn add @remix-project/remix-simulator ../../libs/remix-simulator - run: cd dist/libs/remix-tests && ./bin/remix-tests ./../../../libs/remix-tests/tests/examples_0/assert_ok_test.sol - run: node dist/libs/remix-tests/bin/remix-tests ./libs/remix-tests/tests/examples_0/assert_ok_test.sol - run: yarn run test:libs remix-ide-browser: docker: - image: cimg/node:20.0.0-browsers resource_class: xlarge working_directory: ~/remix-project parameters: browser: type: string script: type: string job: type: string jobsize: type: string parallelism: 10 steps: - when: condition: equal: [ "chrome", << parameters.browser >> ] steps: - browser-tools/install-browser-tools: install-firefox: false install-chrome: true install-chromedriver: false install-geckodriver: false - install-chromedriver-custom-linux - run: google-chrome --version - run: chromedriver --version - run: rm LICENSE.chromedriver 2> /dev/null || true - when: condition: equal: [ "firefox", << parameters.browser >> ] steps: - browser-tools/install-browser-tools: install-firefox: true install-chrome: false install-geckodriver: true install-chromedriver: false - run: firefox --version - run: geckodriver --version - checkout - attach_workspace: at: . - run: unzip ./persist/dist.zip - run: yarn install --cwd ./apps/remix-ide-e2e --modules-folder ../../node_modules - run: mkdir node_modules/hardhat && wget https://unpkg.com/hardhat/console.sol -O node_modules/hardhat/console.sol - run: ls -la ./dist/apps/remix-ide/assets/js - run: yarn run selenium-install --singleDriverInstall=firefox - when: condition: equal: [ "chrome", << parameters.browser >> ] steps: - run: mkdir -p node_modules/selenium-standalone/.selenium/chromedriver/latest-x64/ - run: cp ~/bin/chromedriver /home/circleci/remix-project/node_modules/selenium-standalone/.selenium/chromedriver/latest-x64/ - run: name: run selenium command: yarn selenium-standalone start --singleDriverStart=chrome background: true - when: condition: equal: [ "firefox", << parameters.browser >> ] steps: - run: name: run selenium command: yarn selenium-standalone start --singleDriverStart=firefox background: true - run: ./apps/remix-ide/ci/<< parameters.script >> << parameters.browser >> << parameters.jobsize >> << parameters.job >> - store_test_results: path: ./reports/tests - store_artifacts: path: ./reports/screenshots tests-passed: machine: image: ubuntu-2004:202010-01 steps: - run: echo done remix-test-plugins: docker: - image: cimg/node:20.0.0-browsers resource_class: xlarge working_directory: ~/remix-project parameters: plugin: type: string parallelism: type: integer default: 1 parallelism: << parameters.parallelism >> steps: - browser-tools/install-browser-tools: install-firefox: false install-chrome: true install-geckodriver: false install-chromedriver: false - install-chromedriver-custom-linux - run: google-chrome --version - run: chromedriver --version - run: rm LICENSE.chromedriver 2> /dev/null || true - checkout - attach_workspace: at: . - run: unzip ./persist/dist.zip - run: unzip ./persist/plugin-<< parameters.plugin >>.zip - run: yarn install --cwd ./apps/remix-ide-e2e --modules-folder ../../node_modules - run: yarn run selenium-install --singleDriverInstall=firefox - run: mkdir -p node_modules/selenium-standalone/.selenium/chromedriver/latest-x64/ - run: cp ~/bin/chromedriver /home/circleci/remix-project/node_modules/selenium-standalone/.selenium/chromedriver/latest-x64/ - run: name: Start Selenium command: yarn run selenium --singleDriverStart=chrome background: true - run: ./apps/remix-ide/ci/browser_test_plugin.sh << parameters.plugin >> - store_test_results: path: ./reports/tests - store_artifacts: path: ./reports/screenshots predeploy: docker: - image: cimg/node:20.0.0-browsers resource_class: xlarge working_directory: ~/remix-project steps: - checkout - restore_cache: keys: - v1-deps-{{ checksum "yarn.lock" }} - run: yarn - save_cache: key: v1-deps-{{ checksum "yarn.lock" }} paths: - node_modules - run: yarn build:production - run: mkdir persist && zip -0 -r persist/predeploy.zip dist - persist_to_workspace: root: . paths: - "persist" deploy-build: docker: - image: cimg/node:20.0.0-browsers resource_class: xlarge environment: COMMIT_AUTHOR_EMAIL: "yann@ethereum.org" COMMIT_AUTHOR: "Circle CI" working_directory: ~/remix-project parameters: script: type: string steps: - checkout - attach_workspace: at: . - run: unzip ./persist/predeploy.zip - run: ./apps/remix-ide/ci/deploy_from_travis_remix-<< parameters.script >>.sh workflows: run_flaky_tests: when: << pipeline.parameters.run_flaky_tests >> jobs: - build - remix-ide-browser: requires: - build matrix: parameters: browser: ["chrome", "firefox"] script: ["flaky.sh"] job: ["nogroup"] jobsize: ["1"] build_all: unless: << pipeline.parameters.run_flaky_tests >> jobs: - build - build-desktop: filters: branches: only: ['master', /.*desktop.*/] - build-remixdesktop-mac: requires: - build-desktop - build-remixdesktop-windows: requires: - build-desktop - sign-remixdesktop-windows: requires: - build-remixdesktop-windows - build-remixdesktop-linux: requires: - build-desktop - test-remixdesktop-linux: requires: - build-desktop - test-remixdesktop-windows: requires: - build-desktop - uploadartifacts: requires: - build-remixdesktop-mac - build-remixdesktop-linux - sign-remixdesktop-windows - build-plugin: matrix: parameters: plugin: ["plugin_api"] - lint: requires: - build - remix-libs - remix-test-plugins: name: test-plugin-<< matrix.plugin >> requires: - build - build-plugin matrix: alias: plugins parameters: plugin: ["plugin_api"] parallelism: [1, 9] exclude: - plugin: plugin_api parallelism: 1 - remix-ide-browser: requires: - build matrix: parameters: browser: ["chrome", "firefox"] script: ["browser_test.sh"] job: ["0","1","2","3","4","5","6","7","8","9"] jobsize: ["10"] - tests-passed: requires: - lint - remix-libs - remix-ide-browser - plugins - predeploy: filters: branches: only: ['master', 'remix_live', 'remix_beta'] - deploy-build: script: "live" name: "deploy-live" requires: - lint - remix-libs - remix-ide-browser - plugins - predeploy filters: branches: only: remix_live - deploy-build: script: "alpha" name: "deploy-alpha" requires: - lint - remix-libs - remix-ide-browser - plugins - predeploy filters: branches: only: master - deploy-build: script: "beta" name: "deploy-beta" requires: - lint - remix-libs - remix-ide-browser - plugins - predeploy filters: branches: only: remix_beta # VS Code Extension Version: 1.5.1 commands: install-chromedriver-custom-linux: description: Custom script to install chromedriver with better version support for linux steps: - run: name: install-chromedriver-custom-linux command: | google-chrome --version > version.txt VERSION=$(grep -Eo '[0-9]+\.' < version.txt | head -1) # CHROMEDRIVER_URL=$(curl -s 'https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json' | jq '.channels.Stable.downloads.chromedriver[] | select(.platform == "linux64") | .url' | tr -d '"') CHROMEDRIVER_URL=$(curl -s 'https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json' | jq --arg v "$VERSION" '.versions[] | select(.version | startswith($v)) | .downloads.chromedriver[] | select(.platform == "linux64") | .url' | tail -n1 | tr -d '"') echo $CHROMEDRIVER_URL ZIPFILEPATH="/tmp/chromedriver.zip" echo "Downloading from $CHROMEDRIVER_URL" curl -f --silent $CHROMEDRIVER_URL > "$ZIPFILEPATH" BINFILEPATH="$HOME/bin/chromedriver-linux" echo "Extracting to $BINFILEPATH" unzip -p "$ZIPFILEPATH" chromedriver-linux64/chromedriver > "$BINFILEPATH" echo Setting execute flag chmod +x "$BINFILEPATH" echo Updating symlink ln -nfs "$BINFILEPATH" ~/bin/chromedriver echo Removing ZIP file rm "$ZIPFILEPATH" rm version.txt echo Done chromedriver -v