• Git--09 创建Maven项目


    1. 创建Maven项目

    ​ Maven是一个项目管理和综合工具。Maven提供给开发人员构建一个完整的生命周期框架。

    ​ 开发团队可以自动完成该项目的基础设施建设,Maven使用标准的目录结构和默认构建生命周期。

    Apache的开源项目主要服务于Java平台的构建、依赖管理、项目管理。

    Project Object Model,项目对象模型。通过xml格式保存的pom.xml文件。

    该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。该文件是由开发维护,我们运维人员可以不用去关心。

    mvn package #会去maven的中央仓库去下载需要的依赖包和插件到.m2目录下

    2、创建Maven私服nexus

    部署私服 xenus

    下载https://www.sonatype.com/download‐oss‐sonatype

    配置仓库两个选项

    1、项目下的pom.xml配置、只生效当前的项目

    2、在maven配置全局所有项目生效

    上传JDK和nexus安装包
    
    rpm ‐ivh jdk‐8u121‐linux‐x64.rpm
    
    mv nexus‐3.13.0‐01 /usr/local/
    
    ln ‐s /usr/local/nexus‐3.13.0‐01 /usr/local/nexus
    
    /usr/local/nexus/bin/nexus start
    10.0.0.202:8081 admin admin123
    配置Maven全局配置文件
    /usr/local/maven/conf/settings.xml
    ## 3.创建一个Maven项目
    创建前上传代码到gitlab服务器,把java项目添加到gitlab仓库中
    
    
    

    01. 部署Maven

    官网: http://maven.apache.org/download.cgi

    清华镜像: https://mirrors.tuna.tsinghua.edu.cn/apache/maven/

    **上传软件包**
    [root@jenkins ~]# ll
    -rw-r--r-- 1 root root 8491533 2018-08-27 14:38 apache-maven-3.3.9-bin.tar.gz
    **解压**
    [root@jenkins ~]# tar xf apache-maven-3.3.9-bin.tar.gz
    **改变目录位置**
    [root@jenkins maven]# mv apache-maven-3.3.9 /usr/local/maven-3.3.9
    **软连接**
    [root@jenkins maven]# ln -s /usr/local/maven-3.3.9 /usr/local/maven
    [root@jenkins ~]# cd /usr/local/maven
    [root@jenkins maven]# ll
    total 32
    drwxr-xr-x 2 root root 97 2019-11-20 21:55 bin
    drwxr-xr-x 2 root root 42 2019-11-20 21:55 boot
    drwxr-xr-x 3 root root 63 2015-11-11 00:38 conf
    drwxr-xr-x 3 root root 4096 2019-11-20 21:55 lib
    -rw-r--r-- 1 root root 19335 2015-11-11 00:44 LICENSE
    -rw-r--r-- 1 root root 182 2015-11-11 00:44 NOTICE
    -rw-r--r-- 1 root root 2541 2015-11-11 00:38 README.txt
    **设置环境变量**
    [root@jenkins maven]# echo "export PATH=/usr/local/maven/bin/:$PATH" >>/etc/profile
    [root@jenkins maven]# source /etc/profile
    
    **查看结果**
    [root@jenkins maven]# mvn -v
    Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
    Maven home: /usr/local/maven
    Java version: 1.8.0_181, vendor: Oracle Corporation
    Java home: /usr/java/jdk1.8.0_181-amd64/jre
    Default locale: en_US, platform encoding: UTF-8
    OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"
    

    02. 编译测试

    上传一个简单的java项目包hello‐world.tar.gz进行解压

    [root@jenkins ~]# ll
    -rw-r--r-- 1 root root 1325 2018-08-22 13:43 hello-world.tar.gz
    [root@jenkins ~]# tar xf hello-world.tar.gz
    [root@jenkins ~]# cd hello-world/
    validate(验证):     验证项目正确,并且所有必要信息可用。
    compile(编译):    编译项目源码
    test(测试):         使用合适的单元测试框架测试编译后的源码。
    package(打包):     源码编译之后,使用合适的格式(例如JAR格式)对编译后的源码进行打包。integration‐test(集成测试): 如果有需要,把包处理并部署到可以运行集成测试的环境中去。verify(验证):     进行各种测试来验证包是否有效并且符合质量标准。
    install(安装):     把包安装到本地仓库,使该包可以作为其他本地项目的依赖。
    deploy(部署):     在集成或发布环境中完成,将最终软件包复制到远程存储库,以与其他开发人员和项目共享。
    mvn clean (清除) : 清除上次编译的结果
    
    **测试**
    [root@jenkins hello-world]# mvn test
    #打包
    [root@jenkins hello-world]# mvn package    #会去maven的中央仓库去下载需要的依赖包和插件到.m2目录下
    #打包结果
    [root@jenkins hello-world]# ll target/
    total 8
    drwxr-xr-x 3 root root 17 2019-11-20 22:13 classes
    -rw-r--r-- 1 root root 3130 2019-11-20 23:39 hello-world-1.0-SNAPSHOT.jar
    drwxr-xr-x 2 root root 28 2019-11-20 23:38 maven-archiver
    drwxr-xr-x 3 root root 35 2019-11-20 22:13 maven-status
    -rw-r--r-- 1 root root 2872 2019-11-20 23:38 original-hello-world-1.0-SNAPSHOT.jar
    drwxr-xr-x 2 root root 125 2019-11-20 22:14 surefire-reports
    drwxr-xr-x 3 root root 17 2019-11-20 22:13 test-classes
    
    

    03. 部署Tomcat及数据库

    #上传压缩包
    [root@tomcat ~]# ll
    -rw-r--r-- 1 root root 9128610 Mar 27 2019 apache-tomcat-8.0.27.tar.gz
    -rw-r--r-- 1 root root 170023183 Aug 14 2018 jdk-8u181-linux-x64.rpm
    
    #安装JDK
    [root@tomcat ~]# rpm -ivh jdk-8u181-linux-x64.rpm
    warning: jdk-8u181-linux-x64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
    Preparing... ################################# [100%]
    Updating / installing...
    1:jdk1.8-2000:1.8.0_181-fcs ################################# [100%]
    Unpacking JAR files...  
    tools.jar...  
    plugin.jar... 
    javaws.jar... 
    deploy.jar...
    rt.jar... 
    jsse.jar... 
    charsets.jar...
    localedata.jar...
    #解压Tomcat
    [root@tomcat ~]# mkdir /application
    [root@tomcat ~]# tar xf apache-tomcat-8.0.27.tar.gz -C /application
    #创建软连接
    [root@tomcat ~]# ln -s /application/apache-tomcat-8.0.27 /application/tomcat
    #tomcat启动加速的方法
    [root@tomcat ~]# vim /usr/java/jdk1.8.0_181-amd64/jre/lib/security/java.security
    117 securerandom.source=file:/dev/urandom #修改之后
    #启动tomcat
    [root@tomcat ~]# /application/tomcat/bin/startup.sh
    Using CATALINA_BASE: /application/tomcat
    Using CATALINA_HOME: /application/tomcat
    Using CATALINA_TMPDIR: /application/tomcat/temp
    Using JRE_HOME: /usr
    Using CLASSPATH: /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jarTomcat started.
    #检查端口
    [root@tomcat ~]# netstat -lntp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
    tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6758/sshd
    tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 7134/master
    tcp6 0 0 :::8009 :::* LISTEN 24383/java
    tcp6 0 0 :::8080 :::* LISTEN 24383/java
    tcp6 0 0 :::22 :::* LISTEN 6758/sshd
    tcp6 0 0 ::1:25 :::* LISTEN 7134/master
    tcp6 0 0 127.0.0.1:8005 :::* LISTEN 24383/java
    
    

    浏览器使用8080端口访问

    #为项目准备好数据库jeesns,设置数据库root用户密码为root
    
    #安装数据库
    [root@tomcat ~]# yum install mariadb-server -y
    [root@tomcat ~]# systemctl start mariadb.service
    [root@tomcat ~]# mysqladmin password 'root'
    #创建jeesns库
    [root@tomcat ~]# mysql -uroot -proot -e "create database jeesns;"
    #dev上面上传一个项目
    [root@git ~]# ll
    -rw-r--r-- 1 root root 15376795 2019-03-27 17:33 jeesns.tar.gz
    [root@git ~]# tar xf jeesns.tar.gz
    [root@git ~]# cd jeesns/
    [root@git ~/jeesns]# git remote 
    origin
    [root@git ~/jeesns]# git remote remove origin
    [root@git ~/jeesns]# ll jeesns-web/database/
    total 40
    -rwxr-xr-x 1 root root 28667 2018-11-19 15:01 jeesns.sql
    -rw-r--r-- 1 root root 3491 2018-11-19 15:01 update_1.2.0to1.2.1.sql
    -rw-r--r-- 1 root root 1026 2018-11-19 15:01 update_1.2.1to1.3.sql
    -rw-r--r-- 1 root root 1344 2018-11-19 15:01 update_1.3to1.3.1.sql
    
    #将该数据库传输到tomcat节点进行导入
    [root@git ~/jeesns]# scp jeesns-web/database/jeesns.sql root@10.0.0.80:~
    
    #导入数据库
    [root@tomcat ~]# mysql -uroot -proot jeesns < jeesns.sql
    [root@tomcat ~]# mysql -uroot -proot -e "use jeesns; show tables"
    +---------------------------+
    | Tables_in_jeesns |
    +---------------------------+
    | tbl_action |
    | tbl_action_log |
    | tbl_ads |
    |tbl_picture_favor |
    | tbl_picture_tag |
    | tbl_score_detail |
    |tbl_weibo_comment |
    | tbl_weibo_favor |
    | tbl_weibo_topic |
    +---------------------------+
    
    #打包jeesns项目
    [root@git ~/jeesns]# mvn package
    
    #打包之后生成的war包
    [root@git ~/jeesns]# ll jeesns-web/target/
    total 25496
    drwxr-xr-x 4 root root 181 2019-11-20 23:19 classes
    drwxr-xr-x 3 root root 25 2019-11-20 23:19 generated-sources
    drwxr-xr-x 5 root root 104 2019-11-20 23:19 jeesns-web
    -rw-r--r-- 1 root root 26106028 2019-11-20 23:20 jeesns-web.war
    drwxr-xr-x 2 root root 28 2019-11-20 23:19 maven-archiver
    drwxr-xr-x 3 root root 35 2019-11-20 23:19 maven-status
    
    #将其手动传输到tomcat节点上面测试
    [root@git ~/jeesns]# scp jeesns-web/target/jeesns-web.war root@10.0.0.80:/application/tomcat/webapps/ROOT.war
    

    浏览器刷新测试

    04. 创建一个jeesns项目

    #清除上次编译的结果
    [root@git ~/jeesns]# mvn clean
    [root@git ~/jeesns]# git remote remove origin
    [root@git ~/jeesns]# git remote add origin git@10.0.0.100:OPS/jeesns.git
    [root@git ~/jeesns]# git add .
    [root@git ~/jeesns]# git commit -m "Initial commit"
    # On branch master
    nothing to commit, working directory clean
    [root@git ~/jeesns]# git push -u origin master
    Counting objects: 1946, done.
    Compressing objects: 100% (1862/1862), done.
    Writing objects: 100% (1946/1946), 7.09 MiB | 7.25 MiB/s, done.
    Total 1946 (delta 285), reused 0 (delta 0)
    remote: Resolving deltas: 100% (285/285), done.
    To git@10.0.0.100:OPS/jeesns.git
    * [new branch] master -> master
    Branch master set up to track remote branch master from origin. 
    

    05. Jenkins创建一个maven

    #此处如果出现报错,请添加Deploy Keys

    #发现已经打包成功了

    [root@jenkins ~]# ll /var/lib/jenkins/workspace/maven-job/jeesns-web/target/jeesns-web.war
    -rw-r--r-- 1 root root 26106007 2019-11-23 11:49 /var/lib/jenkins/workspace/maven-job/jeesns-web/target/jeesns-web.war
    
    **jenkins用户给tomcat节点进行分发公钥**
    [root@jenkins ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.0.0.80
    **构建后操作**
    ssh root@10.0.0.80 "mv /application/tomcat/webapps/ROOT.war /tmp/$BUILD_ID-ROOT.war"
    
    scp /var/lib/jenkins/workspace/maven-job/jeesns-web/target/jeesns-web.war root@10.0.0.80:/application/tomcat/webapps/ROOT.war
    

    [root@tomcat ~]# ll /tmp/total 50992-rw-r--r-- 1 root root 26106004 2019-11-23 01:28 2-ROOT.war
    

    3. Pipeline项目

    01. 基础概念

    CI/CD持续集成/持续部署

    ​ 持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员
    每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动
    化测试)来验证,从而尽早地发现集成错误。

    ​ 比如(你家装修厨房,其中一项是铺地砖,边角地砖要切割大小。如果一次全切割完再铺上去,发现尺寸有误的话
    浪费和返工时间就大了,不如切一块铺一块。这就是持续集成。)

    ​ 持续部署(continuous deployment)是通过自动化的构建、测试和部署循环来快速交付高质量的产品。某种程度上代表了一个开发团队工程化的程度,毕竟快速运转的互联网公司人力成本会高于机器,投资机器优化开发流程化
    相对也提高了人的效率。

    ​ 比如(装修厨房有很多部分,每个部分都有检测手段,如地砖铺完了要测试漏水与否,线路铺完了要通电测试电路
    通顺,水管装好了也要测试冷水热水。如果全部装完了再测,出现问题可能会互相影响,比如电路不行可能要把地
    砖给挖开……。那么每完成一部分就测试,这是持续部署。)

    ​ 持续交付 Continuous Delivery:频繁地将软件的新版本,交付给质量团队或者用户,以供评审尽早发现生产环境中存在的问题;如果评审通过,代码就进入生产阶段. 比如(全部装修完了,你去验收,发现地砖颜色不合意,水池太小,灶台位置不对,返工吗?所以不如没完成一部
    分,你就去用一下试用验收,这就是持续交付。)

    敏捷思想中提出的这三个观点,还强调一件事:通过技术手段自动化这三个工作。加快交付速度。

    1.什么是pipeline
    Jenkins 2.0的精髓是Pipeline as Code,是帮助Jenkins实现CI到CD转变的重要角色。什么是Pipeline,简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个
    任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline as Code的理念。

    2.Pipeline 概念
    Pipeline 是一个用户定义的 CD 流水线模式。Pipeline 代码定义了通常包含构建、测试和发布步骤的完整的构
    建过程。

    Node node 是一个机器,它是 Jenkins 环境的一部分,并且能够执行 Pipeline。同时,node 代码块也是脚本式
    Pipeline 语法的关键特性。

    Stage Stage 块定义了在整个 Pipeline 中执行的概念上不同的任务子集(例如"构建","测试"和"部署"阶段),
    许多插件使用它来可视化或呈现 Jenkins 管道状态/进度。

    Step 一项任务。从根本上讲,一个步骤告诉 Jenkins 在特定时间点(或过程中的"步骤")要做什么。例如,使用
    sh step:sh 'make' 可以执行 make 这个 shell 命令。

    3.jenkins file声明式
    脚本式

    脚本式语法格式:
    pipeline{ 
    	agent any
    stages{
    	stage("get code"){ 
        	steps{     
            	echo "get code from scm"        
            	}
            }    
        stage("package"){   
            steps{
            echo "packge code"       
            } 
        }   	
        stage("deploy"){  
            steps{
              	echo "deploy packge to node1"     
                }
            } 
                }
    }
    
    
    

    #回滚脚本
    vim huigun.sh
    #!/bin/bash
    cd /usr/share/nginx/    (进到nginx目录)
    ls -d web-*             (查看web版本)
    read -p "复制你需要回滚的目录版本" ver   (传参)
    rm -fr html               (删除软连接)
    ln -s $ver html           (重新软连接)
    
    

    02. 创建pipeline项目


    在仓库创建一个Jenkinsfile文件进行调用

    编辑Jenkinsfile文件

    pipeline{   
    	agent any
    stages{    
    	stage("get code"){   
        	steps{
            	echo "get code"      
             }   
         }  
         stage("unit test"){   
         	steps{  
            echo "unit test"       
            }
        }    
        stage("package"){
        	steps{ 
        sh 'tar zcf /opt/web-${BUILD_ID}.tar.gz ./* --exclude=./.git --exclude=Jenkinsfile'    
        	}
        } 
        stage("deploy"){  
        	steps{         
        		sh 'ssh 10.0.0.80 "mkdir /opt/web-${BUILD_ID}"'    
        		sh 'scp /opt/web-${BUILD_ID}.tar.gz 10.0.0.80:/opt'         
        		sh 'ssh 10.0.0.80 "tar xf /opt/web-${BUILD_ID}.tar.gz -C /code"'   
        		} 
        	}
        }
    }
    

    执行构建报错

    修改脚本再次构建

  • 相关阅读:
    《淘宝网》为例,描述质量属性的六个常见属性场景
    《苏宁安全架构演进及实践》阅读总结
    《12306核心模型设计思路和架构设计》阅读心得
    放假个人总结七
    放假个人总结六
    放假个人总结五
    连接Oracle提示 ORA-28009: 应当以 SYSDBA 身份或 SYSOPER 身份建立 SYS 连接
    连接oracle无匹配协议
    CentOS 7下虚拟机没有网络
    CentOS 7安装时候没装ifconfig命令
  • 原文地址:https://www.cnblogs.com/gongjingyun123--/p/11993211.html
Copyright © 2020-2023  润新知