name: trigger-jenkins-oss # 打 tag 时触发 Jenkins 构建开源镜像并推送到镜像仓库。 # 单仓多服务:一次 tag 构建全部服务,镜像 tag 形如 iotlcm-<服务>-<版本>。 # main 分支的日常提交不触发构建。 on: push: tags: - 'v*' workflow_dispatch: inputs: services: description: '要构建的服务(逗号分隔,如 sms,docs;留空 = 全部)' required: false default: '' # 同一 ref 连续触发时取消旧任务,只跑最新的 concurrency: group: ${{ github.ref }} cancel-in-progress: true jobs: trigger: runs-on: host steps: - name: 触发 Jenkins 镜像构建 env: JU: ${{ secrets.JENKINS_USER }} JT: ${{ secrets.JENKINS_API_TOKEN }} JURL: ${{ secrets.JENKINS_URL }} JOB_PATH: ${{ secrets.JENKINS_JOB_PATH }} TAG_NAME: ${{ github.ref_name }} INPUT_SERVICES: ${{ github.event.inputs.services }} run: | set -eu # 只有 tag 推送才构建;手动触发时按当前 ref 取 tag 名 case "${GITHUB_REF:-}" in refs/tags/v*) ;; *) if [ "${GITHUB_EVENT_NAME:-}" != "workflow_dispatch" ]; then echo "非 tag 推送,跳过:${GITHUB_REF:-unknown}" exit 0 fi ;; esac if [ -z "${TAG_NAME:-}" ]; then echo "未取到 tag 名,退出" exit 1 fi # 单仓:默认整仓构建;手动触发可指定服务子集(目录名或其 iotlcm-* 镜像名) SERVICES="${INPUT_SERVICES:-}" if [ -z "$SERVICES" ]; then SERVICES="all"; fi # job 在 Jenkins 文件夹下的路径(组织密钥 JENKINS_JOB_PATH), # 例如 job/iotlcm-opensrc/job/iotlcm-oss-build。 # 用密钥而非硬编码,Jenkins 里移动 job 时不用改 workflow。 JP="${JOB_PATH:-job/iotlcm-oss-build}" echo "仓库:${GITHUB_REPOSITORY:-iotlcm} 版本:$TAG_NAME 服务:$SERVICES job:$JP" WORK=$(mktemp -d) trap 'rm -rf "$WORK"' EXIT # 取 CSRF crumb curl -s -c "$WORK/cj" -u "$JU:$JT" "$JURL/crumbIssuer/api/json" -o "$WORK/crumb.json" CR=$(python3 -c "import json;print(json.load(open('$WORK/crumb.json'))['crumb'])") # 触发参数化任务 code=$(curl -s -o "$WORK/out" -w '%{http_code}' -X POST -b "$WORK/cj" -u "$JU:$JT" \ -H "Jenkins-Crumb: $CR" \ --data-urlencode "SERVICES=$SERVICES" \ --data-urlencode "VERSION=$TAG_NAME" \ --data-urlencode "FORCE=true" \ "$JURL/$JP/buildWithParameters") echo "Jenkins 触发 HTTP $code" if [ "$code" != "201" ] && [ "$code" != "200" ] && [ "$code" != "302" ] && [ "$code" != "303" ]; then echo "触发失败:" cat "$WORK/out" exit 1 fi LINK="$JURL/$JP/" echo "==========================================" echo "Jenkins 构建:$LINK" echo "==========================================" echo "::notice title=Jenkins 镜像构建::[$LINK]($LINK)"