1222 字
6 分钟

CNB擂台赛记录

2025-08-17

前言:前不久有幸作为擂主参加了第一期CNB技术攻守擂台赛cnb/tutorial/action-challenge · Cloud Native Build,主题为GitHub Action 迁移 ,其中遇到了一个issueCNB 云原生构建是否支持全部由API调用,如何打造出一个在自己网站上触发并监控构建流程并下载产物的流水线(Github Actions已实现) · Issue #8 · cnb/tutorial/action-challenge,解答的时候制作了这么一个应用,后面完善了一下分享出来,可以作为api触发流水线工作的参考示例

开源地址:haorwen/cnb-build-platform · Cloud Native Build

文章最开始先来推广一下我自己写的github action格式转cnb.yml格式的小工具action2cnb,助力github迁移,觉得好用的可以给仓库点点star~

接下来正式开始介绍本文的小工具~


核心功能一览#

  • 一键触发构建:无需切换到 CLI 或控制台,Web 页面点击即可。
  • 实时监控进度:所有阶段状态/耗时/日志地址实时可视化。
  • 历史构建归档:构建历史(含状态、耗时、下载链接)本地持久化存储。
  • 一键下载产物:构建成功后页面即可直接下载产物,无需手动查找。
  • 日志直达跳转:可一键跳转到 CNB 平台原生日志详情页。
  • 配置极简:只需填好 API Token、仓库名等基础参数即可。

安装与配置#

1. 环境准备#

  • Python 3.8+。
  • 推荐包管理工具 uv

2. 依赖安装#

Terminal window
pip install uv
uv sync

3. 用户配置区#

**在 **cnb_build_platform.py 顶部,填写你的访问令牌、仓库名、流水线等核心参数:

# 用户配置区域
ACCESS_TOKEN = "YOUR_ACCESS_TOKEN"       # 你的CNB平台API访问令牌
REPO_PATH = "username/repo-name"         # 仓库路径,例如: "haorwen/cnb-build-platform"
PIPELINE_NAME = "api_trigger_build"      # 流水线名称
BUILD_ENV = {"buildtrigger": "web_ui"}   # 触发构建时需要传入的环境变量
ARTIFACT_NAME = "trigger.tar.gz"         # 产物名称,与 .cnb.yml 中定义一致

Tip:推荐将 Token 等敏感信息用秘钥仓库管理。代码默认是明文便于学习和测试。


构建流程与代码实现详解#

1. 定义 CNB 工作流(.cnb.yml)#

要保证****支持 API 触发,流水线名称需以 api_trigger_ 开头,此处为示例:

main:
api_trigger_build:
  - docker:
      image: node:22
    stages:
      - name: build
        script: |
          echo "start build..."
          echo "$buildtrigger" > trigger.txt
          tar -czvf trigger.tar.gz trigger.txt
      - name: 上传附件
        image: cnbcool/attachments:latest
        settings:
          attachments:
            - ./trigger.tar.gz

2. Web 服务启动与主逻辑#

from pywebio import start_server
def main():
   print("🚀 启动 CNB构建平台Web界面...")
   print("📍 访问地址: http://localhost:9004")
   start_server(web_main, port=9004, host='0.0.0.0', debug=False, cdn=True)
if __name__ == "__main__":
   main()

页面会在本地 9004 端口运行,用户浏览器访问即可。

3. 一键触发构建#

自动获取最新 commit,启动云端流水线:

def start_build(self, branch="main", env=None):
   url = f"{self.base_url}/build/start"
   data = {
       "branch": branch,
       "env": env or BUILD_ENV,
       "event": PIPELINE_NAME
  }
   response = requests.post(url, headers=self.headers, json=data)
   return response.json()

封装好通用 API 接口,参数灵活可扩展,适配多分支与多流水线场景。

4. 实时监控流水线进度#

利用 PyWebIO 的输出能力,实时刷新流水线与每个阶段的状态:

def wait_for_build_completion(self, build_sn, ...):
   while time.time() - start_time < max_wait_time:
       status_info = self.get_build_status(build_sn)
       status = status_info.get('status', 'unknown')
       ...
       # 构建状态可视化
       put_table([
          ['构建状态', status_display],
          ['已用时间', f"{elapsed_time} 秒"],
          ['构建序列号', build_sn]
      ])
       ...
       if status == 'success':
           put_success("🎉 构建成功完成!")
           return status_info
       elif status in ['failed', 'error']:
           put_error(f"❌ 构建失败,状态: {status}")
           return status_info
       ...

Web UI 上所有进度一目了然,失败和超时都会友好提示。

5. 构建历史本地归档#

每次构建信息写入 SQLite 数据库,便于查阅/统计:

def init_db():
   conn = sqlite3.connect(DB_FILE)
   c = conn.cursor()
   c.execute('''
      CREATE TABLE IF NOT EXISTS cnb_build_logs (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          build_sn TEXT,
          ...
          status TEXT,
          download_url TEXT,
          build_log_url TEXT,
          ...
      )
  ''')
   conn.commit()
   conn.close()

支持“最近 24 条记录”的快速查阅和操作。

6. 构建产物一键下载#

页面按钮点一下即可下载最新制品,不再手动查找链接:

def get_artifact_download_url(self, commit_sha):
   return f"https://cnb.cool/{self.repo_path}/-/commit-assets/download/{commit_sha}/{ARTIFACT_NAME}"

结合历史归档和状态校验,只显示成功构建的产物,安全可靠。

本项目已开源,遵循 MIT 协议


CNB擂台赛记录
https://demo-firefly.netlify.app/posts/cnb-action-challenge/
作者
haorwen
发布于
2025-08-17
许可协议
CC BY-NC-SA 4.0
上次编辑日期: 2025-08-17

部分信息可能已经过时

目录

Loading ... - Loading ...
封面
Loading ...
Loading ...
0:00 / 0:00