week4作业
部署 jenkins master 及多 slave 环境
jenkins分布式master负责管理创建任务,slave节点负责执行具体任务
在slave端创建jenkins目录安装jdk
root@jenkins-slave:~# mkdir -p /var/lib/jenkins root@jenkins-slave:~# apt install openjdk-11-jdk
在jenkins添加节点
添加节点信息,选择只允许运行绑定到这台机器的job
添加jenkins节点访问凭据
保存配置
验证slave节点状态
slave节点执行任务
基于 jenkins 视图对 jenkins job 进行分类
创建列表视图
通过正则表达式过滤关键字
回到主界面,选择视图标签可以过滤出包含关键字的任务
总结 jenkins pipline 基本语法
以pipeline{}作为开头
Stage:阶段 一个pipeline可以分成若干阶段,如代码克隆,编译
Step:步骤 一个stage可以包含多个step,执行相关命令行的操作
agent:any在任何节点,none需要在每个stage指定节点可以指定jenkins工作节点
不指定jenkins节点
pipeline{ agent none stages { stage('代码克隆'){ #指定阶段名 agent any steps{ sh 'echo 代码克隆' #执行shell命令 } } stage('代码部署'){ agent any steps{ sh 'echo 代码部署' } } } }
执行结果如下
基于agent指定jenkins节点
通过label标签指定从节点操作
pipeline{ agent { label 'jenkins-slave1'} stages { stage('代码克隆'){ steps{ sh "cd /var/lib/jenkins/workspace/pipeline-test2 && rm -rf ./*" git branch: 'main', credentialsId: 'dd76a530-0f6c-4eb8-941c-44a953105491', url: 'git@sean.gitlab.com:devops/app1.git' sh "echo 代码克隆完成" } } stage("代码构建"){ steps{ sh "cd /var/lib/jenkins/workspace/pipeline-test2 && tar czvf pycode.tar.gz ./*" } } } }
结果确认
基于input实现交互式操作
input在流水线中实现交互式操作
pipeline{ agent any stages{ stage('交互测试'){ input{ message "是否继续部署?" #界面提示信息 ok "继续部署" #确认按钮信息 submitter "jenkinsroot" #允许提交的用户 } steps{ echo "Hello Jenkins" } } } }
测试结果
post通知
always:无论成功或失败都执行
cleanup:在所有post条件最后执行
success: 执行状态成功时执行post
failure: 执行状态failure时执行
pipeline{ agent any stages{ stage('post测试-代码克隆'){ steps{ sh 'echo git clone' sh 'cd /data/666' } post { cleanup{ echo "post cleanup-->" } always{ echo "post always" } aborted{ echo "post aborted" } success{ script{ mail to:'794746679@qq.com', subject:"Pipline Name:${currentBuild.fullDisplayName}", body:"${env.JOB_NAME}-Build Number-${env.BUILD_NUMBER}-构建成功!\n点击链接${env.BUILD_URL}查看详情" } } failure{ script{ mail to:'794746679@qq.com', subject:"Pipline Name:${currentBuild.fullDisplayName}", body:"${env.JOB_NAME}-Build Number-${env.BUILD_NUMBER}-构建失败!\n点击链接${env.BUILD_URL}查看详情" } } } } } }
结果确认,先执行always,最后执行cleanup
environment传递环境变量
通过environmen传递变量和stage内部变量
pipline{ agent any environment{ NAME='sean' PASSWD='123456' } stages{ stage('环境变量stage1'){ environment{ GIT_SERVER = 'git@sean.gitlab.com:devops/test1.git' #内部变量无法在其他stage中使用 } steps{ sh """ echo '$NAME' echo '$PASSWD' echo '$GIT_SERVER' """ } } stage('环境变量stage2'){ steps{ sh """ echo '$NAME' echo '$PASSWD' """ } } } }
结果确认
基于parameter给step传参
通过parameter自定义参数传递给step参数,例如镜像仓库等信息
string:字符串
text:文本
booleanParam:布尔型参数
choice:选择型参数
password:密码性变量
pipeline{ agent any parameters{ string(name:'BRANCH',defaultValue:'develop',description:'分支选择') choice(name:'DEPLOY_ENV',choices:['develop','production'],description:'部署环境选择') } stages{ stage('测试参数1'){ steps{ sh "echo $BRANCH" } } stage('测试参数2'){ steps{ sh "echo $DEPLOY_ENV" } } } }
输入选项后再次构建
部署代码质量检测服务 sonarqube
安装PostgreSQL
#安装 root@postgresql:~# apt install postgresql root@postgresql:~# apt-cache madison postgresql root@postgresql:~# apt install postgresql #postgre环境初始化 sudo pg_createcluster --start 12 mycluster vim /etc/postgresql/12/mycluster/pg_hba.conf #96行 host all all 0.0.0.0/0 md5 vim /etc/postgresql/12/mycluster/postgresql.conf #60行 listen_addresses = '*' 65 port = 5432 #重启服务 systemctl restart postgresql #确认暴露地址和端口 [root@postgresql ~]#ss -ntl State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 4096 0.0.0.0:5432 0.0.0.0:* LISTEN 0 128 127.0.0.1:6010 0.0.0.0:* LISTEN 0 128 [::]:22 [::]:* LISTEN 0 4096 [::]:5432 [::]:* LISTEN 0 128 [::1]:6010 [::]:*
创建数据库及账号授权
root@postgresql:~# su - postgres postgres@postgresql:~$ psql -U postgres psql (12.12 (Ubuntu 12.12-0ubuntu0.20.04.1)) Type "help" for help. postgres=# CREATE DATABASE sonar; CREATE DATABASE postgres=# CREATE USER sonar WITH ENCRYPTED PASSWORD '123456'; CREATE ROLE postgres=# GRANT ALL PRIVILEGES ON DATABASE sonar TO sonar; GRANT postgres=# ALTER DATABASE sonar OWNER TO sonar; ALTER DATABASE postgres=# \q ~$ exit
安装sonarqube
安装jdk
apt install openjdk-11-jdk
调整内核参数
vim /etc/sysctl.conf
vm.max_map_count=262144 fs.file-max=65536
读取配置文件立即生效
sysctl -p vm.max_map_count = 262144 fs.file-max = 65536
部署sonarqube
[root@sonar ~]#mkdir /apps &&cd /apps [root@sonar apps]#unzip sonarqube-8.9.10.61524.zip #创建系统用户,/bin/bash登录,授权递归访问apps下目录切换用户 [root@sonar apps]#useradd -r -m -s /bin/bash sonarqube && chown sonarqube.sonarqube /apps/ -R && su - sonarqube #修改配置文件 vim /apps/sonarqube/conf/sonar.properties 18 sonar.jdbc.username=sonar 19 sonar.jdbc.password=123456 36 sonar.jdbc.url=jdbc:postgresql://10.0.0.151/sonar #启动sonar /apps/sonarqube/bin/linux-x86-64/sonar.sh start #查看日志服务是否成功启动 tail /apps/sonarqube/logs/*.log 2022.11.28 19:45:31 INFO app[][o.s.a.SchedulerImpl] Process[ce] is up 2022.11.28 19:45:31 INFO app[][o.s.a.SchedulerImpl] SonarQube is up #查看端口是否正常启动 sonarqube@sonar:~$ lsof -i:9000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 6493 sonarqube 14u IPv6 58212 0t0 TCP *:9000 (LISTEN)
访问9000端口登录sonar,初始用户名和密码都是admin
应用市场安装插件
关闭强制用户认证设定
创建service文件
vim /etc/systemd/system/sonarqube.service
[Unit] Description=SonarQube service After=syslog.target network.target [Service] Type=simple User=sonarqube Group=sonarqube PermissionsStartOnly=true ExecStart=/bin/nohup /usr/bin/java -Xms1024m -Xmx1024m -Djava.net.preferIPv4Stack=true -jar /apps/sonarqube/lib/sonar-application-8.9.10.61524.jar StandardOutput=syslog LimitNOFILE=131072 LimitNPROC=8192 TimeoutStartSec=5 Restart=always SuccessExitStatus=143 [Install] WantedBy=multi-user.target
基于命令、shell 脚本和 pipline 实现代码质量检测
安装sonarqube客户端
[root@jenkins apps]#unzip sonar-scanner-cli-4.7.0.2747.zip [root@jenkins apps]#ln -sv /apps/sonar-scanner-4.7.0.2747 /apps/sonar-scanner #修改配置文件 [root@jenkins apps]#vim /apps/sonar-scanner/conf/sonar-scanner.properties sonar.host.url=http://10.0.0.152:9000 #sonar服务器地址 sonar.sourceEncoding=UTF-8
测试代码质量扫描
#上传代码到指定目录 [root@jenkins python-test]#ll total 20 drwxr-xr-x 4 root root 4096 Nov 28 22:12 ./ drwxr-xr-x 3 root root 4096 Nov 28 21:04 ../ drwxr-xr-x 2 root root 4096 Nov 28 22:06 .scannerwork/ -rw-r--r-- 1 root root 287 Nov 28 22:12 sonar-project.properties drwxr-xr-x 2 root root 4096 Nov 28 21:07 src/ #设置检测项目配置文件 vim sonar-project.properties #Required metadata sonar.projectKey=sean-python sonar.projectName=sean-python-app1 sonar.projectVersion=1.0 #Comma-separated paths to directiories with sources(required) sonar.sources=./src #Language sonar.language=py #Encoding of the source files sonar.sourceEncoding=UTF-8 #执行代码扫描 /apps/sonar-scanner/bin/sonar-scanner
执行完成后扫描结果会上传到sonar服务器
通过jenkins构建shell命令实现
创建jenkins自由风格任务
任务执行结果
通过pipeline脚本实现代码扫描
开发上传了新的代码
通过pipeline脚本实现
pipeline{ agent any stages{ stage('代码克隆'){ steps{ sh "cd $env.WORKSPACE" sh "git clone git@10.0.0.150:dev/test1.git" sh "echo 克隆完成" } } stage('python源代码扫描'){ steps{ sh "cd ./test1 && /apps/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=Sean -Dsonar.projectName=sean-python-app2 -Dsonar.projectVersion=1.0 -Dsonar.sources=./src -Dsonar.language=py -Dsonar.sourceEncoding=UTF-8" } } } }
构建任务并执行
代码已上传sonar完成扫描