{"_id":"@arkxos/choerodon-prod-repo","_rev":"2-991ef4db6ad3c3321827a0a49d788dcb","name":"@arkxos/choerodon-prod-repo","dist-tags":{"latest":"2.0.1"},"versions":{"2.0.1":{"name":"@arkxos/choerodon-prod-repo","version":"2.0.1","license":"ISC","_id":"@arkxos/choerodon-prod-repo@2.0.1","maintainers":[{"name":"arkxos","email":"arkxos@qq.com"}],"contributors":[{"name":"choerodon"}],"dist":{"shasum":"79c07fc4b027099d92ad54f52fe66a5a05b4f730","tarball":"https://registry.npmjs.org/@arkxos/choerodon-prod-repo/-/choerodon-prod-repo-2.0.1.tgz","fileCount":326,"integrity":"sha512-XTUBPKVNXxeL9iI81nQd8zoup2zX6JUYFE5Ar69Sc9OPULX3urTxqHf0eCQDvYYRxlAC/YXS+emoW0cqHtGvzA==","signatures":[{"sig":"MEUCIQDeT3JnZYPKxpCkmE5UumHKWbWXRzOztFm/xXZFndCjrQIgFddLCWGsJ9BkUiJ6w7cfuzR010GefiFcTTLJXbtecUU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1912392},"main":"./lib/index.js","husky":{"hooks":{"pre-commit":"lint-staged"}},"gitHead":"08e9a8b943ccdb35333f0c8ba322ce6c21441ecb","scripts":{"dist":"choerodon-front-boot dist --config ./react/config.js","start":"choerodon-front-boot start --config ./react/config.js","compile":"choerodon-front-boot compile","lint-staged":"lint-staged","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":"rdupm","_npmVersion":"10.8.2","description":"简体中文 | [English](./README.en_US.md)","directories":{},"lint-staged":{"react/**/*.scss":"stylelint --syntax scss","react/**/*.{js,jsx}":["npm run lint-staged:es"]},"resolutions":{"react":"16.14.0","react-dom":"16.14.0"},"_nodeVersion":"20.19.0","dependencies":{"moment":"^2.24.0","timeago-react":"^3.0.0","mobx-react-lite":"^1.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^7.6.0","lodash":"latest","through2":"^2.0.3","@types/react":"^16.9.44","babel-eslint":"^8.1.0","babel-preset-c7n":"^0.0.2","@babel/preset-react":"^7.12.10","@types/react-router":"^5.1.8","eslint-plugin-babel":"^4.1.2","eslint-plugin-react":"^7.20.5","eslint-config-airbnb":"^18.2.0","eslint-plugin-compat":"^2.1.0","eslint-plugin-import":"^2.22.0","eslint-config-c7n-app":"^0.0.1","@arkxos/choerodon-boot":"1.2.1","eslint-config-prettier":"^2.9.0","eslint-plugin-jsx-a11y":"^6.3.1","eslint-plugin-markdown":"^1.0.0-beta.6","@types/react-router-dom":"^5.1.5","@arkxos/choerodon-master":"1.4.2","@typescript-eslint/parser":"^3.7.1","eslint-plugin-react-hooks":"^4.0.8","webpack-filter-warnings-plugin":"^1.2.1","@typescript-eslint/eslint-plugin":"^3.7.1","@babel/plugin-proposal-decorators":"^7.12.1","@babel/plugin-proposal-export-default-from":"^7.12.1"},"_npmOperationalInternal":{"tmp":"tmp/choerodon-prod-repo_2.0.1_1763905955519_0.8317145182450136","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-11-23T13:52:35.424Z","modified":"2026-01-08T09:37:28.286Z","2.0.1":"2025-11-23T13:52:35.749Z"},"license":"ISC","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# prod-repo-service\r\n\r\n`prod-repo-service` prod-repo-service是Choerodon平台管理制品库的基础. 当前版本为: `0.23.0`\r\n\r\nprod-repo-service通过整合nexus、harbor，提供管理maven包、npm包、docker镜像等功能。\r\n\r\n## 特性\r\n`prod-repo-service` 含有以下功能:   \r\n \r\n- `自定义nexus服务` ：maven、npm制品库的创建可以使用默认的nexus服务，也可添加自己的nexus服务\r\n- `创建制品库` ：创建/更新maven、npm、docker制品仓库\r\n- `镜像/包管理`：查看仓库下发布的制品列表、发布制品指引\r\n- `用户权限`：分配项目成员的权限\r\n- `权限管理`：分配权限、更新权限、删除权限\r\n- `操作日志`：记录了权限分配/镜像操作的操作日志\r\n\r\n## 前置要求\r\n- [JAVA](https://www.java.com/en/)：`prod-repo-service`基于Java8进行开发\r\n- [GitLab](https://about.gitlab.com/)：`prod-repo-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)：主流数据库之一，用于数据持久化\r\n- [Redis](https://redis.io/)：内存数据库，用于数据缓存和部分非持久化数据存储\r\n- [Nexus](https://www.sonatype.com/)：`Sonatype Nexus OSS`是一个自由开源的仓库管理系统。\r\n- [Harbor](https://goharbor.io/)：`Harbor`是一个企业级DockerRegistry管理系统\r\n\r\n## 服务依赖\r\n\r\n* `choerodon-register`: 注册中心，在线上环境代替本地的`eureka-server`\r\n* `choerodon-platform`：平台服务\r\n* `choerodon-iam`: 用户服务，与用户有关的操作依赖与此服务\r\n* `choerodon-gateway`: 网关服务\r\n* `choerodon-oauth`: 授权服务\r\n* `choerodon-asgard` : 事务一致性服务\r\n* `choerodon-file` : 文件服务\r\n\r\n## 服务配置\r\n\r\n* `bootstrap.yml`:\r\n\r\n  ```yaml\r\n\tserver:\r\n\t  port: 7144\r\n\tmanagement:\r\n\t  server: \r\n\t\tport: 7145\r\n\t  endpoints:\r\n\t\tweb:\r\n\t\t  exposure:\r\n\t\t\tinclude: '*'\r\n\r\n\tspring:\r\n\t  profiles:\r\n\t\tactive: default\r\n\t  cloud:\r\n\t\tconfig:\r\n\t\t  fail-fast: false\r\n\t\t  # 是否启用配置中心\r\n\t\t  enabled: ${SPRING_CLOUD_CONFIG_ENABLED:false}\r\n\t\t  # 配置中心地址\r\n\t\t  uri: ${SPRING_CLOUD_CONFIG_URI:http://service.example.rapidark.com:8000}\r\n\t\t  retry:\r\n\t\t\t# 最大重试次数\r\n\t\t\tmaxAttempts: 6\r\n\t\t\tmultiplier: 1.1\r\n\t\t\t# 重试间隔时间\r\n\t\t\tmaxInterval: 2000\r\n\t\t  # 标签\r\n\t\t  label: ${SPRING_CLOUD_CONFIG_LABEL:}\r\n\r\n\teureka:\r\n\t  instance:\r\n\t\t# 以IP注册到注册中心\r\n\t\tpreferIpAddress: ${EUREKA_INSTANCE_PREFER_IP_ADDRESS:true}\r\n\t\tleaseRenewalIntervalInSeconds: 10\r\n\t\tleaseExpirationDurationInSeconds: 30\r\n\t\t# 服务的一些元数据信息\r\n\t\tmetadata-map:\r\n\t\t  VERSION: 1.2.0.RELEASE\r\n\t  client:\r\n\t\tserviceUrl:\r\n\t\t  # 注册中心地址\r\n\t\t  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register.staging.saas.hand-china.com/}\r\n\t\tregistryFetchIntervalSeconds: 10\r\n\t\tdisable-delta: true\r\n  ```\r\n\r\n* `application.yml`:\r\n\r\n  ```yaml\r\n    spring:\r\n      application:\r\n        name: prod-repo-service\r\n      datasource:\r\n        url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql.dev.example.rapidark.com:3306/hrds_prod_repo?useUnicode=true&characterEncoding=utf-8&useSSL=false}\r\n        username:  ${SPRING_DATASOURCE_USERNAME:root}\r\n        password: ${SPRING_DATASOURCE_PASSWORD:handhand}\r\n        hikari:\r\n          # 连接池最小空闲连接数\r\n          minimum-idle: ${SPRING_DATASOURCE_MINIMUM_IDLE:5}\r\n          # 连接池允许的最大连接数\r\n          maximum-pool-size: ${SPRING_DATASOURCE_MAXIMUM_POOL_SIZE:200}\r\n          # 等待连接池分配连接的最大时长（毫秒）\r\n          connection-timeout: ${SPRING_DATASOURCE_CONNECTION_TIMEOUT:30000}\r\n      redis:\r\n        host: dev.example.rapidark.com\r\n        port: 6379\r\n        database: 1\r\n        jedis:\r\n          pool:\r\n            # 资源池中最大连接数\r\n            # 默认8，-1表示无限制；可根据服务并发redis情况及服务端的支持上限调整\r\n            max-active: ${SPRING_REDIS_POOL_MAX_ACTIVE:50}\r\n            # 资源池运行最大空闲的连接数\r\n            # 默认8，-1表示无限制；可根据服务并发redis情况及服务端的支持上限调整，一般建议和max-active保持一致，避免资源伸缩带来的开销\r\n            max-idle: ${SPRING_REDIS_POOL_MAX_IDLE:50}\r\n            # 当资源池连接用尽后，调用者的最大等待时间(单位为毫秒)\r\n            # 默认 -1 表示永不超时，设置5秒\r\n            max-wait: ${SPRING_REDIS_POOL_MAX_WAIT:5000}\r\n      resources:\r\n        # 资源缓存时间，单位秒\r\n        cache.period: 3600\r\n        # 开启gzip压缩\r\n        chain.gzipped: true\r\n        # 启用缓存\r\n        chain.cache: true\r\n    \r\n    server: \r\n      undertow:\r\n        # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接\r\n        # 默认值为8，建议设置每个CPU核心一个线程\r\n        io-threads: ${SERVER_UNDERTOW_IO_THREADS:4}\r\n        # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程\r\n        # 默认等于 io-threads*8，它的值设置取决于系统的负载，可适当调大该值\r\n        worker-threads: ${SERVER_UNDERTOW_WORKER_THREADS:128}\r\n        # 每块buffer的空间大小，越小空间被利用越充分\r\n        # 不要设置太大，以免影响其他应用，合适即可\r\n        buffer-size: ${SERVER_UNDERTOW_BUFFER_SIZE:1024}\r\n        # 是否分配的直接内存(NIO直接分配的堆外内存)\r\n        # 默认false\r\n        direct-buffers: true\r\n        # HTTP POST请求最大的大小\r\n        # 默认0，无限制，可设置10M\r\n        max-http-post-size: 10485760\r\n        allow-unescaped-characters-in-url: true\r\n    \r\n    feign:\r\n      hystrix:\r\n        enabled: true\r\n    \r\n    hystrix:\r\n      threadpool:\r\n        default:\r\n          # 执行命令线程池的核心线程数，也是命令执行的最大并发量\r\n          # 默认10\r\n          coreSize: 1000\r\n          # 最大执行线程数\r\n          maximumSize: 1000\r\n      command:\r\n        default:\r\n          execution:\r\n            isolation:\r\n              thread:\r\n                # HystrixCommand 执行的超时时间，超时后进入降级处理逻辑。一个接口，理论的最佳响应速度应该在200ms以内，或者慢点的接口就几百毫秒。\r\n                # 默认 1000 毫秒，最高设置 2000足矣。如果超时，首先看能不能优化接口相关业务、SQL查询等，不要盲目加大超时时间，否则会导致线程堆积过多，hystrix 线程池卡死，最终服务不可用。\r\n                timeoutInMilliseconds: ${HYSTRIX_COMMAND_TIMEOUT_IN_MILLISECONDS:40000}\r\n    \r\n    ribbon:\r\n      # 客户端读取超时时间，超时时间要小于Hystrix的超时时间，否则重试机制就无意义了\r\n      ReadTimeout: ${RIBBON_READ_TIMEOUT:30000}\r\n      # 客户端连接超时时间\r\n      ConnectTimeout: ${RIBBON_CONNECT_TIMEOUT:3000}\r\n      # 访问实例失败(超时)，允许自动重试，设置重试次数，失败后会更换实例访问，请一定确保接口的幂等性，否则重试可能导致数据异常。\r\n      OkToRetryOnAllOperations: true\r\n      MaxAutoRetries: 1\r\n      MaxAutoRetriesNextServer: 1\r\n    \r\n    mybatis:\r\n      mapperLocations: classpath*:/mapper/*.xml\r\n      configuration:\r\n        mapUnderscoreToCamelCase: true\r\n        key-generator: snowflake\r\n        snowflake:\r\n          start-timestamp: 1577808000000\r\n          meta-provider: redis\r\n          meta-provider-redis-db: 1\r\n          meta-provider-redis-refresh-interval: 540000\r\n          meta-provider-redis-expire: 600000\r\n          data-center-id: 1\r\n          worker-id: 1\r\n\r\n    \r\n    \r\n    logging:\r\n      level:\r\n        org.apache.ibatis: ${LOGGING_LEVEL:debug}\r\n        io.choerodon: ${LOGGING_LEVEL:debug}\r\n        org.hzero: ${LOGGING_LEVEL:debug}\r\n        org.hrds.rdupm: ${LOGGING_LEVEL:debug}\r\n    \r\n    hzero:\r\n      scheduler:\r\n        autoRegister: false\r\n      lock:\r\n        pattern: single\r\n        single-server:\r\n          address: ${SPRING_REDIS_HOST:localhost}\r\n          port: ${SPRING_REDIS_PORT:6379}\r\n      service:\r\n        platform:\r\n          name: cherodon-platform\r\n        oauth:\r\n          name: choerodon-oauth\r\n        iam:\r\n          name: choerodon-iam\r\n        file:\r\n          name: choerodon-file\r\n        message:\r\n          name: choerodon-message\r\n        admin:\r\n          name: choerodon-admin\r\n        swagger:\r\n          name: choerodon-swagger\r\n        gateway:\r\n          name: choerodon-gateway\r\n        monitor:\r\n          name: choerodon-monitor\r\n    choerodon:\r\n      category:\r\n        enabled: true # 是否开启项目/组织类型控制\r\n      devops:\r\n        message: true\r\n      eureka:\r\n        event:\r\n          max-cache-size: 300\r\n          retry-time: 5\r\n          retry-interval: 3\r\n          skip-services: config**, **register-server, **gateway**, zipkin**, hystrix**, oauth**\r\n      saga:\r\n        service: choerodon-asgard\r\n        consumer:\r\n          enabled: true # 启动消费端\r\n          thread-num: 2 # saga消息消费线程池大小\r\n          max-poll-size: 200 # 每次拉取消息最大数量\r\n          poll-interval-ms: 1000 # 拉取间隔，默认1000毫秒\r\n      schedule:\r\n        consumer:\r\n          enabled: true # 启用任务调度消费端\r\n          thread-num: 1 # 任务调度消费线程数\r\n          poll-interval-ms: 1000 # 拉取间隔，默认1000毫秒\r\n      cleanPermission: false\r\n    \r\n    harbor:\r\n      baseUrl: ${HARBOR_BASE_URL:https://hzero.org}\r\n      username: ${HARBOR_USER_NAME:xxx}\r\n      password: ${HARBOR_PASSWORD:xxx}\r\n      init:\r\n        defaultRepoUrl: ${HARBOR_INIT_DEFAULT_REPO_URL:jdbc:mysql://mysql.dev.example.rapidark.com:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false}\r\n        defaultRepoUsername: ${HARBOR_INIT_DEFAULT_REPO_USERNAME:xxx}\r\n        defaultRepoPassword: ${HARBOR_INIT_DEFAULT_REPO_PASSWORD:xxx}\r\n        customRepoUrl: ${HARBOR_INIT_CUSTOM_REPO_URL:jdbc:mysql://mysql.dev.example.rapidark.com:3306/devops_service?useUnicode=true&characterEncoding=utf-8&useSSL=false}\r\n        customRepoUsername: ${HARBOR_INIT_CUSTOM_REPO_USERNAME:xxx}\r\n        customRepoPassword: ${HARBOR_INIT_CUSTOM_REPO_PASSWORD:xxx}\r\n    nexus:\r\n      default:\r\n        #系统默认nexus服务地址\r\n        serverUrl: ${NEXUS_DEFAULT_BASE_URL:https://localhost}\r\n        #系统默认nexus服务，超级管理员用户\r\n        username: ${NEXUS_DEFAULT_USER_NAME:admin}\r\n        #系统默认nexus服务，超级管理员用户密码\r\n        password: ${NEXUS_DEFAULT_PASSWORD:admin}\r\n        #系统默认nexus服务，是否启用仓库级的匿名访问控制。 1:启用  0:不启用。\r\n        enableAnonymousFlag: ${NEXUS_DEFAULT_ENABLE_ANONYMOUS_FLAG:0}\r\n        #系统默认nexus服务，启用仓库级的匿名访问控制时需要配置该值(即enableAnonymousFlag==1时)。 nexus服务开启全局匿名访问时，配置的用户\r\n        anonymousUser: ${NEXUS_DEFAULT_ANONYMOUS_USER:test}\r\n        #系统默认nexus服务，启用仓库级的匿名访问控制时需要配置该值(即enableAnonymousFlag==1时)。 nexus服务开启全局匿名访问时，配置的用户对应的角色\r\n        anonymousRole: ${NEXUS_DEFAULT_ANONYMOUS_ROLE:test}\r\n    DesEncrypt:\r\n      # 制品库密码， 加解密密钥\r\n      desKey: ${DES_ENCRYPT_DES_KEY:xxx}\r\n      # 长度：8位\r\n      desIV: ${DES_ENCRYPT_DES_IV:xxxxxxxx}\r\n\r\n  \r\n\r\n  ```\r\n\r\n\r\n## 安装和启动步骤\r\n\r\n1. 创建数据库`hrds_prod_repo`，创建用户`choerodon`，并为用户分配权限：\r\n\r\n   ```sql\r\n   CREATE USER 'choerodon'@'%' IDENTIFIED BY \"choerodon\";\r\n   CREATE DATABASE hrds_prod_repo DEFAULT CHARACTER SET utf8;\r\n   GRANT ALL PRIVILEGES ON hrds_prod_repo.* TO choerodon@'%';\r\n   FLUSH PRIVILEGES;\r\n   ```\r\n\r\n2. 拉取`prod-repo-service`代码到本地：\r\n\r\n   ```sh\r\n   git clone https://github.com/choerodon/prod-repo-service.git\r\n   ```\r\n\r\n3. 在项目根目录执行命令： `sh init-database.sh`\r\n\r\n4. 使用下列命令运行或直接在集成环境中运行 `RdudmApplication` \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/prod-repo-service/issues/new)告知我们 。\r\n\r\n## 如何参与\r\n\r\n欢迎参与我们的项目，了解更多有关如何[参与贡献](https://github.com/choerodon/choerodon/blob/master/CONTRIBUTING.md)的信息。 \r\n","readmeFilename":"README.md"}