Jenkins使用简易教程

作者: 程序员在深圳 | 来源:发表于2017-04-14 18:58 被阅读72392次
    题图

    Jenkins是一款能提高效率的软件,它能帮你把软件开发过程形成工作流,典型的工作流包括以下几个步骤

    1. 开发
    2. 提交
    3. 编译
    4. 测试
    5. 发布

    有了Jenkins的帮助,在这5步中,除了第1步,后续的4步都是自动化完成的,具体的,当你完成了提交,Jenkins会自动运行你的编译脚本,编译成功后,再运行你的测试脚本,这一步成功后,接着它会帮你把新程序发布出去,特别的,在最后一步,你可以选择手动发布,或自动发布,毕竟发布这件事情,还是需要人为的确认一下比较好。简而言之

    Jenkins可以帮你在写完代码后,一键完成开发过程中的一系列工作

    使用Jenkins的好处显而易见,它减少了你的重复劳动。更重要的是,一个团队的开发流程一开始是不一致的,不一致往往会带来各种各样的问题,最终体现在软件的质量或开发效率不够高,而Jenkins会帮你规范大家的行为,从而避免一系列的问题。

    安装

    Jenkins安装非常简单,以CentOS为例,执行以下命令即可

    sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
    sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
    sudo yum -y install jenkins
    

    值得注意的是,如果你的操作系统是CentOS,且运行的是GCJ版本的java,则需要做一下更新

    $ java -version
    java version "1.5.0"
    gij (GNU libgcj) version 4.4.6 20110731 (Red Hat 4.4.6-3)
    $ sudo yum remove java
    $ sudo yum install -y java-1.7.0-openjdk
    $ java -version
    java version "1.7.0_79"
    OpenJDK Runtime Environment (rhel-2.5.5.1.el6_6-x86_64 u79-b14)
    OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)
    

    如果你的Jenkins使用git作为数据传输的管道,那么的所有Jenkins节点都要安装git

    $ sudo yum install -y git
    

    设置git账户

    $ git config --global user.name "yourname"
    $ git config --global user.email "yourmail"
    

    配置

    安装成功后,配置文件在/etc/sysconfig/jenkins下,默认端口为8080,你需要设置一下防火墙,让该端口可以被外部访问到

    设置允许开机启动

    $ sudo chkconfig jenkins on
    

    确保系统中有一个jenkins账户,如果没有则需要创建,理论上安装了Jenkins后,会自动创建该用户。

    然后创建ssh密钥,密钥被用来在多个节点中进行免密访问,同时帮助打通git数据通道。在这之前要确认jenkins用户的home目录是否有效(在下面的例子中home/var/bin/jenkins),并切换到jenkins用户下

    $ grep jenkins /etc/passwd
    jenkins:x:496:496:Jenkins Continuous Integration Server:/var/lib/jenkins:/bin/bash
    $ su jenkins
    $ cd ~
    $ pwd
    /var/lib/jenkins
    

    创建非对称密钥,执行ssh-keygen命令,并一路回车

    $ ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/fengyajie/.ssh/id_rsa): Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/fengyajie/.ssh/id_rsa.
    Your public key has been saved in /home/fengyajie/.ssh/id_rsa.pub.
    The key fingerprint is:
    The key's randomart image is:
    +--[ RSA 2048]----+
    |        ....   +=|
    |        ... .....|
    |         . ...o +|
    |          E. . *.|
    |        S  .= +  |
    |         . o + . |
    |          . o o  |
    |             o o |
    |              o  |
    +-----------------+
    $ ls ~/.ssh/
    id_rsa  id_rsa.pub  known_hosts
    

    Jenkins是一个Master-Slave的架构,它可以把任务发布到不同的节点上执行,典型的应用场景是你有2个运行环境,一个是测试环境,一个是生产环境,你可以指定工作流中,哪些任务在测试环境中执行,哪些任务在生产环境中执行。当然,如果你没有这样的需求,也可以不配置Slave,这篇文章讨论的是有Slave的情况。

    如果你需要配置Slave,在Slave节点上创建一个jenkins用户,并建立Master和Slave的授信关系(你需要将下面的host替换为具体的服务器IP,注意一定要保证Master和Slave之间是内网通信的,否则公网环境延迟较大,经常会出现Slave掉线情况)

    ssh jenkins@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
    

    同时,为了让jenkins可以执行更高权限的命令,所有节点都需要把jenkins用户设置为sudo用户。当然,我这是为了偷懒,更好的办法是设置一个专门的用户组,让这个组有一定的权限,然后把jenkins加入到这个用户组。

    $ sudo grep jenkins /etc/sudoers
    jenkins          ALL=(ALL)   NOPASSWD: ALL
    

    以上为全部终端的配置,剩下操作基本都在Jenkins提供的web页面上完成

    设置Slave

    打开Jenkins页面http://hostname:8080,进入管理页面,点击New Node

    配置Node,Labels是环境设置,例如开发环境,测试环境,编译环境等,后续可以根据Lables值,指定具体的任务在某个环境中执行

    设置Master到Node间的授信方式

    成功后,可以在控制台看到新增的Node

    创建Pipeline

    基本环境搭建好后,我们来配置一个工作流亲自感受一下

    工作流在Jenkins中被称为pipeline,pipeline的运行行为由用户自己定义,定义的内容存放在一个Jenkinsfile文件中,并将该文件存放在git仓库的根目录,大致的流程如下:

    1. 用户将代码提交到git
    2. Jenkins从git拉取最新代码
    3. 读取根目录下的Jenkinsfile文件,并依次执行文件中定义的任务

    下面是具体的配置步骤

    编写Jenkinsfile

     pipeline {
        agent {
            label 'Production'
        }
        stages {
            stage('Build') {            
                steps {                
                    echo 'Building'            
                }        
            }        
            stage('Test') {            
                steps {                
                    echo 'Testing'            
                }        
            }
            stage('Deploy - Staging') {            
                steps {                
                    sh './deploy staging'                
                    sh './run-smoke-tests'            
                }        
            }        
            stage('Sanity check') {            
                steps {                
                    input "Does the staging environment look ok?"            
                }        
            }        
            stage('Deploy - Production') {            
                steps {                
                    sh './deploy production'            
                }        
            }    
        }
     
        post {        
            always {            
                echo 'One way or another, I have finished'            
                deleteDir() /* clean up our workspace */        
            }        
            success {            
                echo 'I succeeeded!'        
            }        
            unstable {            
                echo 'I am unstable :/'        
            }        
            failure {            
                echo 'I failed :('        
            }        
            changed {            
                echo 'Things were different before...'        
            }    
        }
    }
    

    以上是一个基本的Jenkinsfile模板,其中有以下几个关键概念

    • agent - 指定在哪台机器上执行任务,还记得上面配置Node时候填的Label吗,如果这两个label匹配得上,就在该Node中执行
    • stage - 组成工作流的大的步骤,这些步骤是串行的,例如build,test,deploy等
    • steps - 描述stage中的小步骤,同一个stage中的steps可以并行
    • sh - 执行shell命令
    • input - 需要你手动点击确定,Pipeline才会进入后续环节,常用于部署环节,因为很多时候部署都需要人为的进行一些确认
    • post - 所有pipeline执行完成后,会进入post环节,该环节一般做一些清理工作,同时还可以判断pipeline的执行状态

    了解了这些后,你会发现写一个Jenkinsfile是一件很容易的事情。好了,现在要测试pipeline功能,把上面的代码中的sh换成echo,拷贝到你的Jenkinsfile中,并存放在git仓库的根目录

    创建pipeline

    回到Jenkins web页面,添加pipeline


    如果你想每次git commit时自动执行该pipeline,有两种方法,一种是让Jenkins对git进行轮询,每分钟检查git仓库有没有更新,如下配置

    另一种方式是使用git提供的hook,该方式原理是git一旦提交,便会触发hook中的脚本,让脚本给Jenkins发送执行pipeline的指令,这种方式更优雅,但相应要做的事情更多一点,这里就不演示这种方法了,感兴趣的同学可以自己研究一下。

    最后,我们需要设置git的地址,其中的授信设置,和上面说的Master到Node的授信设置一致


    设置完毕后,一旦你的git仓库收到新的提交,就会触发这个pipeline的运行,以下这张图是上面Jenkinsfile例子的运行状态,可以看到当运行到Sanity check这一步时,需要你手动触发是否执行后面的操作。

    下面我们来总结一下,这篇教程主要讲述了以下几个方面:

    1. Jenkins是什么,及它的应用场景举例
    2. 如何搭建一个Jenkins服务
    3. Jenkins Pileline是什么,我们如何定义一个Pipeline
    4. 如何具体的操作一个Pipeline

    Have fun!

    相关文章

      网友评论

      • Robin90:在配置gitlab地址的时候有个git的报错,希望能帮助解决看下:Failed to connect to repository : Command "git ls-remote -h git@sygit.sayyoo.cn:frontend/pc-refactor.git HEAD" returned status code 128:
        stdout:
        stderr: ssh: connect to host sygit.sayyoo.cn port 22: Connection refused
        fatal: Could not read from remote repository.

        Please make sure you have the correct access rights
        and the repository exists.
      • 刘彦青:Jenkinsfile文件找不到,是需要自己创建么?
      • 0e2682147af8:受教啦,写的很好,赞一个。:smile:
      • 首席科学家:这是我写的关于自动化部署企业jenkins实战集成部署视频教程,可以参考下https://blog.csdn.net/u012201811/article/details/81266370
        烧麦记忆:链接无效
      • 山有木兮木有枝_1c9c:谢谢分享,讲解很详细,新手小白刚工作,这个讲的真的最清楚。谢谢!
      • 0c45406e8da8:文章内容挺不错的。我们侠课岛工作是远程录制课程视频或图文教程,我们会给到课程的需求大纲,每一节课程需要你来详细展开写一些代码举例和讲解清楚,对经验积累和创新能力有一定的要求,有兴趣可以联系我。加我微信:zhimadt
      • LV大树:ios 开发可以用这个流程吗?
        程序员在深圳:@LV大树 可能要专门去搜一下
      • vincent927:希望讲讲如何使用pipeline进行回滚操作以及权限控制:blush:

      本文标题:Jenkins使用简易教程

      本文链接:https://www.haomeiwen.com/subject/yhdmattx.html