{"id":14984702,"url":"https://github.com/gaoding-inc/ci-task-runner","last_synced_at":"2025-10-08T12:49:20.336Z","repository":{"id":66162636,"uuid":"73453078","full_name":"gaoding-inc/ci-task-runner","owner":"gaoding-inc","description":"大型代码仓库按需构建解决方案","archived":false,"fork":false,"pushed_at":"2017-12-21T04:09:11.000Z","size":326,"stargazers_count":101,"open_issues_count":1,"forks_count":19,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-08-17T01:43:09.993Z","etag":null,"topics":["ci","git","gitlab-ci","glup","grunt","jenkins-ci","svn","task-runner","webpack"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gaoding-inc.png","metadata":{"files":{"readme":"README.ZH-CN.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-11-11T06:47:39.000Z","updated_at":"2024-11-27T09:08:48.000Z","dependencies_parsed_at":"2023-05-04T09:47:17.083Z","dependency_job_id":null,"html_url":"https://github.com/gaoding-inc/ci-task-runner","commit_stats":{"total_commits":326,"total_committers":6,"mean_commits":"54.333333333333336","dds":"0.16257668711656437","last_synced_commit":"c6ab05ed5dd59df9a0acddac1ddb84946f9178d6"},"previous_names":["aui/git-webpack","aui/module-watcher"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/gaoding-inc/ci-task-runner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gaoding-inc%2Fci-task-runner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gaoding-inc%2Fci-task-runner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gaoding-inc%2Fci-task-runner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gaoding-inc%2Fci-task-runner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gaoding-inc","download_url":"https://codeload.github.com/gaoding-inc/ci-task-runner/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gaoding-inc%2Fci-task-runner/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278948019,"owners_count":26073747,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ci","git","gitlab-ci","glup","grunt","jenkins-ci","svn","task-runner","webpack"],"created_at":"2024-09-24T14:09:32.691Z","updated_at":"2025-10-08T12:49:20.316Z","avatar_url":"https://github.com/gaoding-inc.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ci-task-runner\n\n[![NPM Version](https://img.shields.io/npm/v/ci-task-runner.svg)](https://npmjs.org/package/ci-task-runner)\n[![NPM Downloads](http://img.shields.io/npm/dm/ci-task-runner.svg)](https://npmjs.org/package/ci-task-runner)\n[![Node.js Version](https://img.shields.io/node/v/ci-task-runner.svg)](http://nodejs.org/download/)\n[![Travis-ci](https://travis-ci.org/huanleguang/ci-task-runner.svg?branch=master)](https://travis-ci.org/huanleguang/ci-task-runner)\n[![Coverage Status](https://coveralls.io/repos/github/huanleguang/ci-task-runner/badge.svg)](https://coveralls.io/github/huanleguang/ci-task-runner)\n\n[[English]](./README.md) - [[简体中文]](./README.ZH-CN.md)\n\n这是一个基于 NodeJS 编写的多进程构建任务调度器，它支持增量与并行构建，可以大幅度提高服务器端构建速度。\n\nci-task-runner 作为一个通用的任务调度器，它并不是为了取代 Jenkins、Gitlab-CI 等持续集成工具或 Webpack、Gulp 等构建程序，而是提高它们运行任务的速度。\n\n\u003e “我们将一个大型前端项目迁移到持续集成系统进行构建后，每修改一个小文件都需要近 10 分钟的时间才能完成构建完成，于是我们开发了 ci-task-runner，将这个过程缩短到 1 分钟左右”。[详情](https://github.com/huanleguang/ci-task-runner/issues/7)\n\n## 原理\n\n1\\. **增量构建**：\n\n在中大型项目中，如果因为修改一个小文件就需要全量构建，这样构建速度必然会非常慢。为了解决这个问题，ci-task-runner 会对比 Git 或 Svn 的提交记录，只构建有差异的文件。\n\n2\\. **并行构建**：\n\n如果有多个任务需要执行，ci-task-runner 会根据当前服务器 CPU 核心的数量启动新的进程，以多进程并行运行的方式加快任务完成。\n\n## 安装\n\n```shell\nnpm install ci-task-runner -g\n```\n\n## 入门\n\nci-task-runner 的任务都是在 JSON 配置文件定义的，在项目中新建一个 `.ci-task-runner.json` 配置，范例：\n\n```json\n{\n  \"tasks\": [\"mod1\", \"mod2\", \"mod3\"],\n  \"repository\": \"git\",\n  \"program\": \"cd ${taskPath} \u0026\u0026 webpack --color\"\n}\n```\n\n然后在项目目录运行命令即可执行上述定义的 `tasks`：\n\n```shell\nci-task-runner\n```\n\n上述例子中：仓库中的 mod1、mod2、mod3 目录有变更则会依次执行 `cd ${taskPath} \u0026\u0026 webpack --color`。\n\n通过入门教程可以看到，ci-task-runner 的任务概念与其他任务运行器最大的不同是：每一个任务都是基于代码仓库中的文件或文件夹。\n\n\u003e 在服务器上可以使用 CI 工具启动 ci-task-runner，参考： [持续集成](#持续集成)。\n\n## 配置\n\n### `tasks`\n\n任务目标列表。目标可以是仓库中的任意目录或文件。\n\n简写形式：`{string[]}`\n\n```json\n{\n  \"tasks\": [\"mod1\", \"mod2\", \"mod3\"]\n}\n```\n\n进阶形式：`{Object[]}`\n\n```json\n{\n  \"tasks\": [\n      {\n          \"name\": \"mod1\",\n          \"path\": \"path/mod1\",\n          \"dependencies\": [\"common/v1\"],\n          \"program\": \"cd ${taskPath} \u0026\u0026 gulp\"\n      },\n      \"mod2\",\n      \"mod3\"\n  ]\n}\n```\n\n1. [`dependencies`](#dependencies) 与 [`program`](#program) 会继承顶层的配置，也可以覆盖它们\n2. [`tasks`](#tasks) 支持配置并行任务，参考 [多进程并行任务](#多进程并行任务)\n\n### `cache`\n\nci-task-runner 缓存文件写入路径，用来保存上一次任务的信息。默认为：`node_modules/.cache/ci-task-runner/${Package.version}.json`\n\n### `dependencies`\n\n任务目标外部依赖列表。如果任务目标依赖了目录外的库，可以在此手动指定依赖，这样外部库的变更也可以触发任务运行。\n\n\u003e ci-task-runner 使用 Git 或 Svn 来实现变更检测，所以其路径必须已经受版本管理。\n\n### `repository`\n\n设置仓库的类型。支持 git 与 svn。\n\n### `parallel`\n\n设置最大并行进程数。默认值为 `require('os').cpus().length`。\n\n### `program`\n\n执行任务的程序配置。\n\n简写形式：`{string}`\n\n```json\n{\n  \"program\": \"cd ${taskPath} \u0026\u0026 node build.js\"\n}\n```\n\n进阶形式：`{Object}`\n\n```json\n{\n  \"program\": {\n    \"command\": \"node build.js\",\n    \"options\": {\n      \"cwd\": \"${taskPath}\",\n      \"timeout\": 360000\n    }\n  }\n}\n```\n\n#### `program.command`\n\n设置执行的命令。\n\n\u003e 程序会将 `${options.cwd}/node_modules/.bin` 与 `${process.cwd()}/node_modules/.bin` 加入到环境变量 `PATH` 中，因此可以像 `npm scripts` 一样运行安装在本地的命令。\n\n#### `program.options`\n\n设置进程的选项。\n\n* `cwd` 当前子进程的工作目录\n* `env` 环境变量\n* `timeout` 超时时间\n* `uid` 设置进程的用户标识\n* `gid` 设置进程的组标识\n\n#### 变量\n\n`program` 支持的字符串变量：\n\n* `${taskName}` 任务名称\n* `${taskPath}` 任务目标绝对路径\n* `${taskDirname}` 等同于 `path.diranme(taskPath)`，[详情](https://nodejs.org/api/path.html#path_path_dirname_path)\n\n## 配置范例\n\n### 多进程并行任务\n\n如果任务之间没有依赖，可以开启多进程运行任务，这样能够充分利用多核 CPU 加速运行。\n\ntasks 最外层的任务名是串行运行，如果遇到数组则会并行运行：\n\n```json\n{\n  \"tasks\": [\"dll\", [\"mod1\", \"mod2\", \"mod3\"]],\n  \"repository\": \"git\",\n  \"program\": \"cd ${taskPath} \u0026\u0026 webpack --color\"\n}\n```\n\n上述例子中：当 dll 构建完成后，mod1、mod2、mod3 会以多进程的方式并行构建。\n\n### 依赖变更触发构建\n\n```json\n{\n  \"tasks\": [\"dll\", [\"mod1\", \"mod2\", \"mod3\"]],\n  \"dependencies\": [\"dll\", \"package.json\"],\n  \"repository\": \"git\",\n  \"program\": \"cd ${taskPath} \u0026\u0026 webpack --color\"\n}\n```\n\n上述例子中：当 dll 和 package.json 变更后，无论其他任务目标是否有修改都会被强制构建。\n\n### 自动更新 Npm 包\n\n```json\n{\n  \"tasks\": [\n    {\n      \"name\": \"package.json\",\n      \"program\": \"npm install\"\n    },\n    \"dll\",\n    [\"mod1\", \"mod2\", \"mod3\"]\n  ],\n  \"dependencies\": [\"package.json\", \"dll\"],\n  \"repository\": \"git\",\n  \"program\": \"cd ${taskPath} \u0026\u0026 webpack --color\"\n}\n```\n\n上述例子中：当 package.json 变更后，则会执行 `npm install` 安装项目依赖，让项目保持最新。\n\n## 持续集成\n\n使用 CI 工具来在服务器上运行 ci-task-runner。\n\n**相关工具：**\n\n* gitlab: gitlab-ci\n* github: travis\n* Jenkins\n\nCI 工具配置请参考相应的文档。\n\n\u003e Webpack 遇到错误没退出的问题解决方案：[Webpack configuration.bail](http://webpack.github.io/docs/configuration.html#bail)\n\n## 授权协议\n\n[MIT](./LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgaoding-inc%2Fci-task-runner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgaoding-inc%2Fci-task-runner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgaoding-inc%2Fci-task-runner/lists"}