stages: - stage: 安装依赖 tasks: - task: 安装依赖 cmds: - plugin: cmds params: cmds: - 'bash -lc '' set -e export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" nvm install 22.14.0 nvm use 22.14.0 node -v npm -v npm install ''' - stage: 创建发布分支 tasks: - task: 创建发布分支 cmds: - plugin: cmds params: cmds: - set -e - echo "🌿 基于 ${QCI_REPO_BRANCH} 创建发布分支 release/${MANAGER_NODE_VERSION}" - git config --global user.email "cloudbase-ci-bot@tencent.com" - git config --global user.name "cloudbase-ci-bot" - git fetch origin ${QCI_REPO_BRANCH} - git checkout -B release/${MANAGER_NODE_VERSION} origin/${QCI_REPO_BRANCH} - git push origin release/${MANAGER_NODE_VERSION} --force - echo "✅ 发布分支 release/${MANAGER_NODE_VERSION} 已创建并推送" - stage: 更新版本号 tasks: - task: 更新版本号 cmds: - plugin: cmds params: cmds: - "bash -lc ' \nset -e \nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\"\ \ ] && . \"$NVM_DIR/nvm.sh\"\nnvm use 22.14.0\necho \"\U0001F4DD 更新 package.json\ \ version -> ${MANAGER_NODE_VERSION}\"\n# 配置 git \ngit config --global user.email\ \ \"cloudbase-ci-bot@tencent.com\"\ngit config --global user.name \"cloudbase-ci-bot\"\ \n# 切换到 release 分支 \ngit fetch origin release/${MANAGER_NODE_VERSION} \n\ git checkout release/${MANAGER_NODE_VERSION}\n# 更新版本号 \nnpm version ${MANAGER_NODE_VERSION}\ \ --no-git-tag-version --allow-same-version\n# 提交版本号变更 \ngit add package.json\ \ \ngit commit -m \"chore(release): bump version to ${MANAGER_NODE_VERSION}\"\ \ || echo \"版本号无变更\" \ngit push origin release/${MANAGER_NODE_VERSION} \n\ '" - stage: Lint 检查 tasks: - task: Lint 检查 cmds: - plugin: cmds params: cmds: - npm run lint - stage: 构建 tasks: - task: 构建 cmds: - plugin: cmds params: cmds: - npm run build - stage: 产物检查 tasks: - task: 产物检查 cmds: - plugin: cmds params: cmds: - '# 脚本内容默认是单行命令执行。' - ' # 如需增加多行命令,请在开始和结束用"--"标识,例如:' - ' # --' - ' # if !(command -v unzip)' - ' # then' - ' # yum install -y unzip' - ' # fi' - ' # --' - ' # sh hello.sh' - '# 检查构建产物是否存在' - "if [ ! -f \"lib/index.js\" ]; then\n echo \"❌ 构建产物 lib/index.js 不存在\"\n\ \ exit 1\nfi" - "if [ ! -f \"types/index.d.ts\" ]; then\n echo \"❌ 类型声明文件 types/index.d.ts\ \ 不存在\"\n exit 1\nfi" - '# 输出当前版本号供后续阶段使用' - 'echo "当前发布版本: $(node -p "require(''./package.json'').version")"' artifacts: - ./lib/** - prompt: - msg: 人工审批 detail: '欢迎使用发布流水线,请确认以下信息: 构建触发人: $QCI_TRIGGER 分支: $QCI_REPO_BRANCH 提交时间:${QCI_COMMIT_DATE} 开发人员:${QCI_COMMIT_AUTHOR} 提交信息:${QCI_COMMIT_MESSAGE} 发布版本:${MANAGER_NODE_VERSION} 请确认版本号和变更内容,审批通过后将会自动发布到 npmjs.com' timeout_status: 6 env: {} to: nenneyu;lucyqzhang;royhyang if: $RELEASE_TYPE = latest - stage: npm 发布 tasks: - task: npm 发布 cmds: - plugin: cmds params: cmds: - '# 设置 npm registry' - npm config set registry https://registry.npmjs.org - '# 使用凭据注入的 NPM_TOKEN 进行认证' - echo "//registry.npmjs.org/:_authToken=${YARN_NPM_AUTH_TOKEN}" > ~/.npmrc - npm whoami - cat ~/.npmrc - npm publish --access public --tag ${RELEASE_TYPE} - stage: 生成并同步 changelog(docs) tasks: - task: 生成并同步 changelog cmds: - plugin: ci_changelog version: 1.1.0 params: to_ref: HEAD tag_pattern: ^v(\d+\.\d+\.\d+(?:-[\w.]+)?)$ enable_ai_summarize: true ai_model: hy3 bilingual: true enable_docs_sync: true docs_base_branch: master docs_branch_prefix: docs/manager-node-changelog-v commit_message: 'docs(manager-node): sync changelog for v${version}' force_push: true output_zh_path: $QCI_WORKSPACE/changelog_content.md output_en_path: $QCI_WORKSPACE/changelog_content_en.md enable_repo_changelog: false repo_base_branch: master repo_branch_prefix: changelog/v repo_changelog_path: CHANGELOG.md repo_commit_message: 'docs: update CHANGELOG.md for v${version}' repo_force_push: true main_package_path: package.json ai_api_url: ${AI_API_URL} ai_api_key: ${AI_API_KEY} docs_repo: https://git.woa.com/QBase/cloudbase-docs.git zh_path: docs/api-reference/manager/node/changelog.md en_path: i18n/en/docusaurus-plugin-content-docs/current/api-reference/manager/node/changelog.md repo_repo: https://git.woa.com/QBase/server-side-sdk/cloudbase-manager-node.git - stage: 生成changelog并打tag tasks: - task: 生成changelog并打tag cmds: - plugin: cmds params: cmds: - "bash -lc '\nset -e\nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\"\ \ ] && . \"$NVM_DIR/nvm.sh\"\nnvm use 22.14.0\necho \"==========================================\"\ \necho \"\U0001F4E6 写回插件生成的 changelog 并打 tag v${MANAGER_NODE_VERSION}\"\n\ echo \"==========================================\"\n# 配置 git\ngit config\ \ --global user.email \"cloudbase-ci-bot@tencent.com\"\ngit config --global\ \ user.name \"cloudbase-ci-bot\"\n# 切换到 release 分支\ngit fetch origin release/${MANAGER_NODE_VERSION}\n\ git checkout release/${MANAGER_NODE_VERSION}\n# 1. 写回插件生成的 changelog(仅 latest\ \ 版本)\necho \"\"\necho \"\U0001F4DD Step 1: 写回插件产物到 CHANGELOG.md\"\nif [\ \ \"$RELEASE_TYPE\" = \"latest\" ]; then\n if [ ! -f \"${QCI_WORKSPACE}/changelog_content.md\"\ \ ]; then\n echo \"❌ 插件产物 ${QCI_WORKSPACE}/changelog_content.md 不存在\"\ \n exit 1\n fi\n cat \"${QCI_WORKSPACE}/changelog_content.md\"\ \ CHANGELOG.md > CHANGELOG.md.new\n mv CHANGELOG.md.new CHANGELOG.md\n\ \ # 2. 提交 changelog\n echo \"\"\n echo \"\U0001F4DD Step 2: 提交变更\"\ \n git add CHANGELOG.md\n git commit -m \"docs(release): changelog\ \ for v${MANAGER_NODE_VERSION}\" || echo \"没有需要提交的变更\"\nelse\n echo \"\ ⏭️ RELEASE_TYPE !== latest,跳过 CHANGELOG.md 写回\"\nfi\n# 3. 打 tag\necho \"\ \"\necho \"\U0001F3F7️ Step 3: 创建 tag v${MANAGER_NODE_VERSION}\"\ngit tag\ \ -a \"v${MANAGER_NODE_VERSION}\" -m \"Release v${MANAGER_NODE_VERSION}\"\ \n# 4. 推送分支和 tag\necho \"\"\necho \"\U0001F680 Step 4: 推送到远程\"\ngit push\ \ origin release/${MANAGER_NODE_VERSION}\ngit push origin \"v${MANAGER_NODE_VERSION}\"\ \necho \"\"\necho \"✅ 完成!\"\necho \" - changelog.md: 已更新\"\necho \" \ \ - tag: v${MANAGER_NODE_VERSION}\"\n'" label: 命令行脚本 - stage: 创建合并请求 tasks: - task: 创建合并请求 cmds: - plugin: cmds params: cmds: - 'if [[ ${RELEASE_TYPE} = "latest" ]]; then echo "🔀 合并 release/${MANAGER_NODE_VERSION} 到 master" # 配置 git(CI 机器人身份,使用 CI 内置 git 凭据) git config --global user.email "cloudbase-ci-bot@tencent.com" git config --global user.name "cloudbase-ci-bot" # 拉取最新 master 和 release 分支 git fetch origin master git fetch origin release/${MANAGER_NODE_VERSION} # 切到 master 并合并 release 分支 git checkout master git merge --no-ff origin/release/${MANAGER_NODE_VERSION} -m "chore(release): v${MANAGER_NODE_VERSION}" # 直接推送到 master(不走 MR) git push origin master echo "✅ 已合并并推送到 master" fi' if: $RELEASE_TYPE = latest - stage: 企微群通知 tasks: - task: 企微群通知 cmds: - plugin: cmds params: cmds: - echo "📦 @cloudbase/manager-node v${MANAGER_NODE_VERSION} 发布成功" > ${QCI_WORKSPACE}/wework_message.md - echo "" >> ${QCI_WORKSPACE}/wework_message.md - cat ${QCI_WORKSPACE}/changelog_content.md >> ${QCI_WORKSPACE}/wework_message.md - cat ${QCI_WORKSPACE}/wework_message.md - plugin: message_wework_group params: c_type: text env_variable: _WEWORK_GROUP_ID mentioned: lucyqzhang;nenneyu content_path: ${QCI_WORKSPACE}/wework_message.md group_id: ww150005365489083 if: $RELEASE_TYPE = latest version: '2.0' worker: label: JOB_MATRIX_DEVCLOUD language: node_js-20.18.0 tools: - envs: [] name: '' version: '' is_auto_interrupt: true env: AI_API_KEY: type: string secret: vur44V/GjXswyJwv3aHGdaDKqwJRyWz+gTxPKzwIX57Q74Fhm3GML5a9yiFzkd/VsqTGvgPcRWM8995Erfj8je3c1ScSb8hTjAU89NF6pOHoPVFr5qyIsOYk35e6wS4jUXZ3Er3o/UWzWzcb28UBzHFz5X/MQtYrGKsmv4/ahaUjf1gI7tiFqJcjQPe7KLq0wbuUjiFUiBteTe+hrMiNpzBNbmyw/34TWIWr6MhLFRNqrn0gp8Dbch0T8jqf2RAl6bM42OGsUXSf42/aSHLeCL6r4FAAW2nV8QrtN4il976WzGego+pKMziofQVCq6Ol46t4tVsal074k3a47R/IgC0XYsTCdIevrAdcNyK/jhwhcaw2EOCmVBC0KZ2s3fUhzRe1IDUKEVxkRykdn5Zb2dRysI3rU+HqjGDBkbKNAD0iDLH8aoafVFi1Sl+9TxnhbG2p/gzcrDLwNR4jEarWA8Na7himZS2S7uVNuS28W1gYxkjmgnm5AqxXcB0K+SUDcRyLACzmTNLZmac4lh5z69hJk1t2mzTzXvfXGxCMuF8XXNRlQLCNs3/7xD4ibJUonL7w2F1DnUXRQN7KPdp7fIXFAG7vSao69efATK1za4KdyZOvRr4q8nwhY5uyGoMfDfmt8gRo9uDP+wnZkJNdshmf8VDNOpfzoEm4pljcI8mZo/QM/sH31ZoY2QfhLJTLquSaZhPgD1hP4OjpUCPLNNHnBfAeEJsXMiutBilbAk+xo8i/RUU+6+CGh1KOrhZQEycdx6xqdCF5WBM85jLclpMw0bWYR8aRgy2ABWCsiFqTbpO8y8IufgxZG95mp5xLs0toi6stDFG9eCJ7CFbZDKluypIxSYiv/k8vNe152KYTTrERps7Y3ox5D5ofDdZGkXULeBoC0ZGorpS2Vs2yujRnoCSN0vV8GjliosMSX0wuyh3060vFJjOOX10YP1MA9UikH3uayrTWlviI4oqZROpKryYnxRkVgcKpiyyHWidfhrRX8efh3RCIRmcBi62r5gXG2JTCYSoft92u173KadcDtY6DCdzLCSwi4jl+BEytbPNfdD/xVsqJ0mRUzxjwpfJe9DywTouytttvW541hzZrG8jblkftZIVfGfg/7wwcWHAYzmkwVyDHNOIqdBxBl270jcCT6TPb6RrW7myHfJLdxfREqmIyGd7RMKq8uf953b237HsBR36f7PoAjXH2nXZgtshwbZBAVbH6dwbwP8tsy+RYPp7JGWcCpovdh7229ZOalZFIDKwcM+MgaanMNbMuKStKeOmLskbXaDXNZ7AUfEkjFhJdXHnkSVViwooRb5dF9loC+6SAlis+kwe+t9K+supJ6OThYQ3G72crl01SJsx4qVgAmoRqw4LBEuDYHRfwC6O7UcmVgKQyRWxJHsmhRqE3f/lGuIoLXpujmWtZN4JmzodRLBv4gSRRqILIAe32jOBHvRULNY0qAOcvsDdsG3/lKDLzuRM3HkFINseIG1VMsVmfG3jnbX+OjcM1DtTxnwVcwLTCvNMjlpQEEV6P4wd2PSjXZl0b/ia1IZV6O8LMEqBQV9bPRFHcceeAXXRnCkHFkieGLAbTKNkTWsoeaphLZ9/g8XaklAbrAJTP3/9eKdYEOkEI8QOlXNskW/0VU+9XW8Hbpaz/PRetyPDvDQ6KMBurbDXxceQeeqiYslv1GjGB2/DAiyA= AI_API_URL: https://test-6g2rfs50c69b7fb8.api.tcloudbasegateway.com/v1/ai/cloudbase/chat/completions MANAGER_NODE_VERSION: value: '' type: string require: true RELEASE_TYPE: value: beta type: select option: beta;latest YARN_NPM_AUTH_TOKEN: type: string readonly: true secret: xd064H3Sd1KJSDSb8UamBMLnSps8RGqvpx40l2QlN2BrirV2I5KGEYVvmJo6o9q7vt86EHlDRT5UyTIIi1golfQ3UEAYDzEUF+/nAIW93rQYeFbiHx/kZV9zuhAMeK35gM7B+IlqZoPbEIFjinnmduOUrC8BFqK+9ei23GF8POw= finally: success: cmds: - plugin: cmds params: cmds: - "# 清理分支\nif [ \"$RELEASE_TYPE\" = \"beta\" ]; then\n echo \"\U0001F9F9\ \ 清理 beta 分支\"\n git checkout master \n git branch -d release/${MANAGER_NODE_VERSION}\ \ \n git push origin --delete release/${MANAGER_NODE_VERSION} \n echo\ \ \"✅ beta 分支已清理\"\nelse\n echo \"⏭️ RELEASE_TYPE !== beta,跳过分支清理\"\n\ fi" label: 清理分支 - plugin: message_wework_single params: c_type: text content: '📦 @cloudbase/manager-node v${MANAGER_NODE_VERSION} 发布成功 提交: ${QCI_COMMIT_MESSAGE} tag: v${MANAGER_NODE_VERSION}' to: nenneyu;lucyqzhang failure: cmds: - plugin: cmds params: cmds: - "# 清理分支\nif [ \"$RELEASE_TYPE\" = \"beta\" ]; then\n echo \"\U0001F9F9\ \ 清理 beta 分支\"\n git checkout master \n git branch -d release/${MANAGER_NODE_VERSION}\ \ \n git push origin --delete release/${MANAGER_NODE_VERSION} \n echo\ \ \"✅ beta 分支已清理\"\nelse\n echo \"⏭️ RELEASE_TYPE !== beta,跳过分支清理\"\n\ fi" label: 清理分支 - plugin: message_wework_single params: c_type: text content: '📦 @cloudbase/manager-node v${MANAGER_NODE_VERSION} 发布失败 提交: ${QCI_COMMIT_MESSAGE} tag: v${MANAGER_NODE_VERSION}' to: lucyqzhang;nenneyu maximum_builds: 1 tapd_workspace_id: '20422223'