极客时间运维进阶训练营第四周作业

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完成扫描

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值