diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 82a22a0d4..b3e12ed13 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,49 +5,81 @@ on: branches: [ main ] pull_request: branches: [ main ] + schedule: + # Run daily at midnight to ensure we catch regressions. + # https://crontab.guru/#0_0_*_*_* + - cron: "0 0 * * *" jobs: build: - name: Bazel Build and Test - # We use Ubuntu 20.04 as it comes with GCC v9.3 by default. - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 env: - BAZEL_CACHE_USER: github - BAZEL_CACHE_PWD: ${{ secrets.BAZEL_CACHE_PWD }} - BAZEL_CACHE_URL: pins-bazel-cache.onf.dev:9090 + BAZEL: bazelisk-linux-amd64 + SWSS: https://x-token-auth:${{ secrets.PINS_GITHUB_BOT_PERSONAL_ACCESS_TOKEN }}@github.com/pins/sonic-swss-common.git steps: - - uses: actions/checkout@v2 - - - name: Mount bazel cache - uses: actions/cache@v2 - with: - # See https://docs.bazel.build/versions/master/output_directories.html - path: "/tmp/repo-cache" - # See https://docs.github.com/en/actions/guides/caching-dependencies-to-speed-up-workflows - key: bazel-repo-cache-v1-${{ runner.os }}-${{ hashFiles('**/*_deps.bzl', '.bazelrc', '.bazelversion', 'WORKSPACE.bazel') }} - restore-keys: | - bazel-repo-cache-v1-${{ runner.os }}- + - uses: actions/checkout@v3 - name: Install system dependencies run: ./install_dependencies.sh - name: Install bazelisk run: | - ARCH=$(dpkg --print-architecture) - sudo curl -fsSL -o /usr/local/bin/bazel \ - https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-linux-${ARCH} - sudo chmod +x /usr/local/bin/bazel - - # Authentication is enabled for R/W access for builds on main and branch PRs - # Unauthenticated reads are allowed for PRs from forks - - name: Build and Test + curl -LO "https://github.com/bazelbuild/bazelisk/releases/download/v1.17.0/$BAZEL" + chmod +x $BAZEL + + - name: Set up GitHub credentials for private repos + run: git config --global url."${SWSS}".InsteadOf "git@github.com:pins/sonic-swss-common.git" + + - name: Mount bazel cache + uses: actions/cache/restore@v3 + with: + path: "~/.cache/bazel" + key: ci-${{ hashFiles('**/*_deps.bzl', '.bazelrc') }}-${{ github.ref_name }} + # The last key, `test-Linux`, is there just for boostrapping-purposes -- it matches the + # cache key schema prior to 2023-06-29. It can be revoved in a subsequent PR. + restore-keys: | + ci-${{ hashFiles('**/*_deps.bzl', '.bazelrc') }} + ci + test-Linux + + - name: Save start time + uses: josStorer/get-current-time@v2 + id: start-time + with: + # Unix timestamp -- seconds since 1970. + format: X + + - name: Build + run: ./$BAZEL build --test_output=errors //... + + - name: Test + run: ./$BAZEL test --test_output=errors //... + + - name: Save end time + uses: josStorer/get-current-time@v2 + id: end-time + with: + # Unix timestamp -- seconds since 1970. + format: X + + - name: Calculate build duration run: | - mkdir -p /tmp/repo-cache - BAZEL_OPTS="--repository_cache=/tmp/repo-cache" - [ ! -z "$BAZEL_CACHE_USER" ] && [ ! -z "$BAZEL_CACHE_PWD" ] && \ - AUTH="${BAZEL_CACHE_USER}:${BAZEL_CACHE_PWD}@" - BAZEL_OPTS+=" --remote_cache=https://${AUTH}${BAZEL_CACHE_URL}" - BAZEL_OPTS+=" --remote_download_minimal" - bazel build ${BAZEL_OPTS} //... - bazel test ${BAZEL_OPTS} //... + START=${{ steps.start-time.outputs.formattedTime }} + END=${{ steps.end-time.outputs.formattedTime }} + DURATION=$(( $END - $START )) + echo "duration=$DURATION" | tee "$GITHUB_ENV" + + - name: Compress cache + # This deletes cached archives while keeping the build cache. + run: rm -rf $(./$BAZEL info repository_cache) + + - name: Save bazel cache + uses: actions/cache/save@v3 + # We create a new cache entry if either of the following is true: + # - We are on the master branch. + # - It took more than 5 minutes to build and test. + if: github.ref_name == 'master' || env.duration > 300 + with: + path: "~/.cache/bazel" + key: ci-${{ hashFiles('**/*_deps.bzl', '.bazelrc') }}-${{ github.ref_name }}-${{ github.run_id }} diff --git a/pins_infra_deps.bzl b/pins_infra_deps.bzl index ec7d5f138..d1b8b2321 100644 --- a/pins_infra_deps.bzl +++ b/pins_infra_deps.bzl @@ -30,6 +30,14 @@ def pins_infra_deps(): "https://github.com/google/boringssl/archive/b8a2bffc598f230484ff48a247526a9820facfc2.tar.gz", ], ) + if not native.existing_rule("com_github_nelhage_rules_boost"): + # This version includes the fix for boost failures due to the xz library issue. + http_archive( + name = "com_github_nelhage_rules_boost", + url = "https://github.com/nelhage/rules_boost/archive/5160325dbdc8c9e499f9d9917d913f35f1785d52.zip", + strip_prefix = "rules_boost-5160325dbdc8c9e499f9d9917d913f35f1785d52", + sha256 = "feb4b1294684c79df7c1e08f1aec5da0da52021e33db59c88edbe86b4d1a017a", + ) if not native.existing_rule("com_github_grpc_grpc"): http_archive( name = "com_github_grpc_grpc", @@ -188,6 +196,14 @@ def pins_infra_deps(): build_file = "@//:bazel/BUILD.jsoncpp.bazel", sha256 = "6da6cdc026fe042599d9fce7b06ff2c128e8dd6b8b751fca91eb022bce310880", ) + if not native.existing_rule("com_github_ivmai_cudd"): + http_archive( + name = "com_github_ivmai_cudd", + build_file = "@//:bazel/BUILD.cudd.bazel", + strip_prefix = "cudd-cudd-3.0.0", + sha256 = "5fe145041c594689e6e7cf4cd623d5f2b7c36261708be8c9a72aed72cf67acce", + urls = ["https://github.com/ivmai/cudd/archive/cudd-3.0.0.tar.gz"], + ) if not native.existing_rule("com_gnu_gmp"): http_archive( name = "com_gnu_gmp",