diff --git a/.github/workflows/pre-merge-test.yml b/.github/workflows/pre-merge-test.yml new file mode 100644 index 00000000000..bc6d0dbd222 --- /dev/null +++ b/.github/workflows/pre-merge-test.yml @@ -0,0 +1,132 @@ +name: Pre-Merge Test + +on: + issue_comment: + types: + - created + pull_request: + branches: + - '**' + +jobs: + pre-merge-test: + if: startsWith(github.event.comment.body, '/pre-merge-test') + runs-on: ubuntu-latest + + steps: + # Step 1: Debugging - Echo VALID_USERS and BUILDKITE_TOKEN + - name: Debug Secrets + env: + VALID_USERS: ${{ secrets.VALID_USERS }} + BUILDKITE_TOKEN: ${{ secrets.BUILDKITE_TOKEN }} + run: | + echo "Debugging Secrets:" + echo "VALID_USERS starts with: ${VALID_USERS:0:5}..." # Print first 5 characters + echo "VALID_USERS length: ${#VALID_USERS}" + echo "BUILDKITE_TOKEN starts with: ${BUILDKITE_TOKEN:0:5}..." # Print first 5 characters + echo "BUILDKITE_TOKEN length: ${#BUILDKITE_TOKEN}" + + # Step 2: Validate User and Comment + - name: Validate User and Comment + id: validate_user + env: + VALID_USERS: ${{ secrets.VALID_USERS }} + run: | + IFS=',' read -ra VALID_USERS_ARRAY <<< "$VALID_USERS" + COMMENT_BODY="${{ github.event.comment.body }}" + COMMENT_USER="${{ github.event.sender.login }}" + ACTION="${{ github.event.action }}" + echo "Valid users: ${VALID_USERS_ARRAY[@]}" + echo "Comment user: $COMMENT_USER" + echo "Action: $ACTION" + if [[ "${ACTION}" != "created" ]]; then + echo "Invalid action: ${ACTION}" + echo "valid=false" >> $GITHUB_ENV + exit 0 + fi + USER_IS_VALID=false + for VALID_USER in "${VALID_USERS_ARRAY[@]}"; do + if [[ "$VALID_USER" == "$COMMENT_USER" ]]; then + USER_IS_VALID=true + break + fi + done + if [[ "$USER_IS_VALID" == "false" ]]; then + echo "Invalid user: ${COMMENT_USER}" + echo "valid=false" >> $GITHUB_ENV + exit 0 + fi + if [[ ! "${COMMENT_BODY}" =~ ^/pre-merge-test ]]; then + echo "Invalid comment format: ${COMMENT_BODY}" + echo "valid=false" >> $GITHUB_ENV + exit 0 + fi + echo "valid=true" >> $GITHUB_ENV + + # Step 3: Stop the job if the user/comment is invalid + - name: Exit if Invalid User/Comment + if: env.valid == 'false' + run: echo "Exiting because the user/comment is invalid." + + # Step 4: Parse Environment Variables + - name: Parse Environment Variables + if: env.valid == 'true' + id: parse_envs + run: | + COMMENT_BODY="${{ github.event.comment.body }}" + ENV_ARGS=$(echo "${COMMENT_BODY}" | sed -E 's|/pre-merge-test ?||') + ALLOWED_ENVS=("aws" "azure" "gcp") + FINAL_ENVS=() + if [[ -z "${ENV_ARGS}" ]]; then + FINAL_ENVS+=("aws") + else + IFS=',' read -ra ENV_LIST <<< "${ENV_ARGS}" + for ENV in "${ENV_LIST[@]}"; do + ENV=$(echo "$ENV" | xargs) + if [[ " ${ALLOWED_ENVS[@]} " =~ " ${ENV} " ]]; then + FINAL_ENVS+=("$ENV") + fi + done + fi + if [[ ${#FINAL_ENVS[@]} -eq 0 ]]; then + FINAL_ENVS+=("aws") + fi + ENV_JSON="{" + for ENV in "${FINAL_ENVS[@]}"; do + ENV_JSON+="\"$ENV\":\"1\"," + done + ENV_JSON="${ENV_JSON%,}}" + echo "Parsed environments: ${ENV_JSON}" + echo "envs=${ENV_JSON}" >> $GITHUB_ENV + + # Step 5: Trigger Buildkite Pipeline + - name: Trigger Buildkite Pipeline + if: env.valid == 'true' + env: + BUILDKITE_TOKEN: ${{ secrets.BUILDKITE_TOKEN }} + run: | + PR_API_URL="${{ github.event.issue.pull_request.url }}" + AUTH_HEADER="Authorization: Bearer $BUILDKITE_TOKEN" + PR_DATA=$(curl -s -H "$AUTH_HEADER" "$PR_API_URL") + HEAD=$(echo "$PR_DATA" | jq -r '.head.ref') + COMMIT=$(echo "$PR_DATA" | jq -r '.head.sha') + PULL_REQUEST_REPO=$(echo "$PR_DATA" | jq -r '.head.repo.html_url') + BASE_BRANCH=$(echo "$PR_DATA" | jq -r '.base.ref') + PR_NUMBER=$(echo "$PR_DATA" | jq -r '.number') + TITLE=$(echo "$PR_DATA" | jq -r '.title') + BUILDKITE_PAYLOAD=$(jq -n \ + --arg commit "$COMMIT" \ + --arg branch "$HEAD" \ + --arg message "PR #$PR_NUMBER: $TITLE triggered by: ${{ github.event.sender.login }}" \ + --arg pull_request_repository "$PULL_REQUEST_REPO" \ + --argjson envs "$envs" \ + '{ + commit: $commit, + branch: $branch, + message: $message, + pull_request_repository: $pull_request_repository, + ignore_pipeline_branch_filters: true, + env: $envs + }') + BUILDKITE_URL="https://api.buildkite.com/v2/organizations/skypilot-1/pipelines/test-smoke-tests-required-before-merging/builds" + curl -X POST -H "$AUTH_HEADER" -H "Content-Type: application/json" -d "$BUILDKITE_PAYLOAD" "$BUILDKITE_URL"