• Jenkins持续集成


    官网:Jenkins.io

    Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,皆在提供一个开放易用的软件平台,使软件的持续集成变成可能

    Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。

    jenkins安装

    #jenkins是java写的,需要java环境
    [root@jenkins ~]# yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
    #下载jenkins安装包
    [root@jenkins ~]# wget https://pkg.jenkins.io/redhat-stable/jenkins-2.107.1-1.1.noarch.rpm
    #安装jenkins
    [root@jenkins ~]# rpm -ivh jenkins-2.107.1-1.1.noarch.rpm
    #修改管理用户
    [root@k8s-node01 ~]# vim /etc/sysconfig/jenkins
    JENKINS_USER="root"
    #启动jenkins
    [root@jenkins ~]# systemctl start jenkins
    #jenkins端口是8080
    [root@jenkins ~]# netstat -lntup
    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      1185/sshd           
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1284/master         
    tcp6       0      0 :::8080                 :::*                    LISTEN      2093/java           
    tcp6       0      0 :::22                   :::*                    LISTEN      1185/sshd           
    tcp6       0      0 ::1:25                  :::*                    LISTEN      1284/master         
    [root@jenkins ~]# 
    
    #如果启动一直加载则修改一些文件
    [root@jenkins jenkins]# vim /var/lib/jenkins/updates/default.json
    把 "connectionCheckUrl":"http://www.google.com/" 改为 "connectionCheckUrl":"http://www.baidu.com/"
    

    jenkins主要目录

    [root@jenkins ~]# rpm -ql jenkins 
    /etc/init.d/jenkins         	# 启动文件
    /etc/logrotate.d/jenkins    	# 日志分割配置文件
    /etc/sysconfig/jenkins      	# jenkins主配置文件
    /usr/lib/jenkins            	# 存放war包目录
    /usr/lib/jenkins/jenkins.war	# war 包 
    /usr/sbin/rcjenkins         	# 命令
    /var/cache/jenkins          	# war包解压目录 jenkins网页代码目录
    /var/lib/jenkins            	# jenkins 工作目录
    /var/log/jenkins             	# 日志
    
    

    jenkins的web界面安装

    解锁jenkins

    [root@jenkins jenkins]# cat /var/lib/jenkins/secrets/initialAdminPassword
    bc26ac11763e4347ac7d9de640aeb971
    [root@jenkins jenkins]# 
    

    更改密码

    安装插件

    [root@jenkins ~]# tar xf plugins.tar.gz 
    
    [root@jenkins ~]# cd /var/lib/jenkins/plugins/
    [root@jenkins plugins]# mv ~/plugins/* .
    [root@jenkins plugins]# systemctl restart jenkins.service 
    

    jenkins创建项目




    [root@jenkins jenkins]# ll /var/lib/jenkins/workspace/opesn-job/
    total 0
    -rw-r--r-- 1 jenkins jenkins 0 Aug 30 21:11 test.txt
    [root@jenkins jenkins]# 
    
    

    jenkins与gitlab连接

    gitlab服务器

    [root@git ~]# git clone https://gitee.com/kangjie1209/monitor.git
    

    [root@git dzp]# mv monitor dzp
    [root@git dzp]# git init
    [root@git dzp]# git remote add origi git@10.0.1.90:test/dzp.git
    [root@git dzp]# git add .
    [root@git dzp]# git commit -m "Initial commit"
    [root@git dzp]# git push origi master 
    [root@git dzp]# 
    
    

    Jenkins服务器

    选择SSH密钥和证书,然后选择直接输入,将私钥复制到下框中即可
    添加完成后,点击保存

    使用脚本推送到web服务器

    [root@jenkins scripts]# vim deploy.sh
    #!/bin/bash
    
    code_dir=/var/lib/jenkins/workspace/opesn-job/
    TIME=$(date +%F-%H-%M-%S)
    web_dir=/usr/share/nginx/html
    ip=10.0.1.7
    cd $code_dir && tar -zcf /tmp/web-${TIME}.tar.gz ./*
    scp /tmp/web-${TIME}.tar.gz ${ip}:${web_dir}
    ssh root@$ip "cd ${web_dir} && tar xf web-${TIME}.tar.gz"
    
    

    自动构建方式

    Jenkins的web界面

    gitlab的web界面

    将构建状态返回给gitlab




    Maven

    Maven是一个项目管理和综合工具。Maven提供给开发人员构建一个完整的生命周期框架。
    开发团队可以自动完成该项目的基础设施建设,Maven使用标准的目录结构和默认构建生命周期。
    Apache的开源项目主要服务于JAVA平台的构建、依赖管理、项目管理。
    Project Object Model,项目对象模型。通过xml格式保存的pom.xml文件。该文件用于管理:源代码、配置文
    件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。该文件是由开
    发维护,我们运维人员可以不用去关心。
    1、下载Maven 3安装包
    官网:http://maven.apache.org/download.cgi
    清华镜像:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/

    maven安装

    [root@jenkins ~]# tar xf apache-maven-3.3.9-bin.tar.gz 
    [root@jenkins ~]# mv apache-maven-3.3.9 /usr/local/
    [root@jenkins ~]# cd /usr/local/
    [root@jenkins local]# ln -s apache-maven-3.3.9 maven
    [root@jenkins bin]# echo 'export PATH=/usr/local/maven/bin/:$PATH' >>/etc/profile
    [root@jenkins bin]# source /etc/profile
    [root@jenkins bin]# 
    [root@jenkins ~]# 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_222, vendor: Oracle Corporation
    Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-0.el7_6.x86_64/jre
    Default locale: en_US, platform encoding: UTF-8
    OS name: "linux", version: "3.10.0-693.el7.x86_64", arch: "amd64", family: "unix"
    [root@jenkins ~]# 
    
    
    

    上传一个简单的java项目包

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

    创建maven私服

    创建maven的阿里云私服

    [root@jenkins target]# cd /usr/local/maven/conf/
    [root@jenkins conf]# cp settings.xml{,.bak}
    [root@jenkins conf]# vim settings.xml
    159     <mirror>
    160       <id>nexus-aliyun</id>
    161       <mirrorOf>*</mirrorOf>
    162       <name>Nexus aliyun</name>
    163       <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    164     </mirror>
    
    
    

    创建maven的nexus私服

    主机名 ip地址
    nexus 10.0.1.92
    jenkins 10.0.1.91
    部署私服 xenus 下载https://www.sonatype.com/download‐oss‐sonatype
    配置仓库两个选项
    1、项目下的pom.xml配置、只生效当前的项目
    2、在maven配置全局所有项目生效
    上传JDK和nexus安装包
    #nexus服务器
    [root@nexus ~]# ll
    -rw-r--r--  1 root root 170023183 Aug 14  2018 jdk-8u181-linux-x64.rpm
    -rw-r--r--  1 root root 122904706 Aug 22  2018 nexus-3.13.0-01-unix.tar.gz
    [root@nexus ~]# rpm -ivh jdk-8u181-linux-x64.rpm 
    [root@nexus ~]# tar xf nexus-3.13.0-01-unix.tar.gz 
    [root@nexus ~]# mv nexus-3.13.0-01 /usr/local/
    [root@nexus ~]# cd /usr/local/
    [root@nexus local]# ln -s nexus-3.13.0-01/ nexus
    [root@nexus local]# cd nexus/bin/
    [root@nexus bin]# ./nexus start
    WARNING: ************************************************************
    WARNING: Detected execution as "root" user.  This is NOT recommended!
    WARNING: ************************************************************
    Starting nexus
    [root@nexus bin]# 
    [root@nexus bin]# ./nexus status
    WARNING: ************************************************************
    WARNING: Detected execution as "root" user.  This is NOT recommended!
    WARNING: ************************************************************
    nexus is running.
    [root@nexus bin]# 
    
    
    

    浏览器访问:http://10.0.1.92:8081/

    用户:admin 密码:admin123

    #jenkins服务器
    [root@jenkins ~]# cd /usr/local/maven/conf/
    [root@jenkins conf]# vim settings.xml
    133     <server>
    134       <id>my-nexus-releases</id>
    135       <username>admin</username>
    136       <password>admin123</password>
    137     </server>
    138     <server>
    139       <id>my-nexus-snapshot</id>
    140       <username>admin</username>
    141       <password>admin123</password>
    142     </server>
    
    169     <mirror>
    170       <!--This sends everything else to /public -->
    171       <id>nexus</id>
    172       <mirrorOf>*</mirrorOf>
    173       <url>http://10.0.1.92:8081/repository/maven-public/</url>
    174     </mirror>
    175  </mirrors>
    
    263 <profile>
    264   <id>nexus</id>
    265   <!--Enable snapshots for the built in central repo to direct -->
    266   <!--all requests to nexus via the mirror -->
    267   <repositories>
    268     <repository>
    269       <id>central</id>
    270       <url>http://10.0.1.92:8081/repository/maven-public/</url>
    271       <releases><enabled>true</enabled></releases>
    272       <snapshots><enabled>true</enabled></snapshots>
    273     </repository>
    274   </repositories>
    275  <pluginRepositories>
    276     <pluginRepository>
    277       <id>central</id>
    278       <url>http://10.0.1.92:8081/repository/maven-public/</url>
    279       <releases><enabled>true</enabled></releases>
    280       <snapshots><enabled>true</enabled></snapshots>
    281     </pluginRepository>
    282   </pluginRepositories>
    283 </profile>
    
    294 <activeProfiles>
    295   <!--make the profile active all the time -->
    296   <activeProfile>nexus</activeProfile>
    297 </activeProfiles>
    
    
    

    java代码上线

    将压缩包解压

    [root@git ~]# tar xf jeesns.tar.gz
    [root@git ~]# 
    
    
    

    gitlab新建项目

    [root@git jeesns]# git init
    Reinitialized existing Git repository in /root/jeesns/.git/
    [root@git jeesns]# git remote add origin git@10.0.1.90:test/maven.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.22 MiB/s, done.
    Total 1946 (delta 285), reused 0 (delta 0)
    remote: Resolving deltas: 100% (285/285), done.
    To git@10.0.1.90:test/maven.git
     * [new branch]      master -> master
    Branch master set up to track remote branch master from origin.
    [root@git jeesns]# 
    
    
    

    jenkins拉取maven代码

    部署tomcat服务器和数据库

    [root@web01 ~]# rpm -ivh jdk-8u181-linux-x64.rpm 
    [root@web01 ~]# tar xf apache-tomcat-8.0.27.tar.gz 
    [root@web01 ~]# mkdir /application
    [root@web01 ~]# mv apache-tomcat-8.0.27 /application/
    [root@web01 ~]# ln -s /application/apache-tomcat-8.0.27/ /application/tomcat
    #配置tomcat启动加速
    [root@web01 ~]# vim /usr/java/jdk1.8.0_181-amd64/jre/lib/security/java.security
     117 securerandom.source=file:/dev/urandom
    #启动tomcat
    [root@web01 ~]# /application/tomcat/bin/startup.sh
    #安装数据库
    [root@web01 ~]# yum -y install mariadb-server
    [root@web01 ~]# systemctl start mariadb
    [root@web01 ~]# mysqladmin -uroot password 'root'
    [root@web01 ~]# 
    [root@web01 ~]# mysql -uroot -proot -e "create database jeesns;"
    
    

    jenkins服务器配置

    [root@jenkins ~]# cd /var/lib/jenkins/workspace/maven-job/jeesns-web/database/
    [root@jenkins database]# scp jeesns.sql 10.0.1.7
    [root@jenkins database]# scp jeesns.sql 10.0.1.7:/root
    
    

    tomcat服务器

    [root@web01 ~]# mysql -uroot -proot jeesns < jeesns.sql
    
    

    远程推送

    ssh root@10.0.1.7 "mv /application/tomcat/webapps/* /mnt/"
    scp -rp /var/lib/jenkins/workspace/maven-job/jeesns-web/target/jeesns-web.war root@10.0.1.7:/application/tomcat/webapps/
    
    

    pipeline

    什么是pipeline

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

    Pipeline 概念

    ​ Pipeline 是一个用户定义的 CD 流水线模式。Pipeline 代码定义了通常包含构建、测试和发布步骤的完整的构
    建过程。
    Node
    ​ node 是一个机器,它是 Jenkins 环境的一部分,并且能够执行 Pipeline。同时,node 代码块也是脚本式
    Pipeline 语法的关键特性。
    Stage
    ​ Stage 块定义了在整个 Pipeline 中执行的概念上不同的任务子集(例如“构建”,“测试”和“部署”阶段),
    许多插件使用它来可视化或呈现 Jenkins 管道状态/进度。
    Step
    ​ 一项任务。从根本上讲,一个步骤告诉 Jenkins 在特定时间点(或过程中的“步骤”)要做什么。例如,使用sh step:sh 'make' 可以执行 make 这个 shell 命令。

    pipeline配置

    #pipeline语法
    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.1.7 "cd /usr/share/nginx && mkdir web-${BUILD_ID}"'
    sh 'scp /opt/web-${BUILD_ID}.tar.gz 10.0.1.7:/usr/share/nginx/web-${BUILD_ID}'
    sh 'ssh 10.0.1.7 "cd /usr/share/nginx/web-${BUILD_ID} && tar xf web-${BUILD_ID}.tar.gz && rm -rf web-${BUILD_ID}.tar.gz"'
    sh 'ssh 10.0.1.7 "cd /usr/share/nginx && rm -rf html && ln -s web-${BUILD_ID}/usr/share/nginx/html"'
    }
    }
    }
    }
    
    
  • 相关阅读:
    KMP算法
    数据库建立索引为什么会加快查询速度
    腾讯2014实习生4月20日笔试题(分析与解答)
    智能指针auto_ptr & shared_ptr
    用C++实现一个不能被继承的类
    2014金山笔试_编写一个数组类 MyVector
    TCP分组交换详解
    子网掩码的计算
    服务器端 安装svn
    yii2之ActiveForm表单使用
  • 原文地址:https://www.cnblogs.com/opesn/p/11794465.html
Copyright © 2020-2023  润新知