是否可以编写GitHub Action将指定项目的特定列迁移到另一个项目?
方案可行性说明
该需求有完全可行的实现方案,核心通过GitHub官方提供的Projects API配合自定义GitHub Action即可实现,Classic版项目和新版V2项目均支持该操作。
核心实现步骤
- 首先确认待操作的项目类型,是Classic Project还是Projects V2,两类的API调用参数有明显区别
- 生成具备项目读写权限的Personal Access Token(PAT):Classic项目需要勾选
repo和project权限域,V2项目需要勾选project读写权限,将生成的PAT存到运行Action的仓库Secrets中,可命名为PROJECT_MIGRATION_TOKEN - 编写Action工作流文件,存储到仓库
.github/workflows/目录下,触发规则可按需设置为定时触发、手动触发或者绑定事件触发(比如新卡片加入源列时自动触发迁移) - 核心逻辑分三步:调用API拉取源项目指定列的所有卡片、调用API在目标项目对应列创建相同内容的卡片、按需选择是否删除源项目的原卡片(移动场景开启,复制场景关闭即可)
Classic项目工作流代码示例
以下为手动触发的基础样例,可按需扩展规则:
name: 迁移项目列卡片 on: workflow_dispatch: # 配置为手动触发 inputs: source_column_id: description: "源项目列ID" required: true target_column_id: description: "目标项目列ID" required: true jobs: migrate-cards: runs-on: ubuntu-latest steps: - name: 执行卡片迁移 env: GITHUB_TOKEN: ${{ secrets.PROJECT_MIGRATION_TOKEN }} SOURCE_COL_ID: ${{ github.event.inputs.source_column_id }} TARGET_COL_ID: ${{ github.event.inputs.target_column_id }} run: | # 拉取源列所有卡片 cards=$(curl -H "Authorization: token $GITHUB_TOKEN" "https://api.github.com/projects/columns/$SOURCE_COL_ID/cards" | jq -c '.[]') # 遍历创建到目标列 for card in $cards; do note=$(echo $card | jq -r '.note') content_id=$(echo $card | jq -r '.content_id') content_type=$(echo $card | jq -r '.content_type') # 在目标列创建新卡片 curl -X POST -H "Authorization: token $GITHUB_TOKEN" \ -H "Accept: application/vnd.github.v3+json" \ "https://api.github.com/projects/columns/$TARGET_COL_ID/cards" \ -d "$(jq -n --arg note "$note" --argjson content_id $content_id --arg content_type "$content_type" '{note: $note, content_id: $content_id, content_type: $content_type}')" # 如果是移动场景而非复制场景,放开下方注释删除源列原卡片 # card_id=$(echo $card | jq -r '.id') # curl -X DELETE -H "Authorization: token $GITHUB_TOKEN" "https://api.github.com/projects/columns/cards/$card_id" done
注意事项
- 上述样例仅针对Classic Project编写,如果是Projects V2,需要将API请求调整为GraphQL格式,参数对应修改为项目ID、字段ID、工作项ID即可
- Ubuntu系统的Action运行器默认预装
jq工具,不需要额外配置依赖 - 操作前建议先备份源列的卡片内容,避免误操作导致数据丢失
- 权限配置要确保PAT对源和目标两个项目都有读写权限,如果项目归属于组织,需要给PAT开通对应组织的访问权限
内容的提问来源于stack exchange,提问作者Harsh arora
相关产品推荐
相关产品推荐

