{"_id":"@arkxos/choerodon-devops","_rev":"4-c2aabb79e2bcb0919f0b324682e53c8f","name":"@arkxos/choerodon-devops","dist-tags":{"latest":"2.0.12"},"versions":{"2.0.10":{"name":"@arkxos/choerodon-devops","version":"2.0.10","keywords":[],"license":"ISC","_id":"@arkxos/choerodon-devops@2.0.10","maintainers":[{"name":"arkxos","email":"arkxos@qq.com"}],"contributors":[{"name":"choerodon"}],"dist":{"shasum":"22bdbd664ecbafb56e6f4d2a39462dd99378d505","tarball":"https://registry.npmjs.org/@arkxos/choerodon-devops/-/choerodon-devops-2.0.10.tgz","fileCount":1846,"integrity":"sha512-a5YE7/LgvrBef1TrFxysPDiF/zcbzxWbE8+WbhGe8ydgSwlP/h3UEITTrmJXTXyJEcvr79aK69K8qP7B5jRM3Q==","signatures":[{"sig":"MEUCIB+VZdY1eEFr4f/jZsBxK8F/WvK5QOIqIKCVRajAs1MqAiEA+6K3CLPEgjlpK5tRzFVUu8xti9tlX++GoJzBv1mab0w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9812042},"main":"./lib/index.js","husky":{"hooks":{"pre-commit":"lint-staged"}},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"gitHead":"6f886211f1cb4f1876591c18dace242fb0f2c00c","install":"./lib/install.js","scripts":{"dist":"choerodon-front-boot dist --config ./react/config.js","start":"choerodon-front-boot start --config ./react/config.js","watch":"compiler compile --watch","commit":"cz","compile":"choerodon-front-boot compile","lint-staged":"lint-staged","start:local":"choerodon-front-boot start --config ./config-local.js","clean-install":"rm -rf node_modules && rm -fr package-lock.json && npm i --registry https://nexus.choerodon.com.cn/repository/choerodon-npm && chmod -R u+x node_modules","lint-staged:es":"eslint"},"_npmUser":{"name":"arkxos","email":"arkxos@qq.com"},"routeName":"devops","_npmVersion":"10.8.2","description":"简体中文 | [English](./README.en_US.md)","directories":{},"lint-staged":{"react/**/*.{scss,less}":"stylelint --syntax less","react/**/*.{js,jsx,ts,tsx}":["npm run lint-staged:es"]},"resolutions":{"react":"16.14.0","react-dom":"16.14.0"},"_nodeVersion":"20.19.0","dependencies":{"pako":"^1.0.11","uuid":"^3.3.3","xterm":"^3.12.0","moment":"^2.22.2","echarts":"^4.2.1","js-yaml":"^3.12.1","rc-table":"^6.8.2","js-base64":"^2.5.2","react-dnd":"^2.6.0","file-saver":"^2.0.5","json-bigint":"^1.0.0","streamsaver":"^2.0.5","react-loading":"^1.0.4","timeago-react":"^3.0.0","react-markdown":"^3.5.0","mobx-react-lite":"^1.4.1","react-draggable":"^3.3.2","simplebar-react":"^1.2.1","diff-match-patch":"^1.0.4","js-file-download":"^0.4.8","react-codemirror":"^1.0.0","copy-to-clipboard":"^3.3.1","echarts-for-react":"^2.0.12","styled-components":"^5.2.0","quill-delta-to-html":"^0.8.4","react-image-lightbox":"^4.6.0","web-streams-polyfill":"^3.0.2","react-copy-to-clipboard":"^5.0.1","react-dnd-html5-backend":"^5.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"del":"^4.1.1","eslint":"^7.7.0","lodash":"latest","commitizen":"^4.2.4","@types/react":"^16.9.44","babel-eslint":"8.2.6","babel-preset-c7n":"^0.0.2","@types/json-bigint":"^1.0.1","@choerodon/compiler":"^0.0.2","@types/react-router":"^5.1.8","eslint-plugin-react":"^7.20.6","@hzero-front-ui/font":"4.1.5","eslint-config-airbnb":"^18.2.0","eslint-plugin-import":"^2.22.0","eslint-config-c7n-app":"^0.0.1","@arkxos/choerodon-boot":"1.2.1","eslint-plugin-jsx-a11y":"^6.3.1","@types/react-router-dom":"^5.1.5","@arkxos/choerodon-master":"1.4.2","@typescript-eslint/parser":"^4.0.1","cz-conventional-changelog":"^3.3.0","eslint-plugin-react-hooks":"^4.1.0","@typescript-eslint/eslint-plugin":"^4.0.1"},"peerDependencies":{"js-yaml":"3.14.1"},"_npmOperationalInternal":{"tmp":"tmp/choerodon-devops_2.0.10_1763899437715_0.23448012042290167","host":"s3://npm-registry-packages-npm-production"}},"2.0.11":{"name":"@arkxos/choerodon-devops","version":"2.0.11","keywords":[],"license":"ISC","_id":"@arkxos/choerodon-devops@2.0.11","maintainers":[{"name":"arkxos","email":"arkxos@qq.com"}],"contributors":[{"name":"choerodon"}],"dist":{"shasum":"87e2ebef62e3b67c7c8869a6661813d373571ab8","tarball":"https://registry.npmjs.org/@arkxos/choerodon-devops/-/choerodon-devops-2.0.11.tgz","fileCount":1846,"integrity":"sha512-wBzAdNnlrQhyh1/rd8uLLnOF/PaSXIeAid7Ahbg1X7okmljXB9EoLShTZEBhyIa1YrAJPQVxejls0F9Hyelqbg==","signatures":[{"sig":"MEUCIFOUIma2TsMiqBV3g00WB0IidMZKxNDHDo71HZ/oIUy/AiEA3XoVZwsSgwReLXetB2I7yqoUtq8OHpHBTWqPVcUbdv0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9815234},"main":"./lib/index.js","husky":{"hooks":{"pre-commit":"lint-staged"}},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"gitHead":"6f886211f1cb4f1876591c18dace242fb0f2c00c","install":"./lib/install.js","scripts":{"dist":"choerodon-front-boot dist --config ./react/config.js","start":"choerodon-front-boot start --config ./react/config.js","watch":"compiler compile --watch","commit":"cz","compile":"choerodon-front-boot compile","lint-staged":"lint-staged","start:local":"choerodon-front-boot start --config ./config-local.js","clean-install":"rm -rf node_modules && rm -fr package-lock.json && npm i --registry https://nexus.choerodon.com.cn/repository/choerodon-npm && chmod -R u+x node_modules","lint-staged:es":"eslint"},"_npmUser":{"name":"arkxos","email":"arkxos@qq.com"},"routeName":"devops","_npmVersion":"10.8.2","description":"简体中文 | [English](./README.en_US.md)","directories":{},"lint-staged":{"react/**/*.{scss,less}":"stylelint --syntax less","react/**/*.{js,jsx,ts,tsx}":["npm run lint-staged:es"]},"resolutions":{"react":"16.14.0","react-dom":"16.14.0"},"_nodeVersion":"20.19.0","dependencies":{"pako":"^1.0.11","uuid":"^3.3.3","xterm":"^3.12.0","moment":"^2.22.2","echarts":"^4.2.1","js-yaml":"^3.12.1","rc-table":"^6.8.2","js-base64":"^2.5.2","react-dnd":"^2.6.0","file-saver":"^2.0.5","json-bigint":"^1.0.0","streamsaver":"^2.0.5","react-loading":"^1.0.4","timeago-react":"^3.0.0","react-markdown":"^3.5.0","mobx-react-lite":"^1.4.1","react-draggable":"^3.3.2","simplebar-react":"^1.2.1","diff-match-patch":"^1.0.4","js-file-download":"^0.4.8","react-codemirror":"^1.0.0","copy-to-clipboard":"^3.3.1","echarts-for-react":"^2.0.12","styled-components":"^5.2.0","quill-delta-to-html":"^0.8.4","react-image-lightbox":"^4.6.0","web-streams-polyfill":"^3.0.2","react-copy-to-clipboard":"^5.0.1","react-dnd-html5-backend":"^5.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"del":"^4.1.1","eslint":"^7.7.0","lodash":"latest","commitizen":"^4.2.4","@types/react":"^16.9.44","babel-eslint":"8.2.6","babel-preset-c7n":"^0.0.2","@types/json-bigint":"^1.0.1","@choerodon/compiler":"^0.0.2","@types/react-router":"^5.1.8","eslint-plugin-react":"^7.20.6","@hzero-front-ui/font":"4.1.5","eslint-config-airbnb":"^18.2.0","eslint-plugin-import":"^2.22.0","eslint-config-c7n-app":"^0.0.1","@arkxos/choerodon-boot":"1.2.1","eslint-plugin-jsx-a11y":"^6.3.1","@types/react-router-dom":"^5.1.5","@arkxos/choerodon-master":"1.4.2","@typescript-eslint/parser":"^4.0.1","cz-conventional-changelog":"^3.3.0","eslint-plugin-react-hooks":"^4.1.0","@typescript-eslint/eslint-plugin":"^4.0.1"},"peerDependencies":{"js-yaml":"3.14.1"},"_npmOperationalInternal":{"tmp":"tmp/choerodon-devops_2.0.11_1763900710878_0.2430237034921081","host":"s3://npm-registry-packages-npm-production"}},"2.0.12":{"name":"@arkxos/choerodon-devops","version":"2.0.12","keywords":[],"license":"ISC","_id":"@arkxos/choerodon-devops@2.0.12","maintainers":[{"name":"arkxos","email":"arkxos@qq.com"}],"contributors":[{"name":"choerodon"}],"dist":{"shasum":"88116b0b68b23a24767e97649b1630a8174b3f24","tarball":"https://registry.npmjs.org/@arkxos/choerodon-devops/-/choerodon-devops-2.0.12.tgz","fileCount":1846,"integrity":"sha512-PA3DSVCu/0HuI5mOg4k8JRQ4QWMXcyBGetFz5Cj7R1JsH+3ux0qrSngcWTQrUo/wjAXvRl54+NxHvkr8haJvfg==","signatures":[{"sig":"MEUCIQCqlTkb9c73ZFblk7R0jWjI/VXNqMkoDxCHIdshybqK/gIgSi2ibWL20LrqFfBPRZ9eet1BU5od7yhhrl9qMPdxmc8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9815264},"main":"./lib/index.js","husky":{"hooks":{"pre-commit":"lint-staged"}},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"gitHead":"6f886211f1cb4f1876591c18dace242fb0f2c00c","install":"./lib/install.js","scripts":{"dist":"choerodon-front-boot dist --config ./react/config.js","start":"choerodon-front-boot start --config ./react/config.js","watch":"compiler compile --watch","commit":"cz","compile":"choerodon-front-boot compile","lint-staged":"lint-staged","start:local":"choerodon-front-boot start --config ./config-local.js","clean-install":"rm -rf node_modules && rm -fr package-lock.json && npm i --registry https://nexus.choerodon.com.cn/repository/choerodon-npm && chmod -R u+x node_modules","lint-staged:es":"eslint"},"_npmUser":{"name":"arkxos","email":"arkxos@qq.com"},"routeName":"devops","_npmVersion":"10.8.2","description":"简体中文 | [English](./README.en_US.md)","directories":{},"lint-staged":{"react/**/*.{scss,less}":"stylelint --syntax less","react/**/*.{js,jsx,ts,tsx}":["npm run lint-staged:es"]},"resolutions":{"react":"16.14.0","react-dom":"16.14.0"},"_nodeVersion":"20.19.0","dependencies":{"pako":"^1.0.11","uuid":"^3.3.3","xterm":"^3.12.0","moment":"^2.22.2","echarts":"^4.2.1","js-yaml":"^3.12.1","rc-table":"^6.8.2","js-base64":"^2.5.2","react-dnd":"^2.6.0","file-saver":"^2.0.5","json-bigint":"^1.0.0","react-query":"3.34.6","streamsaver":"^2.0.5","react-loading":"^1.0.4","timeago-react":"^3.0.0","react-markdown":"^3.5.0","mobx-react-lite":"^1.4.1","react-draggable":"^3.3.2","simplebar-react":"^1.2.1","diff-match-patch":"^1.0.4","js-file-download":"^0.4.8","react-codemirror":"^1.0.0","copy-to-clipboard":"^3.3.1","echarts-for-react":"^2.0.12","styled-components":"^5.2.0","quill-delta-to-html":"^0.8.4","react-image-lightbox":"^4.6.0","web-streams-polyfill":"^3.0.2","react-copy-to-clipboard":"^5.0.1","react-dnd-html5-backend":"^5.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"del":"^4.1.1","eslint":"^7.7.0","lodash":"latest","commitizen":"^4.2.4","@types/react":"^16.9.44","babel-eslint":"8.2.6","babel-preset-c7n":"^0.0.2","@types/json-bigint":"^1.0.1","@choerodon/compiler":"^0.0.2","@types/react-router":"^5.1.8","eslint-plugin-react":"^7.20.6","@hzero-front-ui/font":"4.1.5","eslint-config-airbnb":"^18.2.0","eslint-plugin-import":"^2.22.0","eslint-config-c7n-app":"^0.0.1","@arkxos/choerodon-boot":"1.2.1","eslint-plugin-jsx-a11y":"^6.3.1","@types/react-router-dom":"^5.1.5","@arkxos/choerodon-master":"1.4.2","@typescript-eslint/parser":"^4.0.1","cz-conventional-changelog":"^3.3.0","eslint-plugin-react-hooks":"^4.1.0","@typescript-eslint/eslint-plugin":"^4.0.1"},"peerDependencies":{"js-yaml":"3.14.1"},"_npmOperationalInternal":{"tmp":"tmp/choerodon-devops_2.0.12_1763916035333_0.6794970959513731","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-11-23T12:03:57.645Z","modified":"2026-01-08T09:37:30.037Z","2.0.10":"2025-11-23T12:03:57.972Z","2.0.11":"2025-11-23T12:25:11.183Z","2.0.12":"2025-11-23T16:40:35.595Z"},"license":"ISC","keywords":[],"description":"简体中文 | [English](./README.en_US.md)","contributors":[{"name":"choerodon"}],"maintainers":[{"email":"arkxos@qq.com","name":"arkxosboot"}],"readme":"简体中文 | [English](./README.en_US.md)\r\n \r\n# DevOps Service  \r\n\r\n`DevOps Service` DevOps Service是Choerodon平台实现持续交付的基础. 当前版本为: `0.22.0`\r\n\r\nDevOps Service通过自主整合的DevOps工具链，集成相关的开源工具，以此形成了计划、编码、测试、部署、运维以及监控的DevOps闭环。\r\n并且只需通过简单的配置，您便能获得最佳的开发体验。\r\n\r\n## 特性\r\n`DevOps Service` 含有以下功能:    \r\n\r\n- `应用服务管理` ：对应用服务进行管理\r\n- `应用服务版本管理`：对`持续集成`（Continuous Integration）过程中产生的可以直接在`Kubernetes`集群中进行部署的服务版本进行管理\r\n- `代码管理及版本控制`：对服务的代码进行版本控制和管理\r\n- `分支管理`：能够对服务的`Git`分支进行相应的操作\r\n- `代码质量监测`：在`CI`过程中进行代码质量数据收集，集成`sonarqube`对代码质量进行监测\r\n- `持续集成概览`：查看服务的持续集成过程\r\n- `部署管理`：对持续集成所产生的服务版本通过`GitOps`进行部署\r\n- `持续部署流水线管理`：使用工作流实现持续部署\r\n- `资源管理`：对部署的资源（如：网络，域名，密文等）进行管理\r\n- `集群管理`：管理`Kubernetes`集群\r\n\r\n## 前置要求\r\n- [JAVA](https://www.java.com/en/)：`DevOps Service`基于Java8进行开发\r\n- [GitLab](https://about.gitlab.com/)：`DevOps Service`使用`GitLab`进行代码的托管。同时，通过基于`GitLab Runner`实现持续集成以完成代码编译，单元测试执行，代码质量分析，docker镜像生成，helm chart打包，服务版本发布等自动化过程\r\n- [Harbor](https://vmware.github.io/harbor/cn/)：企业级Docker registry 服务，用于存放服务版本所对应的docker镜像\r\n- [Kubernetes](https://kubernetes.io/)：容器编排管理工具，用于部署服务版本所对应的helm chart包\r\n- [ChartMuseum](https://chartmuseum.com/)：Helm Chart仓库，用于存放服务版本所对应的helm chart包\r\n- [Sonarqube](https://www.sonarqube.org/)：管理代码质量的开放平台，用于管理服务的代码质量\r\n- [MySQL](https://www.mysql.com)：主流数据库之一，用于`DevOps Service`的数据持久化\r\n- [Redis](https://redis.io/)：内存数据库，用于数据缓存和部分非持久化数据存储\r\n\r\n## 服务依赖\r\n\r\n* `choerodon-register`: 注册中心，在线上环境代替本地的`eureka-server`\r\n* `choerodon-iam`：用户服务，与用户有关的操作依赖与此服务\r\n* `choerodon-gateway`: 网关服务\r\n* `choerodon-oauth`: 授权服务\r\n* `choerodon-asgard` : 事务一致性服务\r\n* `choerodon-message` : 通知服务\r\n* `gitlab-service`：gitlab服务\r\n* `workflow-service`：工作流服务\r\n* `agile-service`：敏捷服务，查询与分支有关的敏捷Issue需要依赖此服务\r\n\r\n## 服务配置\r\n\r\n* `bootstrap.yml`:\r\n\r\n  ```yaml\r\n  server:\r\n    port: 8060\r\n  spring:\r\n    application:\r\n      name: devops-service\r\n    cloud:\r\n      config:\r\n        failFast: true\r\n        retry:\r\n          maxAttempts: 6\r\n          multiplier: 1.5\r\n          maxInterval: 2000\r\n        uri: localhost:8010\r\n        enabled: false\r\n    mvc:\r\n      static-path-pattern: /**\r\n    resources:\r\n      static-locations: classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources,file:/dist\r\n  management:\r\n    server:\r\n      port: 8061\r\n    endpoints:\r\n      web:\r\n        exposure:\r\n          include: '*'\r\n  ```\r\n\r\n* `application.yml`:\r\n\r\n  ```yaml\r\n  spring:\r\n    datasource:\r\n      url: jdbc:mysql://localhost/devops_service?useUnicode=true&characterEncoding=utf-8&useSSL=false\r\n      username: choerodon\r\n      password: choerodon\r\n      hikari:\r\n        maximum-pool-size: 15 # 数据库连接池连接数\r\n    redis:\r\n      host: localhost\r\n      database: ${SPRING_REDIS_DATABASE:1}\r\n    http:\r\n      encoding:\r\n        charset: UTF-8\r\n        force: true\r\n        enabled: true\r\n  services:\r\n    harbor:\r\n      baseUrl: \"harbor.example.com\" # harbor地址\r\n      username: \"123456\" # harbor用户名\r\n      password: \"123456\" # 对应harbor用户名的密码\r\n      insecureSkipTlsVerify: false\r\n    gitlab:\r\n      url: \"gitlab.example.com\" # gitlab地址\r\n      sshUrl: \"gitlab.example.com\" # 用于ssh操作的gitlab地址\r\n      projectLimit: 100 # gitlab用户可以创建的项目的数量限制\r\n    helm:\r\n      url: \"helm.example.com\" # 存放helm chart包的仓库地址\r\n    gateway:\r\n      url: \"http://api.example.com\" # 网关地址\r\n  hzero:\r\n    websocket:\r\n      # 用于连接websocket的路径\r\n      websocket: /websocket\r\n      # 与当前服务的redis数据库一致\r\n      redisDb: ${SPRING_REDIS_DATABASE:1}\r\n      # 后端长连通信密钥\r\n      secretKey: devops_ws\r\n  choerodon:\r\n    saga:\r\n      consumer:\r\n        core-thread-num: 20\r\n        max-thread-num:  20 # 消费线程数\r\n        poll-interval: 3 # 拉取消息的间隔(秒)，默认1秒\r\n        enabled: true # 是否启用消费端\r\n    schedule:\r\n      consumer:\r\n        enabled: true # 启用任务调度消费端\r\n        thread-num: 1 # 任务调度消费线程数\r\n        poll-interval-ms: 1000 # 拉取间隔，默认1000毫秒\r\n    resource:\r\n      jwt:\r\n        ignore: /workflow/**, /sonar/**, /ci, /sonar/info, /v2/api-docs, /agent/**, /ws/**, /gitlab/email, /webhook/**, /v2/choerodon/**, /choerodon/**, /actuator/**, /prometheus, /devops/**, /pre_stop, /websocket\r\n  agent:\r\n    version: \"0.5.0\" # devops-service此版本所预期的 choerodon-agent 的版本\r\n    serviceUrl: \"agent.example.com\" # 用于 choerodon-agent 连接 devops-service 的地址\r\n    certManagerUrl: \"agent.example.com\" # 存放CertManager的地址，用于安装\r\n    repoUrl: \"helm.example.com\" # 存放agent的地址，用于安装\r\n  mybatis:\r\n    mapperLocations: classpath*:/mapper/*.xml\r\n    configuration:\r\n      mapUnderscoreToCamelCase: true\r\n  feign:\r\n    hystrix:\r\n      shareSecurityContext: true\r\n      command:\r\n        default:\r\n          execution:\r\n            isolation:\r\n              thread:\r\n                timeoutInMilliseconds: 30000\r\n  ribbon:\r\n    ConnectTimeout: 50000\r\n    ReadTimeout: 50000\r\n\r\n  asgard-servie:\r\n    ribbon:\r\n      ConnectTimeout: 50000\r\n      ReadTimeout: 50000\r\n\r\n  devops:\r\n    # 流水线生成Gitlab Ci文件中默认的runner 镜像地址\r\n    ci:\r\n      default:\r\n        image: registry.cn-shanghai.aliyuncs.com/c7n/cibase:0.9.1\r\n      pipeline:\r\n        sync:\r\n          executor:\r\n            # 核心线程池大小\r\n            corePoolSize: 5\r\n            # 最大线程池大小\r\n            maxPoolSize: 8\r\n          unterminated:\r\n            # ci流水线对未终结的流水线进行数据补偿的时间阈值, 单位: 毫秒 (默认600秒)\r\n            thresholdMilliSeconds: 600000\r\n          pending:\r\n            # ci流水线对pending的流水线进行数据补偿的时间阈值, 单位: 毫秒 (默认600秒)\r\n            thresholdMilliSeconds: 600000\r\n          jobEmpty:\r\n            # ci流水线对非跳过状态的且没有job信息流水线进行数据补偿的时间阈值, 单位: 毫秒 (默认600秒)\r\n            thresholdMilliSeconds: 600000\r\n          refresh:\r\n            # redisKey的过期时间, 用于控制同一条流水线的刷新间隔, 减少对gitlab的访问次数\r\n            periodSeconds: 60\r\n    # 批量部署的请求条数限制\r\n    batch:\r\n      deployment:\r\n        maxSize: 20\r\n\r\n  # websocket的最大缓冲区大小，单位字节byte\r\n  websocket:\r\n    buffer:\r\n      maxTextMessageSize: 4194304\r\n      maxBinaryMessageSize: 4194304\r\n  ```\r\n\r\n\r\n## 安装和启动步骤\r\n\r\n1. 创建数据库`devops_service`，创建用户`choerodon`，并为用户分配权限：\r\n\r\n   ```sql\r\n   CREATE USER 'choerodon'@'%' IDENTIFIED BY \"choerodon\";\r\n   CREATE DATABASE devops_service DEFAULT CHARACTER SET utf8;\r\n   GRANT ALL PRIVILEGES ON devops_service.* TO choerodon@'%';\r\n   FLUSH PRIVILEGES;\r\n   ```\r\n\r\n2. 拉取`DevOps Service`代码到本地：\r\n\r\n   ```sh\r\n   git clone https://github.com/choerodon/devops-service.git\r\n   ```\r\n\r\n3. 在项目根目录执行命令： `mvn clean package spring-boot:repackage -Dmaven.test.skip=true && bash init-database.sh`\r\n\r\n4. 使用下列命令运行或直接在集成环境中运行 `DevopsServiceApplication` \r\n\r\n   ```sh\r\n   mvn clean spring-boot:run\r\n   ```\r\n\r\n## 链接\r\n\r\n[更新日志](./CHANGELOG.zh-CN.md)\r\n\r\n## 反馈途径\r\n\r\n如果您发现任何缺陷或bug，请及时 [issue](https://github.com/choerodon/devops-service/issues/new)告知我们 。\r\n\r\n## 如何参与\r\n\r\n欢迎参与我们的项目，了解更多有关如何[参与贡献](https://github.com/choerodon/choerodon/blob/master/CONTRIBUTING.md)的信息。 \r\n\r\n","readmeFilename":"README.md"}