DevOps / Jenkins / Nexus

Jenkins集成Nexus对Npm制品管理

浅时光 · 4月26日 · 2020年 · · 15047次已读

一、总体流程

开发人员通过SVN或者Git提交代码至代码仓库,每个发布的版本都会进行更新package.json信息。然后通过npm publish命令上传制品到nexus;最后通过nexus插件可以在Job的Web界面获取到每个版本的包下载地址,结合shell脚本进行下载。实现一次打包多套环境节点主机部署;比如前端代码需要解决浏览器缓存问题,文章来源(Source):https://www.dqzboy.comwebpack编辑文件,时间会参与hash值进行计算,那么相同代码不同进行编译生成的hash值都不同,这样如果是多台环境都进行打包编译,那么发布的项目文件就会出现不一致。这个问题可以文章来源(Source):https://www.dqzboy.com通过更改vue.config.js文件中的process.env.VUE_APP_BUILD_TIME参数进行注释解决,但是为了解决浏览器缓存问题这个还是建议进行保留。

二、配置项目

在项目的源码文件中编辑package.json文件,写入发布的文章来源(Source):https://www.dqzboy.com文章来源(Source):https://www.dqzboy.com版本名称(name),版本号等信息

1、Nexus创建仓库

Jenkins集成Nexus对Npm制品管理-浅时光博客
Jenkins集成Nexus对Npm制品管理-浅时光博客
文章来源(Source):https://www.dqzboy.com
Jenkins集成Nexus对Npm制品管理-浅时光博客
Jenkins集成Nexus对Npm制品管理-浅时光博客
Jenkins集成Nexus对Npm制品管理-浅时光博客
Jenkins集成Nexus对Npm制品管理-浅时光博客

2、Nexus添加Realms

Jenkins集成Nexus对Npm制品管理-浅时光博客
  • 注:如果不添加会导致上传制品时401无权限问题

3、登入Nexus私服

Jenkins的服务器上登入到刚才创建的NPM私服,登入成功会在当前执行npm命令的用户家目录下生成一个.npm文章来源(Source):https://www.dqzboy.comrc文件,里面会文章来源(Source):https://www.dqzboy.com存储私服的地址和私服的登入账号密码

[[email protected] ~]$ npm login --registry=http://nexus_ip:prot/repository/npm-repository/
Username: admin    #用户
Password:    #密码
Email: (this IS public) [email protected]    #邮箱
Logged in as admin on http://nexus_ip:prot/repository/npm-repository/ .
  • 备注:多个Repository仓库的地址都可以写入到.npm文章来源(Source):https://www.dqzboy.comrc文件中进行存储

三、结合Jenki文章来源(Source):https://www.dqzboy.comns

1、配置凭据

  • 配置连接到Nexus平台账号密码
Jenkins集成Nexus对Npm制品管理-浅时光博客
Jenkins集成Nexus对Npm制品管理-浅时光博客

2、编辑脚本

2.1:Pipeline脚本

文章来源(Source):https://www.dqzboy.com
pipeline {
    agent  { 
        node { label 'Slave1'} 	#选择jenkins节点
    }
    environment {
        dev_serverIP = "192.168.66.80"	#开发环境节点ip
        test_serverIP = "192.168.66.81"	#测试环境节点ip
        CODE_DIR = "/data/web_client "  #代码存储目录(各节点存储路径统一)
        server_user = "appadmin"			#ssh登入用户(前提是已经实现免密)
        DEPLOY = "$DEPLOY"		#Job前端指定的部署环境传给DEPLOY变量
    }

    stages {
        stage('Checkout') {
        //只在开发环境进行代码检出
        when {
            environment name: 'DEPLOY',value: 'dev'
        }
        steps {
		          //job中调用REVISION实现在web界面选择不同分支进行构建
              checkout([$class: 'GitSCM', branches: [[name: '${REVISION}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'bc392f71-0bd0-4011-aedc-a5345f8f6b2e', url: '项目gitlab存储路径']]])
            }
        }
        
        stage('代码构建') {
            //只有开发环境进行代码构建,其他环境直接下载成品即可
            when {
                environment name: 'DEPLOY',value: 'dev'
            }
            steps{
                // npm构建
                script {
                    sh '''
                        /usr/local/bin/cnpm install
                        /usr/local/bin/npm run build
                    '''
                }
            }
        }
        
        stage('上传制品') {
            when {
                environment name: 'DEPLOY',value: 'dev'
            }
            steps{
                script {
                    sh '''
                        cp package.json dist/
                        cd dist/
                        /usr/local/bin/npm publish --registry=http://nexus_ip:PORT/repository/npm-repository/
                    '''
                }
            }
        }

        stage('部署到开发环境') {
            when {
                environment name: 'DEPLOY',value: 'dev'
            }
 
            steps {
                script {
                    sh '''
			                  #调用发布节点环境中的版本备份脚本
                        ssh ${server_user}@${dev_serverIP} "/script/web_client.sh"
                        ssh ${server_user}@${prod_serverIP} "/script/web_client.sh"
                        scp -r ./dist/* ${server_user}@${dev_serverIP}:${CODE_DIR}/package
                    '''
                }
            }
        }
        stage('部署到测试环境') {
            when {
                environment name: 'DEPLOY',value: 'test'
            }
            steps {
                script {
                    sh '''
                        ssh ${server_user}@${test_serverIP} "/script/web_client.sh"
			                  #调用下载制品脚本,并进行解压到目标目录下
                        ssh ${server_user}@${test_serverIP} "cd /opt/web_code && /script/wget_nexus ${Package} && tar -xf *.tgz -C ${CODE_DIR} && rm -f *.tgz"
                    '''
                } 
            }
        }
        stage('进行访问测试') {         
            steps { 
                script {                    
                    sh 'curl -I ${HTTP_URL}'
                }
            }
        }
     }

     #下面执行构建消息通知,需要安装企业微信插件
     post {
           success {
	           script {
	               if ("${DEPLOY}" == "uat" || "${DEPLOY}" == "prod") {
		                 qyWechatNotification mentionedId: '', 
		                 mentionedMobile: '',
		                 webhookUrl: ''
	               }
	               else {
	                   qyWechatNotification mentionedId: '', 
		                 mentionedMobile: '', 
		                 webhookUrl: ''
	               }
	            }
           }
           failure {
	            script {
	              if ("${DEPLOY}" == "uat" || "${DEPLOY}" == "prod"){
		                qyWechatNotification mentionedId: '', 
		                mentionedMobile: '', 
		                webhookUrl: ''
	              }
	              else {
		                qyWechatNotification mentionedId: '', 
		                mentionedMobile: '', 
		                webhookUrl: ''
	              }
	          }
        }
    }
}

2.2:Shell脚本

#在各个目标节点服务器上编辑shell脚本,用来从nexus下载制品
[[email protected] ~]# cd /script/wget_nexus
#!/bin/bash
wget --user="nexus用户" --password="nexus密码" $1 &>/dev/null 
  • 注:如果想要该脚本中的账号密码不在pipeline中进行显示,可以将脚本文件通过shc的方式进行加密;也防止别人可以直接看到脚本中存储的nexus账号密码

2.3:创建目录

  • 在各个节点上创建制品临时存储目录
[[email protected] ~]# mkdir -p /opt/web_code
[[email protected] ~]# chown -R appadmin. /opt/web_code
  • 在各个节点上创建程序存储目录
[[email protected] ~]# mkdir -p /data/web_client/package
[[email protected] ~]# chown -R appadmin. /data/web_client/package

3、配置JOB

  • 所需插件:
    • Nexus Artifact Uploader:上传制品到制品库
    • Nexus Platform:一个将Nexus Repository Manager和Nexus Lifecycle集成到Jenkins作业中的插件
Jenkins集成Nexus对Npm制品管理-浅时光博客
Jenkins集成Nexus对Npm制品管理-浅时光博客
Jenkins集成Nexus对Npm制品管理-浅时光博客
Jenkins集成Nexus对Npm制品管理-浅时光博客
  • 注意:只需要在开发环境中配置REVISION即可,其他环境无需该参数
Jenkins集成Nexus对Npm制品管理-浅时光博客
Jenkins集成Nexus对Npm制品管理-浅时光博客
Jenkins集成Nexus对Npm制品管理-浅时光博客
Jenkins集成Nexus对Npm制品管理-浅时光博客

4、执行JOB

Jenkins集成Nexus对Npm制品管理-浅时光博客
Jenkins集成Nexus对Npm制品管理-浅时光博客
Jenkins集成Nexus对Npm制品管理-浅时光博客
  • 部署到测试环境
Jenkins集成Nexus对Npm制品管理-浅时光博客
Jenkins集成Nexus对Npm制品管理-浅时光博客
Jenkins集成Nexus对Npm制品管理-浅时光博客
0 条回应
    本站已安全运行: | 耗时 0.582 秒 | 查询 112 次 | 内存 20.07 MB