• Jenkins持续集成与部署


    1.1 开发写代码的演变

    好景不长,开发越来越多,代码文件越来越多,每天下班前合并代码时,发现很多合并失败的文件。最后每天加班3小时人工合并代码。

    解决方法:将合并代码的周期缩短,以前一天,现在一小时,半小时。。。

    随时随地地将代码合并,这种方法叫做持续集成。

    1.2 持续集成(简称CI

    说明:持续集成说的是频繁地(一天多次)将代码集成到主干。

    它的好处主要有两个:

    1、快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。

    2、放置分支大幅偏离主干。如果不是经常集成,主干又在不断更新。会导致以后集成的难度变大,甚至难以集成

    1.3 JENKINS的作用

    说明:借助一个自动化的部署工具,叫做JENKINS,开发上传自己的代码到GITLAB(私有仓库),GITLAB(私有仓库)发信息通知JENKINS,随后JENKINS从仓库拉取代码,最后全自动部署到测试服务器进行相关测试,并将测试结果通知运维和开发,更懒得方法可把这个工具可给开发使用,这样以后就事情少了很多,这种自动测试的方法叫做持续交付。

    1.3.1 JENKINGS作用个人简单小总结

    说明:相当于开发将代码上传到GITLAB私有仓库,仓库就会自动通知JENKINS自动从仓库里拉取代码,最后部署到测试服务器里测试,测试的好坏结果通知发给运维和开发

    1.4 持续交付

    持续交付指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段

    持续交付可以看作持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的

    1.5  持续部署

    持续部署是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。将代码部署到服务器,就叫持续部署,可使用ansible或JENKINS,但是公司不是很相信工具,所以绝大部分都相信人工上线部署。

    行话

    CI/CD 持续集成/持续交付/持续部署。

    1.6 JENKINS介绍

    JENKINS用JAVA编写的开源的持续集成工具,相当于写好任意的shell脚本和windows批处理命令可放到JENKINS自动运行,自动部署。

    1.7 安装JENKINS的环境准备

    1、准备2台安装好Centos7.2系统的虚拟机,内存1G+

    2、所有虚拟机的防火墙和Selinux关闭

    3、主机名及IP地址关系如下:

    Jenkins 10.0.0.202  #不需要安装软件

    Gitlab  10.0.0.201  #安装好gitlab

    4、Linux中能发邮件的账号

    1.8 安装JENKINS的方法

    1.8.1 使用RPM包安装

    RPM包下载地址:

    http://pkg.jenkins.io/redhat-stable/

    清华园地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/

    1.8.2 yum安装jdk

    yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel    #只有安装了jdk软件才能使用jenkins的软件。

    1.8.3 安装rpm

    rpm -ivh jenkins-2.73.1-1.1.noarch.rpm     #这里可以去官网下载,然后安装这个rpm包,因为没有任何依赖。

    1.8.4 启动

    /etc/init.d/jenkins start

    1.8.5 打开网页安装Jenkins

    http://10.0.0.202:8080     #切记是8080端口。

    这里需要解锁Jenkins,需要按照他给的路径,进行复制密码填入框里。

    cat /var/lib/jenkins/secrets/initialAdminPassword     #打开这个文件,并且复制密码到网页里点击Continue下一步,里面的密码是每次随机的,不是固定的,当要再次输入密码时再打开文件复制密码。

    提示安装插件,默认安装与自定义安装都是找官网下来,过程比较慢,这里什么都不选,点击右上角的X取消。

    跳过安装插件的界面。

    这就是jenkins的欢迎使用界面了。

    1.9 解压插件放置Jenkins插件目录

    cp plugins.tar.gz /var/lib/jenkins/        #我的插件压缩包是针对plugins这个目录的,所以需要放到这个目录进行解压

    tar -xf plugins.tar.gz                 #进行解压这个文件,将插件文件放到文件夹里面。

    /etc/init.d/jenkins restart             #解压完后,要重启jenkins才能生效,常用插件就已经补全了,所有默认的插件都在里面了。

    1.10 重启jenkins后需重新登陆

    10.0.0.8:8080    #打开网页

    cat /var/lib/jenkins/secrets/initialAdminPassword

    admin       #默认账号

    f72d71394e594007918aff6509a1ba73               #索取文件密码

    1.11 查看是否安装好插件

    这里确认,已经安装好了。

    1.12 Jenkins配置文件说明

    [root@oldboyedu-47 plugins]# rpm -ql jenkins       #查看Jenkins的配置文件路径

    /etc/init.d/jenkins            #启动文件

    /etc/logrotate.d/jenkins       #日志分隔配置文件

    /etc/sysconfig/jenkins         #Jenkins主配置文件

    /usr/lib/jenkins              

    /usr/lib/jenkins/jenkins.war   #war包存放目录

    /usr/sbin/rcjenkins            #命令

    /var/cache/jenkins             #var包解压目录,jenkins网页代码目录

    /var/lib/jenkins               #Jenkins工作目录 ***

    /var/log/jenkins

    1.13 配置并发执行任务数量

    系统管理-系统设置

    根据电脑配置来填写,这个数量是要起进程数的,改成5。

    1.14 邮件配置

    系统管理》系统设置

    让Jenkins用邮件的方式通知我,这里填写要发送邮件的邮箱

    像全网备份一样,填写使用什么服务器发送邮件,填写smtp.163.com,还有用户邮箱后缀以什么为结尾,还有smtp的用户名和密码,最下面还有一个发送邮件测试,前提是前面的配置都配置好了后才可以,最后点击保存,

    重要提示:可能163邮箱有点问题,可能往后需要用到126的邮箱地址来做测试

    1.15 新建一个任务

    填写一个项目名字,点击第一个“构建一个自由风格的软件项目”,最后点击OK。

    将GitLab的项目源地址复制

    在Jenkins页面下面找源码管理-选择Git-将GitLab的项目地址写入框框里,记得将地址改成IP地址,因为没有解析,填入进去之后会有红色提示,提示需要密钥。

    这里有一个原理图

    在Jenkins服务器操作:

    [root@oldboyedu-47 plugins]# ssh-keygen            #生成密钥

    [root@oldboyedu-47 plugins]# cat /root/.ssh/id_rsa.pub    #打开密钥将密钥复制粘贴到Git密钥管理那,添加一个公钥,

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTK9DGLclX4wK7GbnRZvlIKEOUuHtHg7OyBM9UEkali45utx2M4S78gu7hDTsDCZu5wNzyCywkkEOubaB0HmB5PWOeDaXftozWity4C857Yqu2ESaJ2fdnTq1CX4GI+89xE4RyuhE6nTol75eXrb7aUfq0r+yioTAM5ADV/b+y7hxdLOVNtED1TnPQP61mpC7UH87Oc/UgCzVH50wJ5XgdLyrN1QAiVhArqnJN3/KrKf5OEdo8SLfDqCLVXJc28Hg2c6ObnljRdM8ZhGHwBPQRLifMFWj2K7G1JauRqs/m+fZRC0Ybf+p2NNYJ+E4RYe5j8RedHDdq4/A7OVvCL16z root@oldboyedu-47

    GitLab网页上操作:

    因为GitLab改版了,功能很多出现在别的地方,所以要搜索这个Profile Settings,在点击SSH Keys

    将刚才Jenkins服务器的SSH公钥对放在里面,点击ADD添加。

    Jenkins网页上操作:

    在GitLab上添加了Jenkins的公钥,这时候想在Jenkins上访问GitLab就需要做这步,点击Add,点击Jenkins,把私钥放在我的Jenkins里。

    选择SSH那一栏

    填写git,因为git运行用户是git

    这时候这个私钥可以选择在自己的家目录去读取等等其他方式,这里我选择了直接输入密钥的信息

    Jenkins服务器上操作:

    [root@oldboyedu-47 plugins]# cat /root/.ssh/id_rsa        #打开私钥的信息,把里面所有打印出来的信息全都要复制。

    -----BEGIN RSA PRIVATE KEY-----

    MIIEpQIBAAKCAQEA0yvQxi3JV+MCuxm50Wb5SChDlLh7R4OzsgTPVBJGpYuObrcd

    jOEu/ILu4Q07AwmbucDc8gssJJBDrm2gdB5geT1jng2l37aM1orcuAvOe2KrthEm

    idn3Z06tQl+BiPvPcROEcroROp06Je+Xl62+2lH6tK/soqEwDOQA1f2/su4cXSzl

    TbRA9U5z0D+tZqQu1B/OznP1IAs1R+dMCeV4HS8qzdUAIlYQK6pyTd/yqyn+ThHa

    PEi3w6gi1VyXNvB4NnOjm55Y0XTPGYRh8AT0ES4nzBVo9iuxtSWrkarP5vn2UQtG

    G3/qdjTWCfhOEWHuY/EXnRw3auPwOzlbwi9eswIDAQABAoIBAENoYSRhyTu8w0pm

    U+J8NGbMM4ZtvSx+5gWVc3kqvFJr0fOVkGFAIHeKdCZyyruVfZg18FFzL4wcYP51

    EBsA91q8NehmAuT+qMZzXTGC006fmKBtqRen9EmN29CsG/VWLEm0KTtWGdnUBpPF

    f2Zzl9CpCpZS8f6X5Xa38Wxdq6u5sekE4qeYuttYIFyzwgBWyzMezqKpz1Cgjsyj

    nJjg2G8f0YRBoY+3f+fqDSgf1nTdZkKOzTysoPhh2Y1TrpgbaVldkElMe7FCpmaC

    ddOR4wPnfH3bhU3ECsdgtHc9RjBmsaHG7LXoedjTqPuYvbBoGBb7HrF5vLvn42k7

    woeVY8ECgYEA7hYaDO7KKDs81zgfD+wqVA5p7V+V2nzpgXQzltnPR55F0cos61YB

    zJjVMFF0qnc8SXgNMo0bdxqs1YMdToR4Q68gYxuFBo42XpO1Xu4Hwz63cICrLu1G

    W8H99JCLdPwt4AoPWdBl5otn1GNzKdPsLSRlJLS6LiwLy/HgOdOGyH0CgYEA4w9J

    hkdHp+ZhKAm8MF8OH/Y+IaKmR1iiP3ZHaziJfulSeyFg79/lQPABvR0OMxj1shht

    mlPqBr3lpKe+spM3SCW8RmNbVy9kIkn7so+NHcJgyENjI7LUAFihpa1mQ4xdcFYm

    uO+zUxmHLxVqf3c/BkbZgvSdYiohq6n7f0jrmu8CgYEAqijDr5COjRhhUFQ85w1b

    5z1x+YQCPuhdnvbk1CCRY1c8AUckuYF7wbVNUL42yopzXPLfQ8zT31kCQ4r0zCQj

    LASi+hI2DcxgEVIyI0mt5J4TTuW28tAEJBpOnZcdBJwjUWb/N6qY2Z+ysnntWeyr

    dEv5ubUtB0jVmYoiPlHul6UCgYEAl+UoKH4Sv41svV4V2L4eMt+GHPY0ClKO56l2

    iZHe2Vm45cokkRPUx6ZHY33GfARciPGykKVGT5BFyeq1tbyqJMepteTNu/tmH1Ii

    4QcLPjdEi3QZJE6DaF/ic3UWjmWeNIJNkTY5XoQbXTIUdoUNUmOfKu39QygwMiia

    qEHd610CgYEAgHDY5kEuTHkcG6k+tB4I60ty1bvbyskf7cVk/FUVMl4oKrpBCbN3

    YXY3UtKYwbn4a9/TGBSbNvAg0MgGCdlM9Bf4+cWZFJMRW/GgldtRYoTorFlwjE1I

    yeqwxjFcSoMDBGrKqSoJjP6AxSRCF4iJ3azHydTWv+U1HgVNWOn1VZc=

    -----END RSA PRIVATE KEY-----

    Jenkins网页上操作:

    将Jenkins机器的密钥放在里面就好了。

    最后点击ADD

    这时候会出现一个新的选项叫做,git,选择他,这就是Git的关联方法了。

    找到下方的构建,然后选择第二个Execute shell(执行命令)

    填写复制所有东西到/data/www目录的命令,然后保存,这时候就完成了一个项目了。(这里相当于Jenkins复制GitLab仓库的文件到Jenkins工作目录后要执行的权限

    Jenkins服务器上操作:

    [root@oldboyedu-47 ~]# mkdir /data/www –p     #创建目录,要让GitLab所有的东西都复制到Jenkins服务器上的/data/www目录下

    [root@oldboyedu-47 ~]# chown -R jenkins.jenkins /data/www     #jenkins的进程是jenkins用户控制的,所以这里也要改成jenkins

    jenkins会从gitLab里拉文件到jenkins服务器上的/var/lib/jenkins/workspace目录下以项目名称同名的“php-deploy”


    Jenkins网页上操作:

    点击Jenkins大图标,回到主页,会看到一个项目,这时候准备从GitLab里啦代码下来,在执行那个cp那个命令

    GitLab网页上操作:

    因为要测试自动化同步,所以在GitLab这个仓库里创建一些新文件来测试,也可以在GitLab这个服务器工作目录当中去创建文件,这里为了快速,所以这里在Git网页里按加号+来选择New file添加新的文件作为测试。

    随便写一个文件名称和内容

    然后最后在下面点击保存。

    这里是成功新建文件的结果,如果不创建的文件的话,是无法啦文件的,在生产环境当中开发不是这样去编辑文件的的,都是在工作目录环境当中去写文件的,这边为乐儿快速测试,所以这样去做。

    Jenkins网页上操作:

    在Jenkins网页中点击刚才创建的项目,有个小闹钟类似于播放器一样,点击一下,会自动把我们的东西啦到Jenkins里部署复制(因为我们只写了cp,要想装环境等得收集安装环境的命令,类似于写脚本。),也可以点击允许自动刷新,在“构建执行状态”会有一个过程,可以仔细看,完成后显示空闲。

    这是正在部署的状态。

    Jenkins服务器上操作:

    [root@oldboyedu-47 php-deploy]# ls /var/lib/jenkins/workspace/php-deploy  #此时在GitLab新建的文件就会先拉到到这个Jenkins目录下的项目目录

    123test  asdasdastest      #这是刚才新创建的文件

    [root@oldboyedu-47 php-deploy]# ls /data/www     #先将GitLab仓库的文件拉到Jenkins的默认目录,在执行部署的cp命令,将他拉到指定的目录/data/www

    123test  asdasdastest          #此时已经将默认目录的东西拉到指定目录了。

    Jenkins的工作目录: /var/lib/jenkins/workspace/php-deploy    #php-deploy是jenkins里创建的项目名称

    部署指定的目录: /data/www

    功能小总结:

    不管可以执行cp,ssh,或者export安装环境变量等命令都可以执行,可以帮你一键搭建部署,只要有代码,剩下就是拉到指定仓库做指定的事情,像写脚本一样,指定路径,执行环境初始化,在启动服务等。

    1.16 Jenkins平台上查看GitLab导入数据到Jenkins工作目录的(失败或成功)的操作记录

    点击成功的#号,或者失败的#号

    点击Console output

    原理就是在jenkins新建一个脚本,然后把命令在里面操作,这个脚本在/tmp目录下,执行完就自己删除自己这个脚本。

    失败的也是同样操作看法。

    1.17 Jenkins自动部署命令说明

    只要在jenkins工作平台上的一个项目里,在他的构建选项里填入命令就好了,当然第一步有复制cp 文件到某个目录,然后怎么执行什么环境变量,启动服务等命令都可以,总结一点就是要准备好配置文件,再准备好启动服务的命令。

    1.18 配置Gitlab Push自动触发jenkins构建(开发新建代码,jenkins自动更新并且触发部署命令)

    步骤一、下载gitlab plugin

    Jenkins>插件管理

    下载并安装gitlabplugin

    步骤二、配置gitlab认证

    路径

    Jenkins网页上操作:

    点击Credentials-System-Global creadentials的按钮

    点击Add多创建一个Git

    选择GitLab API token那个选项

    GitLab网页上操作:

    搜索框里搜索Profile settings后,在点击Account

    这有一个token,复制一下,粘贴到Jenkins的界面

    Jenkins网页上操作:

    将刚才的token粘贴到API tokne框框里,然后填写一个描述为GITLAB,不用管,就这样填写,填写完后,再点击OK

     在到Jenkins里的主页里点击系统管理,

    点击系统管理-系统设置

    找到Gitlab区块的地方,然后第一个随便取一个连接的名字,第二个URL填写GitLab的IP地址,第三个直接点击下拉框可以看到我们刚才配置好的GitLab API tonke的选项。

    故障:test connection测试时出现error错误。

    /etc/gitlab     #GitLab服务器上打开这个网页编辑

    external_url 'http://10.0.0.7'     #修改oldboyedu为GitLab仓库的IP地址,否则不能解析

    gitlab-ctl restart         #执行这个命令,重启Git所有组件

    gitlab-ctl reconfigure     #执行这个命令,对GitLab进行重配置并且重新启动,主要是让刚才那个配置文件修改后生效。

    最后刷新一下也

    最后是使用ssh密钥对的方式连接成功并且同步的,没有用token的方式。

    说明:简单来讲是在jenkins中对gitlab的仓库设置一个token和仓库地址,后向gitlab的仓库设置了刚jenkins生成的token值,让其仓库和jenkins对接起来,原理是当用户触发push操作,就会自动合并到master分支上。

    1.19 关于Jenkins部署代码权限三种方案

    1.19.1 方法一:修改jenkins进程用户为root

    vim /etc/sysconfig/jenkins         #修改Jenkins的主配置文件

    JENKINS_USER=”jenkins”           #在这里可以修改。

    1.19.2 方法二:将代码目录用户改为jenkins

    mkdir /data/www –p

    chown –r jenkins.jenkins /data/www

    1.19.3 方法三:使用sudo授权

    visudo

    1.20 自动化构建脚本

    #!/bin/sh

    DATE=$(date +%Y-%m-%d-%H-%M-%S)

    HOST="10.0.0.7"

    CODE_DIR="/var/lib/jenkins/workspace/my-freestyle-job"

    WEB_DIR="/var/www/"

    GET_CODE(){

        echo git_get

    }

    TAR_CODE(){

        cd $CODE_DIR

        tar zcf /opt/web-${DATE}.tar.gz ./*

    }

    SCP_CODE_WEB(){

        scp /opt/web-${DATE}.tar.gz $HOST:${WEB_DIR}

    }

    TAR_XF(){

        ssh $HOST "cd $WEB_DIR && mkdir web-$DATE && rm -rf html && tar xf web-${DATE}.tar.gz -C web-$DATE"

    }

    DEPLOY(){

        ssh $HOST "cd $WEB_DIR && ln -s web-$DATE html"

    }

    main(){

        GET_CODE

        TAR_CODE

        SCP_CODE_WEB

        TAR_XF

        DEPLOY

    }

    main

  • 相关阅读:
    用户界面线程(含有消息泵的线程)主线程与用户界面线程的通信
    poj 2151 Check the difficulty of problems 概率dp
    Codeforces 148D Bag of mice 概率dp
    [置顶] UVa在线比赛单题汇总DP专题
    UVa 10405 Longest Common Subsequence 最长公共子序列模板
    UVa 12018 Juice Extractor 切水果dp暂时存疑
    UVa 674 Coin Change 背包dp
    hdu 3853 LOOPS 圆环之理 概率dp
    UVa 111 History Grading 最长递增子序列 LIS
    UVa在线比赛单题汇总DP专题
  • 原文地址:https://www.cnblogs.com/shell520/p/9757918.html
Copyright © 2020-2023  润新知