标签搜索

jenkins2.x实践指南笔记

anker
2021-06-27 / 0 评论 / 29 阅读 / 正在检测是否收录...

devops著名工具Jenkins笔记。本文包含简易安装内容。

1.劳动者不等于劳动力。人不等于能力。
2.关于生产成本:
从生产工具要素考虑提高软件工程生产力。这似乎不需要多谈。大家都知道挖土机比铁铲更具有生产力。然而,很多管理者还给程序员使用低配置的电脑。低配置的电脑会导致程序员无用的等待,比如打开IntelliJ IDEA需要等2分钟、多打开两个窗口就卡顿等。

我们算算账。假如一个20 000元/月工资的程序员,工作22天,每天8小时,那么每小时就是113.6元。假如程序员每天因为打开程序慢、网络慢、编译慢等而等待的时间总和为0.5小时,那么这0.5小时就属于浪费的,总共约57元。这意味着一个月会浪费1254元。

这只是一个程序员一个月的浪费,还没有算其他人的。虽然计算有些粗糙,但是能反映问题。相对程序员的工资成本,电脑的成本真的不算什么。

3.注重培养员工的公司,不仅可以提升员工生产力,还可以提升公司的整体生产力。如果更深入地思考,你会发现,对于工厂里的生产流水线,如果工人辞职了并不会带走什么。而知识存在于人的大脑里,人辞职了,就意味着把公司的劳动对象带走了。团队、公司是一大损失。想想公司通过发放工资生产出来的劳动成果,就这样被轻而易举地带走了。
那怎么解决这个问题呢?根据劳动力要素,应该尽可能留住这些带有“关键”知识的人;根据劳动对象要素,应该尽可能提高同一知识在团队中的携带人数。
那怎么做呢?敏捷实践中的站会、结对编程以及看板的应用,都是增加知识流通效率的手段,从劳动对象要素考虑提高软件工程生产力。

4.Jenkinsfile是使用Groovy语法(接近且兼容Java语言)编写。

5.docker部署Jenkins2.x

docker pull jenkins/jenkins
docker run --rm -d -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts
#默认jenkins_home对应真实路径在/var/lib/docker/volumes/jenkins_home
#初始管理员密码:/var/lib/docker/volumes/jenkins-data/_data/secrets/initialAdminPassword

以下是部署blueOcean版本

docker run  \
-u root   \
--rm   -d  \
-p 8080:8080   \
-p 50000:50000   \
-v jenkins-data:/var/jenkins_home   \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean

6.Pipeline插件测试,新手流水线项目,使用以下脚本:

pipeline {
    agent any
    
    stages {
        stage('Build'){
            steps {
                echo 'Hello world'
            }
        }
    }
}

7.docker之间互相调用。项目工程的编译常常需要不同的环境,比如项目工程需要Centos7才能运行。但是Jenkins镜像使用的Alpine系统并不是Centos。于是就有了需要让Jenkins容器支持访问其他容器的能力。一般办法是通过网络后执行工作。Jenkeins/BlueOceam镜像通过共享主机/var/run/docker.sock文件达到可以操作宿主docker。即容器内部支持docker命令,并且可以切入宿主机器的容器。下面代码片段演示了这种用法。

   pipeline {
       agent any
       stages {
           stage('start') {
               steps {
                   script{
                       def workspace = pwd()
                       def cmds = readFile "${workspace}/run.sh"
                       def cmd = cmds.bytes.encodeBase64().toString()
                       sh "docker run --rm -i my-project-img  sh -c 'export LANG=en_US.UTF-8;echo \"${cmd}\"|base64 -d>txt;sh txt'"
                   }
               }
           }
       }
   }

可以留意到两个小细节

  1. 子docker中执行命令时设置了UTF8编码,这需要运行的命令具体情况而定。如果不设定可能用的是ACSII编码*
  2. 其中使用base64把要执行的脚本编码,然后在另外一个镜像的容器中运行。使用base64编码避免了复杂命令中的符号转义问题。脚本base64需要在Jenkins权限管理中开启groovy脚本使用base64权限,如果不开启,在失败后也会提示开启。

8.交互模式。在制作自助功能时,可能需要用户进行输入也可能需要让用户做选择题。下面演示使用input接口,从UI上得到用户输入和选择输入。

   pipeline {
     agent any
     stages {
       stage('input') {
           steps {
               script {
                   def userInput = input(
                           id: 'userInput', message: '输入信息',
                           parameters: [
                           [$class: 'TextParameterDefinition', defaultValue: '', description: '测试输入1', name: 'input1'],
                           [$class: 'TextParameterDefinition', defaultValue: '', description: '测试输入2', name: 'input2'],
                           [$class: 'TextParameterDefinition', defaultValue: '', description: '测试输入3', name: 'input3']
                           ])
                   input1 = userInput.input1?:''
                   input2 = userInput.input2?:''
                   input3 = userInput.input3?:''
                   sh "./client.sh ${input1} ${input2} ${input3}"
                   // 下面演示了选择输入
                   svn_branch = input message: '你要从哪里来,要到哪去?', ok: 'Release!', parameters: [
                                       choice(
                                               name: '请选择一个来源SVN分支',
                                               choices: lists,
                                               //description: 'What is the release scope?'
                                        ),
                                        choice(
                                                name: '分布到哪个后台',
                                                choices:backends,
                                        ),
                    ];
                    echo svn_branch["请选择一个来源SVN分支"];
                    echo svn_branch["分布到哪个后台"];
               }
           }
       }
     }
   }

9.脚本中导入Java包:

  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  pipeline{
      agent any
      stages {
          stage('input') {
              steps {
                  script{
                      def str = "web addrs https://baidu.com";
                      Pattern p = Pattern.compile("http.*");
                      Matcher m = p.matcher(str);
                      if (m.find())
                          println(m.group(0));
                      else
                          println("Did not find a match");
                      // 上面代码可能会出现报错,无法序列化matcher对象。
                      //下面是另外一种Groovy写法,不需要Jenkins序列化matcher对象
                      // 参考https://www.baeldung.com/groovy-pattern-matching
                      //https://stackoverflow.com/questions/40454558/jenkins-pipeline-java-io-notserializableexception-java-util-regex-matcher-error
                      def match_str = (str  =~ /(http.*)/)[0][0];
                      println(match_str);
                  }
              }
          }
      }
  }
0

评论 (0)

取消