跳至主要內容
Nexus操作-手动上传前端依赖
  • 执行脚本上传前端依赖的时候遇到了一个问题,从官网下载的npm依赖上传报错空指针异常,报错如下:
image-20240629163456208
  • 从npmjs官网下载npm依赖tgz包还是会报空指针异常,这种问题特殊处理
  • 首先,开启nexus的认证
image-20240629164017513
  • 服务器当中执行yum install -y nodejs
  • 执行node -v npm -v 查看是否有正确输出
  • 服务器当中执行npm login --registry=http://nexusip:端口号/repository/前端仓库名称
  • 执行npm publish vue-print-nb-jeecg-1.0.12.tgz --registry=http://nexusip:端口/repository/前端仓库名称

HFwas...小于 1 分钟nexusnexus
Nexus操作-下载公网python依赖
  • 注意:内网情况下,无法链接互联网,nexus无法使用公网python依赖,所以需要将公网依赖同步到内网,可以使用此方法。
  • 新建脚本python-download-whl.sh,脚本内容如下所示:
#!/bin/bash

mkdir python
# 包名称
package_name="requests"

# 构建PyPI API查询URL
pypi_api_url="https://pypi.org/pypi/$package_name/json"

# 下载目录
download_dir="./python"

# 确保下载目录存在
mkdir -p "$download_dir"

# 使用curl获取包信息的JSON数据
response=$(curl -s "$pypi_api_url")

# 提取所有版本的.whl文件下载链接
versions=$(echo "$response" | jq -r '.releases | keys[]')

# 遍历每个版本,获取并下载.whl文件
for version in $versions; do
    whl_urls=$(echo "$response" | jq -r ".releases[\"$version\"][] | .url")
    
    # 下载每个版本的.whl文件
    for whl_url in $whl_urls; do
        echo "正在下载 $whl_url..."
        wget -q -P "$download_dir" "$whl_url"
    done
done

echo "下载完成."

HFwas...小于 1 分钟nexusnexus
Nexus操作-上传python依赖
  • 注意:内网情况下,无法链接互联网,nexus无法使用公网python依赖,所以需要将公网依赖同步到内网,可以使用此方法。
  • 新建脚本pythonimport.sh
#!/bin/bash
# 获取命令行参数
while getopts ":r:u:p:" opt; do
    case $opt in
        r) NEXUS_URL="$OPTARG"
        ;;
        u) NEXUS_USERNAME="$OPTARG"
        ;;
        p) NEXUS_PASSWORD="$OPTARG"
        ;;
    esac
done
# find 并批量上传
find . -type f \( -name '*.tgz' -o -name '*.tar.gz' -o -name '*.whl' \)  | sed "s|^\./||" | xargs -I '{}' \
curl -u "$NEXUS_USERNAME:$NEXUS_PASSWORD" -X 'POST' -v \
  ${NEXUS_URL} \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'npm.asset=@{};type=application/x-compressed' ;

HFwas...小于 1 分钟nexusnexus
Nexus操作-迁移nexus依赖
  • nexus提供了一个api,可以获取仓库下所有组件的接口,接口如下:
  • 有一个参数continurationtoken , 可以获取下一次分页的数据,nexus 接口的数据不是一次性返回回来的,是根据上一次接口的continurationtoken的值作为这一次接口的入参来调用,获取这一次的数据。根据这样的原理,我们可以循环调用接口来获取仓库下的所有组件信息
#!/bin/bash

nexusurl=http://ip:port
repository=npm-group
continuationToken=""
mkdir demo1
cd demo1
fetchComponents() {
    local token="$1"

    # 构建CURL命令
    local curlCmd="curl -s -X GET \"$nexusurl/service/rest/v1/components?repository=$repository"
    if [[ "$token" != "" ]]; then
        curlCmd="$curlCmd&continuationToken=$token"
    fi
    curlCmd="$curlCmd\" -H 'accept: application/json' -H 'NX-ANTI-CSRF-TOKEN: 0.028119600179752124' -H 'X-Nexus-UI: true'"

    # 执行请求
    local response=$(eval "$curlCmd")

    # 提取新continuationToken和组件信息
    local newContinuationToken=$(echo "$response" | jq -r '.continuationToken // empty')
    local components=$(echo "$response" | jq -r '.items[] | {group, name, version, path: .assets[].path}')

    # 输出组件信息并保存到文件(可按需调整输出方式)
    echo "$components" >> components_info.json

    # 如果有新的continuationToken,则递归调用
    if [[ "$newContinuationToken" != "" ]]; then
        echo "Fetching next page with continuationToken: $newContinuationToken"
        fetchComponents "$newContinuationToken"
    else
        echo "All components fetched."
    fi
}

# 初始化调用
fetchComponents "$continuationToken"

echo "All component data has been collected. Check components_info.json for details."

HFwas...大约 2 分钟nexusnexus
Nexus操作-上传前端依赖
  • 前端支持三种依赖库,包括三种,分别是hosted , proxy , group类型。

  • 本篇文章完全基于内网环境下,和互联网无法联通的环境下去处理。

  • 前端需要将所需要的前端所有依赖提供给运维人员,运维人员将前端tgz文件推送到nexus上,提供内网流水线CICD使用。

  • 推送前端依赖需要创建两个脚本,和Java类似:

  • 创建npmimport.sh脚本

#!/bin/bash
# 获取命令行参数
while getopts ":r:u:p:" opt; do
    case $opt in
        r) NEXUS_URL="$OPTARG"
        ;;
        u) NEXUS_USERNAME="$OPTARG"
        ;;
        p) NEXUS_PASSWORD="$OPTARG"
        ;;
    esac
done
# find 并批量上传
find . -type f -name '*.tgz'  | sed "s|^\./||" | xargs -I '{}' \
curl -u "$NEXUS_USERNAME:$NEXUS_PASSWORD" -X 'POST' -v \
  ${NEXUS_URL} \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'npm.asset=@{};type=application/x-compressed' ;

HFwas...小于 1 分钟nexusnexus
Nexus操作-Nexus上传java依赖
  • nexus支持的Java依赖库有三种,包括group, hosted, proxy三种。

  • 本篇文件基于内网环境nexus依赖库管理Java依赖,需要将开发人员项目本地编译所需要的依赖库上传到内网环境下

  • 开发人员需要将本地maven配置的本地仓库地址下的依赖库文件夹打包,

  • 运维人员在服务器当中创建两个脚本,推送依赖库到对应的nexus

  • 创建脚本,命名为:nexus-push.sh,将repoDir修改为存放maven依赖的地址。


HFwas...大约 1 分钟nexusnexus
Nexus操作-Nexus下载前端npm依赖
  • 此脚本是为了方便开发人员运维人员下载前端n p m依赖而编写使用,因为是自己在项目使用,所以分享出来
  • 前端的依赖管理工具是npm的话,执行npm install命令,会在本地前端项目路径下生成package-lock.json文件,文件当中指定了前端项目所需要的各种依赖,以及对应依赖的约束版本
  • 下载前端依赖就是基于package-lock.json当中的版本依赖路径决定。
  • 前提条件
    • 需要前端开发人员提供package-lock.json
    • 运维人员下载依赖需要在互联网环境下,需要可以访问https://www.npmjs.com/package/vue
  • 创建脚本为npm-download.sh,脚本内容如下:

HFwas...大约 2 分钟nexusnexus
Nexus操作-下载前端yarn-resoluted依赖
  • 前端依赖管理工具如果是通过yarn来管理,执行yarn install会生成一个文件,文件名称为:yarn.lock文件,
  • yarn.loc文件当中如果有resolved字段,可以使用这个脚本来下载依赖
  • 创建脚本,脚本内容为:
#!/bin/bash
repolist=$(cat yarn.lock | grep resolved | awk '{print $2}')
echo ${repolist} > yarn.txt

for package in $repolist; do
  array=$(echo "$package" | sed 's|/-/.*||')
  echo ${array[@]}
  a2=${array##*//}
  arr=($(echo "$a2" | tr '/' ' '))
  echo ${arr[@]}
  for var in "${arr[@]}"; do
    if [ ${#arr[@]} -eq 3 ]; then
      PACKAGE_NAME="${arr[1]}/${arr[2]}"
      PACKAGE="${arr[2]}"
      echo $PACKAGE_NAME
      echo $PACKAGE
      # File containing version information (each line contains a version)
      VERSION_FILE="versions12300.txt"

      # Specify the registry URL
      REGISTRY_URL="https://registry.npmmirror.com"

      curl -s "${REGISTRY_URL}/${PACKAGE_NAME}/" | jq -r '.versions | keys_unsorted | .[]' > "$VERSION_FILE"

      # Create a directory to store the downloaded files
      if [ ! -d  $PACKAGE_NAME ]; then
        mkdir -p $PACKAGE_NAME

        echo $PACKAGE_NAME >> latest.txt

        # Iterate through each version and download the corresponding .tgz file
        while IFS= read -r VERSION; do
            FILE_NAME="${PACKAGE}-${VERSION}.tgz"

            DOWNLOAD_URL="${REGISTRY_URL}/${PACKAGE_NAME}/-/${FILE_NAME}"

            if [ ! -f ${PACKAGE_NAME}/${FILE_NAME} ]; then
                if wget --spider --quiet "$DOWNLOAD_URL"; then
                  echo "Downloading ${DOWNLOAD_URL}..."
                  wget $DOWNLOAD_URL -O ${PACKAGE_NAME}/${FILE_NAME}
                  cp ${PACKAGE_NAME}/${FILE_NAME} /Users/houfei/anpm/
                fi

            fi
        done < "$VERSION_FILE"
      else
        # Iterate through each version and download the corresponding .tgz file
        while IFS= read -r VERSION; do
            FILE_NAME="${PACKAGE}-${VERSION}.tgz"

            DOWNLOAD_URL="${REGISTRY_URL}/${PACKAGE_NAME}/-/${FILE_NAME}"
            echo $VERSION
            if [ ! -f ${PACKAGE_NAME}/${FILE_NAME} ]; then
                if wget --spider --quiet "$DOWNLOAD_URL"; then
                  echo "Downloading ${DOWNLOAD_URL}..."
                  echo "${DOWNLOAD_URL}" >> latest-version.txt
                  wget $DOWNLOAD_URL -O ${PACKAGE_NAME}/${FILE_NAME}
                  cp ${PACKAGE_NAME}/${FILE_NAME} /Users/houfei/anpm/
                fi

            fi
        done < "$VERSION_FILE"
      fi
    elif [ ${#arr[@]} -eq 2 ]; then
      PACKAGE_NAME="${arr[1]}"
      PACKAGE="${arr[1]}"
      echo $PACKAGE_NAME
      echo $PACKAGE
      # File containing version information (each line contains a version)
      VERSION_FILE="versions12300.txt"

      # Specify the registry URL
      REGISTRY_URL="https://registry.npmmirror.com"

      curl -s "${REGISTRY_URL}/${PACKAGE_NAME}/" | jq -r '.versions | keys_unsorted | .[]' > "$VERSION_FILE"

      if [ ! -d $PACKAGE_NAME ]; then
        # Create a directory to store the downloaded files
        mkdir -p $PACKAGE_NAME

        echo $PACKAGE_NAME >> latest.txt

        # Iterate through each version and download the corresponding .tgz file
        while IFS= read -r VERSION; do
            FILE_NAME="${PACKAGE}-${VERSION}.tgz"

            DOWNLOAD_URL="${REGISTRY_URL}/${PACKAGE_NAME}/-/${FILE_NAME}"

            if [ ! -f ${PACKAGE_NAME}/${FILE_NAME} ]; then
                if wget --spider --quiet "$DOWNLOAD_URL"; then
                  echo "Downloading ${DOWNLOAD_URL}..."
                  wget $DOWNLOAD_URL -O ${PACKAGE_NAME}/${FILE_NAME}
                  cp ${PACKAGE_NAME}/${FILE_NAME} /Users/houfei/anpm/
                fi

            fi
        done < "$VERSION_FILE"
      else
        # Iterate through each version and download the corresponding .tgz file
        while IFS= read -r VERSION; do
            FILE_NAME="${PACKAGE}-${VERSION}.tgz"

            DOWNLOAD_URL="${REGISTRY_URL}/${PACKAGE_NAME}/-/${FILE_NAME}"
            echo $VERSION
            if [ ! -f ${PACKAGE_NAME}/${FILE_NAME} ]; then
                if wget --spider --quiet "$DOWNLOAD_URL"; then
                  echo "Downloading ${DOWNLOAD_URL}..."
                  echo "${DOWNLOAD_URL}" >> latest-version.txt
                  wget $DOWNLOAD_URL -O ${PACKAGE_NAME}/${FILE_NAME}
                  cp ${PACKAGE_NAME}/${FILE_NAME} /Users/houfei/anpm/
                fi

            fi
        done < "$VERSION_FILE"
      fi
    fi
  done
done

HFwas...大约 2 分钟nexusnexus