# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you 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. name: Auto trigger teamcity on: issue_comment: types: [created, edited] pull_request_review_comment: types: [created, edited] env: PULL_REQUEST_NUM: $(echo "${{ github.event.issue.pull_request.url }}" | awk -F/ '{print $NF}') LATEST_COMMIT: $(curl -H "Authorization:Bearer ${{ secrets.GITHUB_TOKEN }}" "https://api.github.com/repos/${{ github.repository }}/pulls/$(echo '${{ github.event.issue.pull_request.url }}' | awk -F/ '{print $NF}')" > pr_details.json && jq -r '.head.sha' pr_details.json) TEAMCITY_URL: '-H \"Content-Type:text/plain\" -H \"Accept: application/json\" -u OneMoreChance:OneMoreChance http://43.132.222.7:8111' jobs: run_teamcity_pipeline: if: (contains(github.event.comment.body, 'buildall') || contains(github.event.comment.body, 'p0') || contains(github.event.comment.body, 'nereids_p0') || contains(github.event.comment.body, 'p1') || contains(github.event.comment.body, 'feut') || contains(github.event.comment.body, 'beut') || contains(github.event.comment.body, 'compile') || contains(github.event.comment.body, 'clickbench') || contains(github.event.comment.body, 'arm') || contains(github.event.comment.body, 'external') || contains(github.event.comment.body, 'just_for_test')) && contains(github.event.comment.body, 'run') && !contains(github.event.comment.body, 'Thanks for your contribution') runs-on: ubuntu-latest env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ISSUE_COMMENT: ${{ github.event.comment.body }} steps: - name: Run pipeline by teamcity restful run: | if [ "_xx""${{ github.event.issue.pull_request.url }}" != "_xx" ]; then echo "Comment was made on pull request: $(echo ${{ github.event.issue.pull_request.url }} | awk -F/ '{print $NF}')" else echo "Comment was made on an issue, not a pull request." fi pull_request_num=${{ env.PULL_REQUEST_NUM }} encoded_string=$(perl -MURI::Escape -e 'print uri_escape($ARGV[0]);' "$ISSUE_COMMENT") comment_message="$ISSUE_COMMENT" latest_commit_id="${{ env.LATEST_COMMIT }}" teamcity_url="${{ env.TEAMCITY_URL }}" trigger_pipelines="" same_build_sign="false" echo "pull_request_num : ${pull_request_num}" echo "encoded_string : ${encoded_string}" echo "latest_commit_id : ${{ env.LATEST_COMMIT }}" if [[ "${comment_message}" =~ "run" && "${comment_message}" =~ "buildall" && ! "${comment_message}" =~ "Thanks for your contribution" ]]; then trigger_pipelines="Doris_Doris_FeUt Doris_DorisBeUt_BeUt Doris_DorisCompile_Compile Doris_Performance_Clickbench_ClickbenchNew Doris_ArmPipeline_P0Regression ${trigger_pipelines}" fi if [[ "${comment_message}" =~ "run" && "${comment_message}" =~ "p0" && ! "${comment_message}" =~ "Thanks for your contribution" ]]; then trigger_pipelines="Doris_DorisRegression_P0Regression ${trigger_pipelines}" fi if [[ "${comment_message}" =~ "run" && "${comment_message}" =~ "nereids_p0" && ! "${comment_message}" =~ "Thanks for your contribution" ]]; then trigger_pipelines="Doris_DorisRegression_NereidsP0Regression ${trigger_pipelines}" fi if [[ "${comment_message}" =~ "run" && "${comment_message}" =~ "p1" && ! "${comment_message}" =~ "Thanks for your contribution" ]]; then trigger_pipelines="Doris_DorisRegression_P1Regression ${trigger_pipelines}" fi if [[ "${comment_message}" =~ "run" && "${comment_message}" =~ "feut" && ! "${comment_message}" =~ "Thanks for your contribution" ]]; then trigger_pipelines="Doris_Doris_FeUt ${trigger_pipelines}" fi if [[ "${comment_message}" =~ "run" && "${comment_message}" =~ "beut" && ! "${comment_message}" =~ "Thanks for your contribution" ]]; then trigger_pipelines="Doris_DorisBeUt_BeUt ${trigger_pipelines}" fi if [[ "${comment_message}" =~ "run" && "${comment_message}" =~ "compile" && ! "${comment_message}" =~ "Thanks for your contribution" ]]; then trigger_pipelines="Doris_DorisCompile_Compile ${trigger_pipelines}" fi if [[ "${comment_message}" =~ "run" && "${comment_message}" =~ "clickbench" && ! "${comment_message}" =~ "Thanks for your contribution" ]]; then trigger_pipelines="Doris_Performance_Clickbench_ClickbenchNew ${trigger_pipelines}" fi if [[ "${comment_message}" =~ "run" && "${comment_message}" =~ "arm" && ! "${comment_message}" =~ "Thanks for your contribution" ]]; then trigger_pipelines="Doris_ArmPipeline_P0Regression ${trigger_pipelines}" fi if [[ "${comment_message}" =~ "run" && "${comment_message}" =~ "external" && ! "${comment_message}" =~ "Thanks for your contribution" ]]; then trigger_pipelines="Doris_External_Regression ${trigger_pipelines}" fi if [[ "${comment_message}" =~ "run" && "${comment_message}" =~ "just_for_test" && ! "${comment_message}" =~ "Thanks for your contribution" ]]; then trigger_pipelines="Doris_DorisRegression_ExternalRegression ${trigger_pipelines}" fi if [ -z "${trigger_pipelines}" ];then echo "Just a general comment that doesn't match any pipeline rules" fi echo "need run pipelines: ${trigger_pipelines}" for pipeline in ${trigger_pipelines} do echo "-----------------------------------------------------------------" running_builds_command="curl -s -X GET ${teamcity_url}/app/rest/builds\?locator\=buildType\:${pipeline}\,branch:pull/${pull_request_num}\,running:true" echo "${running_builds_command}" running_builds_list=$(eval "${running_builds_command}" > running_builds.json && jq -r '.build[].id' running_builds.json) echo "running_builds_list : ${running_builds_list}" queue_builds_command="curl -s -X GET ${teamcity_url}/app/rest/buildQueue\?locator\=buildType\:${pipeline}" echo "${queue_builds_command}" eval "${queue_builds_command}" > queue_builds.json queue_builds_list=$(cat queue_builds.json | jq ".build[] | select(.branchName == \"pull/${pull_request_num}\") | .id" ) echo "queue builds list: ${queue_builds_list}" merged_list=("${running_builds_list[@]} ${queue_builds_list[@]}") echo "merged_list : ${merged_list}" for build in ${merged_list}; do running_commit_command="curl -s -X GET ${teamcity_url}/app/rest/builds/${build}" echo "${running_commit_command}" eval "${running_commit_command}" > build_commit_info.json running_commit_id=$(jq -r '.revisions.revision[0].version' build_commit_info.json) running_env_commit_id=$(cat build_commit_info.json | jq ".properties.property[] | select(.name == \"env.latest_commit_id\") | .value") if [[ "_"${latest_commit_id} == "_"${running_commit_id} || _"\"${latest_commit_id}\"" == "_"${running_env_commit_id} ]];then echo "the same pr_commit build already exist, this build ${build} is running or in queue!" same_build_sign="true" break fi done if [ "_""${same_build_sign}" == "_false" ];then sleep 10s echo "there is no running build or queue build, so trigger a new !" execute_command="curl -s -X POST ${teamcity_url}/httpAuth/action.html\?add2Queue\=${pipeline}\&branchName\=pull/${pull_request_num}\&name=env.latest_pr_comment\&value=${encoded_string}\&name=env.latest_commit_id\&value=${latest_commit_id}" echo "${execute_command}" eval "${execute_command}" echo "-----------------------------------------------------------------" else echo "there is same pr commit task in queue,so skip trigger !" echo "-----------------------------------------------------------------" fi done