diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2c58332c51..43787dce4d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -73,6 +73,7 @@ variables: before_script: - source tools/ci/utils.sh + - is_based_on_commits $REQUIRED_ANCESTOR_COMMITS - source tools/ci/setup_python.sh - apply_bot_filter - add_gitlab_ssh_keys @@ -85,6 +86,7 @@ before_script: before_script: - echo "Not setting up GitLab key, not fetching submodules, not applying bot filter" - source tools/ci/utils.sh + - is_based_on_commits $REQUIRED_ANCESTOR_COMMITS - source tools/ci/setup_python.sh - source tools/ci/configure_ci_environment.sh @@ -93,6 +95,7 @@ before_script: before_script: - echo "Not setting up GitLab key, not fetching submodules" - source tools/ci/utils.sh + - is_based_on_commits $REQUIRED_ANCESTOR_COMMITS - source tools/ci/setup_python.sh - apply_bot_filter - source tools/ci/configure_ci_environment.sh @@ -101,10 +104,12 @@ before_script: before_script: - echo "Only load utils.sh inside" - source tools/ci/utils.sh + - is_based_on_commits $REQUIRED_ANCESTOR_COMMITS .before_script_macos: before_script: - source tools/ci/utils.sh + - is_based_on_commits $REQUIRED_ANCESTOR_COMMITS - apply_bot_filter - export IDF_TOOLS_PATH="${HOME}/.espressif_runner_${CI_RUNNER_ID}_${CI_CONCURRENT_ID}" # Clean up idf-env.json which might not be compatible with one produced by newer ESP-IDF versions diff --git a/tools/ci/config/build.yml b/tools/ci/config/build.yml index c43d00d9a9..95b0253ca7 100644 --- a/tools/ci/config/build.yml +++ b/tools/ci/config/build.yml @@ -435,6 +435,7 @@ build_template_app: name: $CI_DOCKER_REGISTRY/sonarqube-scanner:2 before_script: - source tools/ci/utils.sh + - is_based_on_commits $REQUIRED_ANCESTOR_COMMITS - export PYTHONPATH="$CI_PROJECT_DIR/tools:$CI_PROJECT_DIR/tools/ci/python_packages:$PYTHONPATH" - fetch_submodules # Exclude the submodules, all paths ends with /** diff --git a/tools/ci/config/pre_check.yml b/tools/ci/config/pre_check.yml index df491d0448..fefb01fb4f 100644 --- a/tools/ci/config/pre_check.yml +++ b/tools/ci/config/pre_check.yml @@ -21,6 +21,7 @@ image: "$CI_DOCKER_REGISTRY/esp-idf-pre-commit:1" before_script: - source tools/ci/utils.sh + - is_based_on_commits $REQUIRED_ANCESTOR_COMMITS - export PYTHONPATH="$CI_PROJECT_DIR/tools:$CI_PROJECT_DIR/tools/ci/python_packages:$PYTHONPATH" check_pre_commit_master_release: diff --git a/tools/ci/utils.sh b/tools/ci/utils.sh index febc39116a..3c26bb9e0a 100644 --- a/tools/ci/utils.sh +++ b/tools/ci/utils.sh @@ -117,3 +117,55 @@ function retry_failed() { fi return $exitCode } + +function internal_pip_install() { + project=$1 + package=$2 + token_name=${3:-${BOT_TOKEN_NAME}} + token=${4:-${BOT_TOKEN}} + python=${5:-python} + + $python -m pip install --index-url https://${token_name}:${token}@${GITLAB_HTTPS_HOST}/api/v4/projects/${project}/packages/pypi/simple --force-reinstall --no-deps ${package} +} + +function join_by { + local d=${1-} f=${2-} + if shift 2; then + printf %s "$f" "${@/#/$d}" + fi +} + +function is_based_on_commits() { + # This function would accept space-separated args as multiple commits. + # The return value would be 0 if current HEAD is based on any of the specified commits. + # + # In our CI, we use environment variable $REQUIRED_ANCESTOR_COMMITS to declare the ancestor commits. + # Please remember to set one commit for each release branch. + + commits=$* + if [[ -z $commits ]]; then + info "Not specifying commits that branches should be based on, skipping check..." + return 0 + fi + + commits_str="$(join_by " or " $commits)" # no doublequotes here, passing array + + info "Checking if current branch is based on $commits_str..." + for i in $commits; do + if git merge-base --is-ancestor "$i" HEAD >/dev/null 2>&1; then + info "Current branch is based on $i" + return 0 + else + info "Current branch is not based on $i" + fi + done + + error "The base commit of your branch is too old." + error "The branch should be more recent than either of the following commits:" + error " $commits_str" + error "To fix the issue:" + error " - If your merge request is 'Draft', or has conflicts with the target branch, rebase it to the latest master or release branch" + error " - Otherwise, simply run a new pipeline." + + return 1 +}