← 返回列表
2026-04-24T05:49:36.472ZJenkinsGitlabDevops

搭建 Android Gitlab 多分支,动态参数自动化流程

Android 自动化流程

  1. 方案概述 实现GitLab、Jenkins、DevOps Service与飞书机器人的无缝集成,以支持多分支、多构建参数的持续集成与持续部署(CI/CD)流程。自动化构建和部署过程,并通过飞书机器人及时获取构建与部署状态。

  2. 工具栈

  • 代码库: GitLab
  • 持续集成:Jenkins + Gitlab Runner
  • DevOps服务:DevOpService API
  • 消息通知:飞书机器人
  1. 流程架构 Tips: commit信息需规范提交,格式:[变体] 更新xxxx

  2. 环境准备

  3. Jenkins必要插件:

  • Pipeline Plugin
  • Generic Webhook Trigger
  • HTTP Request Plugin(用于与DevOpService集成,可选插件,请求方式有很多)
  1. 搭建 GitLab Runner https://gitlab.cn/docs/runner/install/
  2. 配置 Runner
  • 获取注册密钥

  • 在部署的Gitlab Runner 服务器上面注册服务

  • 配置参数:

    • Gitlab 域名:https://gitlab.demo.cn
    • 运行器名称:默认即可,直接回车
    • 使用的引擎:docker
    • 默认镜像:curlimages/curl:latest
  • 注册成功后,Gitlab Runner 会新增一个运行器(test)

  1. Gitlab Runner 流水线逻辑
variables:
  APP_VERSION: "1.0.0"

stages:
  - trigger_jenkins
  - notify

trigger_jenkins_job:
  stage: trigger_jenkins
  image: curl:latest
  script:
    - |
      echo "Git branch: $CI_COMMIT_REF_NAME"
      echo "Commit message: $CI_COMMIT_MESSAGE"

      # 从commit message提取[MATRIX]
      extracted_matrix=$(echo "$CI_COMMIT_MESSAGE" | sed -n 's/^$$\([^]]*\)$$.*/\1/p')

      if [[ -z "$extracted_matrix" ]]; then
        echo "未提取到 MATRIX 参数,跳过 Jenkins 触发任务,作业中止。"
        exit 0
      fi

      if [[ -n "$extracted_matrix" ]]; then
        MATRIX="$extracted_matrix"
      fi

      echo "Using MATRIX = $MATRIX"

      cat > payload.json << EOF
      {
        "ref": "refs/heads/$CI_COMMIT_REF_NAME",
        "parameters": {
          "BRANCH": "$CI_COMMIT_REF_NAME",
          "MATRIX": "$MATRIX",
          "FeishuRobot": "$Robot"
        }
      }
      EOF
      
      curl -X POST "https://$JENKINS_DOMAIN/generic-webhook-trigger/invoke?token=$JENKINS_TOKEN" \
        -H "Content-Type: application/json" \
        -d @payload.json

notify_feishu_job:
  stage: notify
  image: ubuntu:20.04
  script:
    - |
      # 1. 登录获取 access_token
      LOGIN_RESPONSE=$(curl --silent --location --request POST 'https://$DEVOPS_DOMAIN/ums/v1/user/login' \
        --header 'Content-Type: application/json' \
        --data-raw "{
          \"email\": \"$LOGIN_EMAIL\",
          \"password\": \"$LOGIN_PASSWORD\"
        }")

      # 2. 解析 access_token
      ACCESS_TOKEN=$(echo "$LOGIN_RESPONSE" | jq -r '.access_token')

      if [ -z "$ACCESS_TOKEN" ]; then
        echo "获取access_token失败,退出"
        exit 1
      fi

      echo "成功获取access_token"
      
      # 3. 组装通知消息
      TITLE="Gitlab作业失败通知 - $CI_PROJECT_NAME"
      CONTENT="流水线ID: $CI_PIPELINE_ID\n分支: $CI_COMMIT_REF_NAME\n作业: Gitlab流水线失败!"
      COMMIT_INFO="$CI_COMMIT_MESSAGE"
      SUBMITTER="$GITLAB_USER_NAME"

      # 组装JSON请求体
      cat > notify_payload.json << EOF
      {
        "title": "$TITLE",
        "content": "$CONTENT",
        "commit_info": "$COMMIT_INFO",
        "submitter": "$SUBMITTER",
        "scan_result_link": "",
        "webhook_url": "$FEISHU_WEBHOOK_URL",
        "webhook_secret": "$FEISHU_WEBHOOK_SECRET"
      }
      EOF

      # 发送请求
      curl --location --request POST 'https://$DEVOPS_DOMAIN/ims/v1/aliyun/feishu/notify' \
        --header 'Content-Type: application/json' \
        --header "Authorization: Bearer $ACCESS_TOKEN" \
        --data-binary @notify_payload.json
  when: on_failure
  allow_failure: false

Tips: 固定参数都写进Gitlab系统变量,可维护性高,不用改yml配置

  • 当提交/合并代码,Runner运行器会自动获取相关参数提交给Jenkins任务