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'"
}
}
}
}
}
可以留意到两个小细节
- 子docker中执行命令时设置了
UTF8
编码,这需要运行的命令具体情况而定。如果不设定可能用的是ACSII
编码*- 其中使用
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)