diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ba50256890a435eec6e8fb08c4e2626b90f950f1..e28564a6c520ae231b13a949837d91c7dfb479f0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,5 @@ stages: + - check-status - trigger - downstream modules @@ -10,7 +11,39 @@ variables: workflow: rules: - if: $CI_PIPELINE_SOURCE == "schedule" + - if: $CI_PIPELINE_SOURCE == "pipeline" - if: $CI_PIPELINE_SOURCE == "merge_request_event" + - if: $CI_COMMIT_BRANCH == "master" + +# for commits happening on master, we check if there was a successful +# pipeline on a related merge request already. If yes, we simply return +# to propagate that pipeline status on master. Otherwise, we trigger a new run. +check-pipeline-status: + image: $IMAGE_REGISTRY_URL/full:dune-2.7-gcc-ubuntu-20.04 + stage: check-status + rules: + - if: $CI_PIPELINE_SOURCE == "schedule" + when: never + - if: $CI_PIPELINE_SOURCE == "pipeline" + when: never + - if: $CI_COMMIT_BRANCH == "master" + when: always + script: + - | + curl --header --form "token=$CI_JOB_TOKEN" \ + "https://git.iws.uni-stuttgart.de/api/v4/projects/31/pipelines/?status=success" \ + > pipeline_status.json + - | + if ! python3 .gitlab-ci/getpipelineinfo.py --status-file pipeline_status.json \ + --look-for HEAD \ + --print-format pipeline-id; then + echo "No successful pipeline found. Triggering new pipeline..." + curl --request POST --form "token=$CI_JOB_TOKEN" \ + --form ref=$CI_COMMIT_BRANCH \ + "https://git.iws.uni-stuttgart.de/api/v4/projects/31/trigger/pipeline" + else + echo "Found successful pipeline for the current state of the branch" + fi ################################################################################### # Stage 1: trigger the Dumux test pipelines # @@ -28,10 +61,13 @@ workflow: strategy: depend variables: TRIGGER_SOURCE: $CI_PIPELINE_SOURCE + COMMIT_BRANCH: $CI_COMMIT_BRANCH MR_TARGET_BRANCH_NAME: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME rules: - if: $CI_PIPELINE_SOURCE == "schedule" when: always + - if: $CI_PIPELINE_SOURCE == "pipeline" + when: always - if: $CI_PIPELINE_SOURCE == "merge_request_event" when: manual @@ -39,7 +75,7 @@ workflow: .non-mr-trigger: extends: .base-trigger rules: - - if: $CI_PIPELINE_SOURCE != "merge_request_event" + - if: $CI_PIPELINE_SOURCE == "schedule" ############################################# # pipelines to be created in merge requests # @@ -77,6 +113,10 @@ full-dune-master-clang: # trigger lecture test trigger lecture: + rules: + - if: $CI_PIPELINE_SOURCE == "schedule" + - if: $CI_PIPELINE_SOURCE == "pipeline" + - if: $CI_PIPELINE_SOURCE == "merge_request_event" stage: downstream modules trigger: project: dumux-repositories/dumux-lecture diff --git a/.gitlab-ci/default.yml b/.gitlab-ci/default.yml index 706c7a310d42f1081a96e7ccfd71882cb9a3911e..dead4f5db96f2f0b8bdae5895cfead2be4fd825b 100644 --- a/.gitlab-ci/default.yml +++ b/.gitlab-ci/default.yml @@ -10,22 +10,57 @@ workflow: rules: - if: $CI_PIPELINE_SOURCE=="parent_pipeline" -# variables that may be overwritten by the trigger +# variables that should be overwritten by the trigger variables: TRIGGER_SOURCE: "undefined" + COMMIT_BRANCH: "undefined" MR_TARGET_BRANCH_NAME: "undefined" select tests: stage: configure script: + - dunecontrol --opts=$DUNE_OPTS_FILE --current all - | - dunecontrol --opts=$DUNE_OPTS_FILE --current all if [[ "$TRIGGER_SOURCE" == "merge_request_event" ]]; then echo "Detecting changes w.r.t to target branch '$MR_TARGET_BRANCH_NAME'" - python3 bin/testing/getchangedfiles.py -o changedfiles.txt -t origin/$MR_TARGET_BRANCH_NAME - python3 bin/testing/findtests.py -o affectedtests.json --file-list changedfiles.txt --build-dir build-cmake + python3 bin/testing/getchangedfiles.py --outfile changedfiles.txt \ + --target.tree origin/$MR_TARGET_BRANCH_NAME + python3 bin/testing/findtests.py --outfile affectedtests.json \ + --file-list changedfiles.txt \ + --build-dir build-cmake + + elif [[ "$TRIGGER_SOURCE" == "schedule" ]]; then + echo "Starting scheduled pipeline" + echo "Skipping test selection, build/test stages will consider all tests!" + touch affectedtests.json + + elif [[ "$TRIGGER_SOURCE" == "pipeline" ]]; then + echo "Starting pipeline triggered from another pipeline" + echo "Determining sha with the last successful pipeline to test against" + curl --header --form "token=$CI_JOB_TOKEN" \ + "https://git.iws.uni-stuttgart.de/api/v4/projects/31/pipelines/?status=success" \ + > pipeline_status.json + + if ! python3 .gitlab-ci/getpipelineinfo.py --status-file pipeline_status.json \ + --look-for latest \ + --print-format commit-sha; then + echo "Could not find a successful pipeline, will build/run all tests" + touch affectedtests.json + else + export COMMIT_SHA=$(python3 .gitlab-ci/getpipelineinfo.py --status-file pipeline_status.json \ + --look-for latest \ + --print-format commit-sha) + echo "Comparing against sha $COMMIT_SHA" + python3 bin/testing/getchangedfiles.py --outfile changedfiles.txt \ + --source-tree HEAD \ + --target-tree $COMMIT_SHA + python3 bin/testing/findtests.py --outfile affectedtests.json \ + --file-list changedfiles.txt \ + --build-dir build-cmake + fi + else - echo "Received '$TRIGGER_SOURCE' as pipeline trigger event" + echo "Unknown pipeline trigger event" echo "Skipping test selection, build/test stages will consider all tests!" touch affectedtests.json fi