#!/bin/bash # Copyright (C) 2019 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Should code live in this script or in the PERFETTO_TEST_SCRIPT script? # You might argue: after all they are both part of the same repo? The difference # is in temporal pinning. # Code in this script is part of the Docker image that is manually pushed # on the VMs. Everything in here is orthogonal to the evolution of the repo. # Everything from /ramdisk instead will reflect the state of the repo at the # point in time of the checkout. # Things like script that upload performance data to dashboarads should probably # be in the docker image. Things that depend on build artifacts should probably # come from the repo. set -eux # CWD is /ci/ramdisk. In the CI this is based on a tmpfs ramdisk. # Print env vars for debugging. They contain GN args and entrypoint. date hostname env mkdir src && cd src if [[ -f "$PERFETTO_TEST_GIT_REF" ]]; then # This is used only by tools/run_test_like_ci. git clone -q --no-tags --single-branch --depth=1 "$PERFETTO_TEST_GIT_REF" . else git clone -q --no-tags --single-branch \ https://android.googlesource.com/platform/external/perfetto.git . git config user.email "ci-bot@perfetto.dev" git config user.name "Perfetto CI" git fetch -q origin "$PERFETTO_TEST_GIT_REF" # We really want to test the result of the merge of the CL in ToT master. Don't # really care about whether the CL passes the test at the time it was written. git merge -q FETCH_HEAD -m merge fi # The android buildtools are huge due to the emulator, keep that as a separate # cache and pack/unpack separately. It's worth ~30s on each non-android test. if [[ "$PERFETTO_TEST_GN_ARGS" =~ "android" ]]; then PREBUILTS_ARCHIVE=/ci/cache/buildtools-$(date +%Y-%m-%d)-android.tar.lz4 else PREBUILTS_ARCHIVE=/ci/cache/buildtools-$(date +%Y-%m-%d).tar.lz4 fi # Clear stale buildtools caches after 24h. (echo /ci/cache/buildtools-* | grep -v $PREBUILTS_ARCHIVE | xargs rm -f) || true if [ -f $PREBUILTS_ARCHIVE ]; then lz4 -d $PREBUILTS_ARCHIVE | tar xf - || rm -f $PREBUILTS_ARCHIVE git reset --hard # Just in case some versioned file gets overwritten. fi # By default ccache uses the mtime of the compiler. This doesn't work because # our compilers are hermetic and their mtime is the time when we run # install-build-deps. Given that the toolchain is rolled via install-build-deps # we use that file as an identity function for the compiler check. export CCACHE_COMPILERCHECK=string:$(shasum tools/install-build-deps) export CCACHE_UMASK=000 export CCACHE_DEPEND=1 export CCACHE_MAXSIZE=32G export CCACHE_DIR=/ci/cache/ccache export CCACHE_SLOPPINESS=include_file_ctime,include_file_mtime export CCACHE_NOCOMPRESS=1 mkdir -m 777 -p $CCACHE_DIR export PERFETTO_TEST_GN_ARGS="${PERFETTO_TEST_GN_ARGS} cc_wrapper=\"ccache\"" export PERFETTO_TEST_NINJA_ARGS="" $PERFETTO_TEST_SCRIPT # The code after this point will NOT run if the test fails (because of set -e). ccache --show-stats # Populate the cache on the first run. Do that atomically so in case of races # one random worker wins. if [ ! -f $PREBUILTS_ARCHIVE ]; then TMPFILE=/ci/cache/buildtools-$(hostname -s).tar.lz4 # Add only git-ignored dirs to the cache. git check-ignore buildtools/* | xargs tar c | lz4 -z - "$TMPFILE" mv -f "$TMPFILE" $PREBUILTS_ARCHIVE fi