From 97c9fa7aca9c6758e8e33d179b8b93954acbec58 Mon Sep 17 00:00:00 2001 From: Fu Hanxi Date: Tue, 19 Apr 2022 21:03:31 +0800 Subject: [PATCH] ci: support one pipeline must based on commmits --- .gitlab-ci.yml | 4 +++ .gitlab/ci/pre_check.yml | 1 + .gitlab/ci/static-code-analysis.yml | 1 + tools/ci/utils.sh | 54 +++++++++++++++++++++++++---- 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2f7ce3882b..532af3812b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -88,6 +88,7 @@ variables: before_script: - source tools/ci/utils.sh + - is_based_on_commits $REQUIRED_ANCESTOR_COMMITS - source tools/ci/setup_python.sh - add_gitlab_ssh_keys - source tools/ci/configure_ci_environment.sh @@ -99,6 +100,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 - source tools/ci/configure_ci_environment.sh @@ -106,10 +108,12 @@ before_script: before_script: - echo "Only load utils.sh" - 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 - export IDF_TOOLS_PATH="${HOME}/.espressif_runner_${CI_RUNNER_ID}_${CI_CONCURRENT_ID}" - $IDF_PATH/tools/idf_tools.py install-python-env # On macOS, these tools need to be installed diff --git a/.gitlab/ci/pre_check.yml b/.gitlab/ci/pre_check.yml index 87479f5e65..dcfc9611d3 100644 --- a/.gitlab/ci/pre_check.yml +++ b/.gitlab/ci/pre_check.yml @@ -15,6 +15,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/.gitlab/ci/static-code-analysis.yml b/.gitlab/ci/static-code-analysis.yml index 31db4ae75b..c2bc2c661a 100644 --- a/.gitlab/ci/static-code-analysis.yml +++ b/.gitlab/ci/static-code-analysis.yml @@ -65,6 +65,7 @@ check_pylint: name: $SONARQUBE_SCANNER_IMAGE 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/utils.sh b/tools/ci/utils.sh index 3db3537224..7fd77d3b2d 100644 --- a/tools/ci/utils.sh +++ b/tools/ci/utils.sh @@ -114,11 +114,53 @@ function retry_failed() { } function internal_pip_install() { - project=$1 - package=$2 - token_name=${3:-${BOT_TOKEN_NAME}} - token=${4:-${BOT_TOKEN}} - python=${5:-python} + 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} + $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 }