Prechádzať zdrojové kódy

Merge branch 'ci/force_based_on_commit' into 'master'

ci: support one pipeline must based on commmits

Closes IDFCI-1175

See merge request espressif/esp-idf!17817
Fu Hanxi 3 rokov pred
rodič
commit
609d5a4e77
2 zmenil súbory, kde vykonal 53 pridanie a 6 odobranie
  1. 5 0
      .gitlab-ci.yml
  2. 48 6
      tools/ci/utils.sh

+ 5 - 0
.gitlab-ci.yml

@@ -119,6 +119,7 @@ cache:
 
 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
@@ -134,6 +135,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
     - *download_test_python_contraint_file
@@ -143,10 +145,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}"
     - *download_test_python_contraint_file
     - $IDF_PATH/tools/idf_tools.py install-python-env
@@ -164,6 +168,7 @@ before_script:
 .before_script_pytest:
   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

+ 48 - 6
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
 }