diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 53bc7177463..00000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,200 +0,0 @@ -version: 2.1 # needed for executors - -executors: - rskj-executor: - docker: - - image: openjdk:8-jdk - environment: - _JAVA_OPTIONS: "-Xmx3G -Xms2G" - working_directory: /app - resource_class: medium+ - sonarqube-executor: - docker: - - image: eclipse-temurin:17-jdk - working_directory: /app - mit-executor: - docker: - - image: alpine:3.10 - -jobs: - build: - executor: rskj-executor - steps: - - checkout - - run: - name: Setup - command: apt update -y && apt install -y gnupg2 - - run: - name: Verify files - command: | - curl -sSL https://secchannel.rsk.co/SUPPORT.asc | gpg2 --import - - gpg2 --verify SHA256SUMS.asc && sha256sum --check SHA256SUMS.asc - - run: - name: Build - command: | - ./configure.sh - ./gradlew --no-daemon dependencies - ./gradlew --no-daemon --stacktrace build -x test - - persist_to_workspace: - root: . - paths: - - . - sonarqube: - executor: sonarqube-executor - steps: - - attach_workspace: - at: /app - - run: - name: Run SonarQube analysis - command: | - apt-get update && apt-get install -yqq git - extra_flags="" - if [ -n "$CIRCLE_PULL_REQUEST" ]; then - # https://community.sonarsource.com/t/no-code-or-issue-found-in-pull-request-decorations-github-circleci/8496 - git branch -f master origin/master - # extract PR number, as PR URLs are in the form - # https://github.com/$user/$repo/pull/$pr_number - pr_number=${CIRCLE_PULL_REQUEST##*/} - extra_flags="-Dsonar.pullrequest.base=master - -Dsonar.pullrequest.branch=$CIRCLE_BRANCH - -Dsonar.pullrequest.key=$pr_number" - else - extra_flags="-Dsonar.branch.name=master" - fi - ./gradlew sonarqube --no-daemon -x build -x test \ - $extra_flags \ - -Dsonar.organization=rsksmart \ - -Dsonar.host.url="$SONAR_URL" \ - -Dsonar.login="$SONAR_TOKEN" - rskj-unit-tests: - executor: rskj-executor - steps: - - attach_workspace: - at: /app - - run: - name: rskj tests - command: ./gradlew --no-daemon --stacktrace test - - run: - name: Save test results - command: | - mkdir -p ~/junit/ - find rskj-core/build/test-results -type f -name "*.xml" \ - -exec cp {} ~/junit/ \; - when: always - - store_test_results: - path: ~/junit - - store_artifacts: - path: ~/junit - - persist_to_workspace: - root: . - paths: - - . - rskj-int-tests: - executor: rskj-executor - steps: - - attach_workspace: - at: /app - - run: - name: rskj integration tests - command: ./gradlew --no-daemon --stacktrace integrationTest - - run: - name: Save test results - command: | - mkdir -p ~/junit/ - find rskj-core/build/test-results -type f -name "*.xml" \ - -exec cp {} ~/junit/ \; - when: always - - store_test_results: - path: ~/junit - - store_artifacts: - path: ~/junit - - persist_to_workspace: - root: . - paths: - - . - mining-tests: - executor: mit-executor - steps: - - run: - name: Setup - command: apk add --no-cache curl jq - - run: - name: Mining integration tests - command: | - wait_for_completion() { - # inspired from https://discuss.circleci.com/t/waiting-for-build-to-complete-when-invoked-via-http-api/14989 - build_number=$1 - poll_interval=60 - - i=0 - max_count=20 - while [ $i -lt $max_count ]; do - # output to avoid CircleCI considering the job stuck - res=$(curl -Ssfu "$CIRCLE_INTEGRATIONS_TOKENS:" \ - "https://circleci.com/api/v1.1/project/github/$MIT_ORGANIZATION/$MIT_PROJECT/$build_number" \ - | jq -r '[.lifecycle, .outcome] | @tsv') - IFS=" " set -- $res - lifecycle=${1:-} - outcome=${2:-} - if [ "$lifecycle" = "queued" ]; then - printf "Build is enqueued. Waiting...\n" - # don't increment $i - else - printf "[%02u/%02u] Waiting for build %s ...\n" \ - "$i" "$max_count" "$build_url" - i=$(($i + 1)) - fi - if [ "$lifecycle" = "finished" ]; then - printf "Build %u finished. Outcome: \"%s\".\n" \ - "$build_number" "$outcome" - # return success iff job outcome is "success" - test "$outcome" = "success" - return $? - fi - - sleep $poll_interval - done - return 1 - } - - json_payload='{ - "build_parameters": { - "RSKJ_CIRCLE_BRANCH": "'$CIRCLE_BRANCH'", - "RSKJ_CIRCLE_USERNAME": "'$CIRCLE_PROJECT_USERNAME'", - "RSKJ_CIRCLE_REPONAME": "'$CIRCLE_PROJECT_REPONAME'", - "RSKJ_PR_NUMBER": "'$CIRCLE_PR_NUMBER'", - "RSKJ_CIRCLE_SHA1": "'$CIRCLE_SHA1'" - } - }' - res=$(curl -Ssf -u "$CIRCLE_INTEGRATIONS_TOKEN:" \ - -H "Content-type: application/json" -d "$json_payload" \ - "https://circleci.com/api/v1.1/project/github/$MIT_ORGANIZATION/$MIT_PROJECT/tree/$MIT_BRANCH" \ - | jq -r '[.build_url, .build_num] | @tsv') - IFS=" " set -- $res - test $# -eq 2 # ensure exactly 2 values are expanded - build_url=$1 - build_num=$2 - printf "Running mining integration tests. Follow it on:\n\n %s\n\n" "$build_url" - sleep 10 # give CircleCI some time to spin up the job - wait_for_completion "$build_num" - -workflows: - # https://circleci.com/docs/2.0/configuration-reference/#version-1 - # As of commit date, it reads: - # Should currently be `2` - version: 2 - build-and-test: - jobs: - - build - - rskj-unit-tests: - requires: - - build - - rskj-int-tests: - requires: - - build - - sonarqube: - requires: - - rskj-unit-tests - - mining-tests: - requires: - - rskj-unit-tests diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml new file mode 100644 index 00000000000..9ef9a7e5fad --- /dev/null +++ b/.github/workflows/build_and_test.yml @@ -0,0 +1,289 @@ +name: Build and Test + +on: + push: + branches: + - '**' + pull_request: + types: [opened, reopened, ready_for_review] + branches: + - '**' + +jobs: + build: + runs-on: ubuntu-latest + container: + image: openjdk:8-jdk + env: + _JAVA_OPTIONS: "-Xmx3G -Xms2G" + defaults: + run: + working-directory: . + steps: + - uses: actions/checkout@v2 + - name: Setup System Tools + run: | + apt update -y + apt install -y gnupg2 curl + - name: Install Node.js + run: | + curl -fsSL https://deb.nodesource.com/setup_16.x | bash - + apt-get install -y nodejs + - name: Check Node.js version + run: node --version + - name: Verify files + run: | + curl -sSL https://secchannel.rsk.co/SUPPORT.asc | gpg2 --import - + gpg2 --verify SHA256SUMS.asc && sha256sum --check SHA256SUMS.asc + + - uses: actions/cache@v4 + name: Cache Gradle + with: + path: | + .gradle/caches + gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - uses: actions/cache@v4 + name: Cache build + with: + path: | + build + key: ${{ runner.os }}-build-${{ hashFiles('build') }} + restore-keys: | + ${{ runner.os }}-build- + + - name: Build + run: | + ./configure.sh + ./gradlew --no-daemon dependencies + ./gradlew --no-daemon --stacktrace build -x test + ls -la ./gradle/wrapper/gradle-wrapper.jar + + sonarqube: + needs: build + runs-on: ubuntu-latest + container: + image: eclipse-temurin:17-jdk + defaults: + run: + working-directory: . + steps: + - uses: actions/checkout@v2 + - name: Run SonarQube analysis + run: | + echo "Installing git" + apt-get update && apt-get install -yqq git + extra_flags="" + echo "Get GH event type" + event_name="${{ github.event_name }}" + if [ "$event_name" = "pull_request" ]; then + echo "Setting up PR analysis" + echo "switch to master" + git branch -f master origin/master + pr_number=${{ github.event.pull_request.number }} + echo "PR number: $pr_number" + extra_flags="-Dsonar.pullrequest.base=master -Dsonar.pullrequest.branch=${{ github.head_ref }} -Dsonar.pullrequest.key=$pr_number" + echo "PR analysis flags: $extra_flags" + else + echo "Setting up branch analysis" + extra_flags="-Dsonar.branch.name=master" + echo "Branch analysis flags: $extra_flags" + fi + + sonar_url=${{ secrets.SONAR_URL }} + sonar_token=${{ secrets.SONAR_TOKEN }} + echo "Event name: $event_name" + echo "Sonar URL: $sonar_url" + + echo "Running SonarQube analysis" + ./configure.sh + ./gradlew sonarqube --no-daemon -x build -x test $extra_flags \ + -Dsonar.organization=rsksmart -Dsonar.host.url="$sonar_url" -Dsonar.login="$sonar_token" + + tests: + needs: build + runs-on: ubuntu-latest + container: + image: openjdk:8-jdk + defaults: + run: + working-directory: . + steps: + - uses: actions/checkout@v2 + + - name: Setup System Tools + run: | + apt update -y + apt install -y curl + - name: Install Node.js + run: | + curl -fsSL https://deb.nodesource.com/setup_16.x | bash - + apt-get install -y nodejs + - name: Check Node.js version + run: node --version + + - uses: actions/cache@v4 + name: Restore gradle cache + with: + path: | + .gradle/caches + gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Get Gradle jar + run: | + ./configure.sh + + - name: Unit tests + run: | + chmod +x ./gradlew + ./gradlew --no-daemon --stacktrace test + - name: Integration tests + run: | + chmod +x ./gradlew + ./gradlew --no-daemon --stacktrace test + + - name: Save test results + run: | + mkdir -p ~/junit/ + find rskj-core/build/test-results -type f -name "*.xml" -exec cp {} ~/junit/ \; + if: always() + + mining-tests: + needs: build + runs-on: ubuntu-latest + defaults: + run: + working-directory: . + + services: + bitcoind01: + image: kylemanna/bitcoind:latest + env: + DISABLEWALLET: "0" + ports: + - 31591:31591 +# options: >- +# --entrypoint "/usr/local/bin/bitcoind + + bitcoind02: + image: kylemanna/bitcoind:latest + env: + DISABLEWALLET: "0" + ports: + - 31592:31592 +# options: >- +# --entrypoint "/usr/local/bin/bitcoind + + steps: + - name: Setup System Tools + run: | + sudo apt update -y + sudo apt install -y curl + - name: Install Node.js + run: | + curl -fsSL https://deb.nodesource.com/setup_16.x | sudo bash - + sudo apt-get install -y nodejs + - name: Check Node.js version + run: node --version + + - name: Checkout RSKj + uses: actions/checkout@v2 + + - name: Setup Java JDK + uses: actions/setup-java@v2 + with: + java-version: '17' + distribution: 'temurin' + + - name: Verify Java installation + run: java -version + + - name: Checkout Mining Integration Tests Repository + uses: actions/checkout@v2 + with: + repository: rsksmart/mining-integration-tests + ref: ${{ secrets.MINING_INTEGRATION_TESTS_REF }} + token: ${{ secrets.GITHUB_TOKEN }} + path: mining-integration-tests + +# - uses: actions/cache@v4 +# name: Restore gradle cache +# with: +# path: | +# .gradle/caches +# gradle/wrapper +# key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} +# restore-keys: | +# ${{ runner.os }}-gradle- +# +# - name: Get Gradle jar +# run: | +# ./configure.sh + + - name: Install Mining Integration Tests dependencies + working-directory: mining-integration-tests + run: | + npm install + + - name: Start Bitcoin nodes + run: | + docker run -itd bitcoind01 /usr/local/bin/bitcoind -printtoconsole -regtest -debug -server -listen -port=31591 -connect=localhost:31592 -rpcbind=0.0.0.0:32591 -rpcallowip=0.0.0.0/0 -rpcuser=admin -rpcpassword=admin + docker run -itd bitcoind02 /usr/local/bin/bitcoind -printtoconsole -regtest -debug -server -listen -port=31592 -connect=localhost:31591 -rpcbind=0.0.0.0:32591 -rpcallowip=0.0.0.0/0 -rpcuser=admin -rpcpassword=admin + + + - name: Test bitcoin nodes + run: | + echo Test bitcoin node 1 + curl -s -u admin:admin --data-binary '{"jsonrpc":"1.0","id":"curltext","method":"getblockchaininfo","params":[]}' -H 'content-type:text/plain;' http://localhost:32591 + echo Test bitcoin node 2 + curl -s -u admin:admin --data-binary '{"jsonrpc":"1.0","id":"curltext","method":"getblockchaininfo","params":[]}' -H 'content-type:text/plain;' http://localhost:32592 + + - name: Generate BTC blocks + working-directory: mining-integration-tests + run: | + node generateBtcBlocks.js + + - uses: actions/cache@v4 + name: Restore build + with: + path: | + build + key: ${{ runner.os }}-build-${{ hashFiles('build') }} + restore-keys: | + ${{ runner.os }}-build- + + - name: Get RSKj version + run: | + version=$(tr -d "'\"" < rskj-core/src/main/resources/version.properties \ + | cut -d = -f 2- | paste -sd - -) + - name: Start RSKj + run: | + java -Drsk.conf.file=./rsk-integration-test.conf -cp rskj-core/build/libs/rskj-core-"$version"-all.jar co.rsk.Start --regtest + rskpid=$! + echo "RSKj PID: $rskpid" + until nc -z 127.0.0.1 4444 + do + echo "Waiting for RskJ..." + sleep 1 + done + - name: Run Mining Integration Tests + working-directory: mining-integration-tests + run: | + npm test + + - name: Stop RSKj + if: always() + run: | + kill $rskpid + + - name: Stop and Remove Docker Containers + if: always() + run: | + /usr/bin/docker stop bitcoind01 bitcoind02 + /usr/bin/docker rm bitcoind01 bitcoind02 \ No newline at end of file