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..b37af50325e --- /dev/null +++ b/.github/workflows/build_and_test.yml @@ -0,0 +1,235 @@ +name: Build and Test + +on: + push: + branches: + - '**' # Applies to all branches; adjust this as necessary for specific branches + + # Trigger 'on: pull_request' for specific PR actions + pull_request: + types: [opened, reopened, ready_for_review] + branches: + - '**' # Also applies to all branches; you can restrict this if needed + + +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 + + - name: List Files in gradle Directory + run: ls -al gradle && ls -al gradle/wrapper + + - 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- + + - 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: Check Working Directory + run: pwd + - name: List Files in Current Directory + run: ls -al + - name: List Files in gradle Directory + run: ls -al gradle && ls -al gradle/wrapper + + - 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: tests + runs-on: ubuntu-latest + container: + image: alpine:3.10 + defaults: + run: + working-directory: . + steps: + - name: Setup System Tools + run: | + apk add --no-cache curl jq + + - name: Get Gradle jar + run: | + ./configure.sh + + - name: Mining integration tests + run: | + 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"