如何在 NEXUS 中发布一个新 npm 包

327 阅读1分钟

在 nexus 发布一个新 npm 包

  1. 下面使用到的 npm-proxy-login github 地址

  2. 初始化一个 仓库,一定要删除 package.json private 属性,并且设置 publishConfig

{
  "name": "@osl/xxx",
  ....
  "publishConfig": {
    "registry": "https://xxxx/bct-npm-custom/"
  }
  ....
}

3. 设置自动更新 package.json 版本号 (通过 semantic@semantic-release/npm 插件实现 package.jsonversion 变更)


stages:
  ...
  - release
  ...
  
release-job:
  ...
  tags:
    - eks
    - apps-build
  stage: release
  rules:
    - if: $CI_COMMIT_BRANCH == $BUILD_SRC_BRANCH
      when: always
    - when: never
  before_script:
    - export GL_TOKEN=$CI_PUSH_TOKEN
  script:
    - npx semantic-release
  artifacts:
    paths:
      - package.json
      - package-lock.json
  1. 组件库接入CI 安全扫描
stages:
  ...
  - snyk_scan
  - snyk_scan_results
  ...

5. 设置 publishregistry & Publish 成功通知 & Publish 失败通知 (publish private package 无论成功还是失败都有通知消息)

image.png


publish-job:
  stage: publish
  variables:
    REQUEST_PUBLISH_ERROR_JSON: |
      {
        "msg_type":"post",
        "content":{
          "post":{
            "zh_CN":{
              "title":"@osl/web-micro-components 公共组件 npm包 发布失败",
              "content":[
                [
                  {"tag":"text","text":"请检查 流水线 " },
                  {"tag":"a","text":"流水线链接", "href": "https://xxxx/-/pipelines"}
                ]
              ]
            }
          }
        }
      }
  script:
    - apk add --no-cache curl jq
    - npm i npm-proxy-login
    - echo "registry=$REGISTRY">.npmrc
    - cat .npmrc
    - npm config get registry
    - npx npm-proxy-login $REGISTRY $PUBLISH_ACCOUNT $PUBLISH_ACCOUNT_PWD $PUBLISH_ACCOUNT_EMAIL
    - npm publish
  after_script:
    - |
      export PKG_VERSION=$(cat package.json | grep '"version":' | awk -F '"' '{print $4}')
      REQUEST_JSON=$(jq -n --arg version "$PKG_VERSION" '{ 
        "msg_type":"post", 
        "content":{ 
          "post":{ 
            "zh_CN":{  
              "title":"@osl/web-micro-components 公共组件 npm包 发布成功", 
              "content":[ 
                [ 
                  {"tag":"text", "text": "最新 xxxx 组件版本号是: ($version)" } 
                ] 
              ] 
            } 
          } 
        }   
      }')
      echo $REQUEST_JSON

      if [ "$CI_JOB_STATUS" == "success" ]; then
        curl -X POST \
            -H "Content-Type: application/json" \
            -d "$REQUEST_JSON" \
            $LARK_WEBHOOK_URL
      else
        curl -X POST \
            -H "Content-Type: application/json" \
            -d "$REQUEST_PUBLISH_ERROR_JSON" \
            $LARK_WEBHOOK_URL
        exit 1
      fi

在业务项目中如何接入

  1. 业务项目新建 .npmrc(这里的 private registry 一定要和 上面的 publish registry 保持一致)
@osl:registry=https://xxx/web-bct-npm-custom/
registry=https://registry.npmjs.org/

2. 执行 以下 命令, 在系统根目录的 .npmrcregistry 和 项目的 .npmrc 注册的 registry 保持一致, 如果不一致, install 阶段会出现 401 情况

npx npm-proxy-login https://priveta-registry username password email

3. 在项目的 gitlab-ci.yaml 设置 CI Runnerinstall package registry (这里重新设置 .npmrc 文件的原因是 CI Runner 使用 npmToken 下载最简单)

variables:
  NPMTOKEN: 'xxxx'
...
build-job:
  ...
  stage: build
  script:
    - npm get
    - echo "//xxxx/web-bct-npm-custom/:_authToken=NpmToken.$NPMTOKEN">.npmrc
    - echo "registry=https://registry.npmjs.org/">>.npmrc
    - cat .npmrc
    - npm get
    - npm ci
    - NX_BRANCH=ci npm run build:prod
...