Jenkins  slave

添加jenkins slave节点:
jenkins slave节点创建工作目录与基本环境配置,如果jenkins slave节点需要clone代码和执行java 代码编译,则
jenkins slave节点也需要配置java环境并且安装git、svn、maven等与master相同的基础运行环境,另外也要创建与
master相同的数据目录,方便后期目录切换与制品同步,此路径通常与master和各node节点保持一致。
 
创建工作路劲
root@harbor-jenkins-slave:~# mkdir -p /var/lib/jenkins
root@harbor-jenkins-slave:~# dpkg -i jdk-11.0.17_linux-x64_bin.deb

Jenkins凭据 

pipline 语法简介:
流水线过程定义在 Pipeline{}块中,在Pipeline 块定义了整个流水线中完成的所有的操作。
Stage:阶段,一个pipline可以划分为若干个stage,每个stage都是一个操作阶段,比如代码clone、代码编译、代码
测试和代码部署,阶段是一个逻辑分组,在pipline中可以实现跨多个node执行不同的stage。
Step:步骤,step是jenkins pipline最基本的操作单元,一个stage中可以有多个step,例如在代码clone的stage中
需要定义代码clone的step、在代码编译stage需要定义代码编译的step。
Node:
jenkins工作节点,可以是jenkins master也可以是jenkins slave,node是执行step的具体服务器。

pipline 语法-指定节点:
基于agent指令选择jenkins节点:
any:可以在任何可用的节点执行,有jenkins自动分配
pipeline {
  agent any
}
 
none:表示pipline脚本没有定义在默认执行的jenkins节点,需要在后续的每一个stage中单独定义节点
pipeline {
  agent any
  stages {
    stage('代码clone'){
      agent any
        steps{
            sh 'echo 代码clone'
        }
    }
    stage('代码部署'){
      agent any
        steps{
            sh 'echo 代码部署'
        }
    }
    stage('镜像更新'){
      agent any
        steps{
            sh 'echo 镜像更新'
        }
    }
  }
}
 
pipline 语法-指定节点:
基于agent指令选择jenkins节点:
label:通过标签指定在指定的节点执行从操作:
pipeline{
    //agent any  //全局必须带有agent,表明此pipeline执行节点
    agent { label 'jenkins-node1' } //基于label指定具体执行的步骤节点,非必须
    stages{
        stage("代码clone"){
            //#agent { label 'master' }  //基于label指定具体执行的步骤节点,非必须
            steps{
                sh "cd /var/lib/jenkins/workspace/pipline-test1 && rm -rf ./*"
                git branch: 'main', credentialsId: 'a3e9ab9f-1445-49af-b5b0-74b418181739', url: 'http://10.4.7.134/awen/app01.git'
                echo "代码 clone完成"
            }
        }
       
        stage("代码构建"){
            //#agent { label 'master' }  //基于label指定具体执行的步骤节点,非必须
          steps{
            sh "tar czvf frontend.tar.gz --exclude=.git --exclude=.gitignore  --exclude=README.md ./"
          }
        }    
    }
}
 
 
pipline 语法-指定节点:
基于agent指令选择jenkins节点:
node:和 label 的功能类似都是用于指定节点,区别是node可以额外设置一些参数配置,比如设置customWorkspace(设置当前stage的自定
义工作目录)

pipline 语法-指定节点:
基于agent指令选择jenkins节点:
node:和 label 的功能类似都是用于指定节点,区别是node可以额外设置一些参数配置,比如设置customWorkspace(设置当前stage的自定
义工作目录) 

pipeline {
agent none
stages {
stage('代码clone'){
agent {
node {
label 'jenkins-master'
customWorkspace "/data/gitdata/magedu"
}
}
steps {
sh "echo 代码clone"
}
}
stage('代码部署'){
agent {
node {
label 'jenkins-master'
customWorkspace "/data/gitdata/magedu"
}
}
steps {
sh "echo 代码部署"
}
}
}
}

基于input实现交互式操作:
Input 指令可以在流水线中实现必要的交互式操作,比如选择要部署的环境、是否向后继续执行任务等。
input配置简介:
message:必选,在input界面的提示信息,比如:“是否继续?”等,内容可自定义。
id:可选,input 的标识符,默认为 stage 的名称。
ok:可选,确认按钮的显示信息,比如可以是“确定” 、 “允许”等 自定义内容,默认继续为Proceed 、取消为 Abort。
submitter:可选,允许提交 input 操作的用户或组的名称,如果为空,任何登录用户均可提交 input。
parameters:提供一个参数列表供 input 使用。
pipeline {
  agent any
  stages {
    stage('交互测试') {
      input {
        message "是否继续部署?"
        ok "继续部署"
        submitter "admin"
      }
      steps {
        echo "Hello jenkins!"
      }
    }
  }
}

post指令:
post一般用于pipline流水线执行后的进一步处理,比如错误通知等,post可以针对流水线不同的执行结果做出不同的处理,比如执行
成功做什么处理、执行失败做什么处理等。
post条件简介:
Post 可以定义在 Pipeline 或 stage 中,目前支持以下条件:
always:无论Pipeline或stage的最后是执行成功还是失败,都执行post中定义的指令。
changed:只有当前Pipeline或stage的完成状态与它之前的运行不同时,比如从成功转换为失败、或从失败转换为成功,才执行post中定义的指令。
fixed:当本次Pipeline或stage成功,且上一次构建是失败或不稳定时,就执行post中定义的指令,从失败转换为成功。
regression:当本次Pipeline或stage的状态为失败、不稳定或终止,且上一次构建的状态为成功时,就执行post中定义的指令,从成功转换为失败。
failure:只有当前Pipeline或stage的完成状态为失败(failure),才允许在post部分运行该步骤,而且通常这时在Web界面中显示为红色。
success:当前执行状态为成功(success),执行post步骤,通常在Web界面中显示为蓝色或绿色。
unstable:当前状态为不稳定(unstable),执行post步骤,通常原因是由于测试失败或代码违规等造成,而且会在Web界面中显示为黄色。
aborted:当前状态为终止(aborted),执行该post步骤,通常由于流水线被手动终止触发,这时在在Web界面中显示为灰色。
unsuccessful:当前状态只要不是success时,执行该post步骤;
cleanup:无论pipeline或stage的完成状态如何,都允许运行该post中定义的指令,和always的区别在于cleanup会在post其它条件执行之后执行(最后执
行cleanup)
post发送邮件通知示例:
pipline-job-test9 演示在这执行异常后post阶段的操作,cleanup会晚于always执行,发送邮件需要提前配置好
jenkins的邮件通知配置:
pipeline {
  agent any
  stages {
    stage('post测试-代码clone阶段') {
        steps {
            sh 'echo git clone'
            sh 'cd /data/project'  //此步骤会执行失败,用于验证构建失败的邮件通知
      }
        post {
            cleanup {
              script {
                mail to: 'tshx1991@163.com',
                  subject: "Pipeline Name: ${currentBuild.fullDisplayName}",
                  body: " ${env.JOB_NAME} -Build Number-${env.BUILD_NUMBER} -cleanup 构建失败!\n 点击链接 ${env.BUILD_URL} 查看详情"
              }
            }
          always {
              script {
                mail to: 'tshx1991@163.com',
                  subject: "Pipeline Name: ${currentBuild.fullDisplayName}",
                  body: " ${env.JOB_NAME} -Build Number-${env.BUILD_NUMBER} -always 构建失败!\n 点击链接 ${env.BUILD_URL} 查看详情"
              }
            }
          aborted {
              echo "post aborted"
              }
          success {
            script {
              mail to: 'tshx1991@163.com',
                    subject: "Pipeline Name: ${currentBuild.fullDisplayName}",
                    body: " ${env.JOB_NAME} -Build Number-${env.BUILD_NUMBER} - 构建成功!\n 点击链接 ${env.BUILD_URL} 查看详情"
              }
            }
          failure {
            script {
              mail to: 'tshx1991@163.com',
                    subject: "Pipeline Name: ${currentBuild.fullDisplayName}",
                    body: " ${env.JOB_NAME} -Build Number-${env.BUILD_NUMBER} -failure 构建失败!\n 点击链接 ${env.BUILD_URL} 查看详情"
              }
            }
        }
    }
  }
}
 
pipline环境变量:
基于environment传递环境变量:
pipeline {
  agent any
  environment {   //全局的变量,在当前pipline所有的stage中都会生效
    NAME='user1'
    PASSWD='123456'
  }
  stages {
    stage('环境变量stage1') {
      environment { //定义在stage中的变量只会在当前stage生效,其他的stage不会生效
        GIT_SERVER = 'http://10.4.7.134/awen/app01.git'
      }
      steps {
        sh """
            echo '$NAME'
            echo '$PASSWD'
            echo '$GIT_SERVER'
        """
      }
    }
    stage('环境变量stage2') {
      steps {
        sh """
            echo '${NAME}'
            echo '$PASSWD'
        """
      }
    }
  }
}
 
pipline参数简介:
 
基于parameters给step传递参数:
 可以基于parameters自定义参数,参数用于在执行pipline流水线的时候传递给step进行使用,比如传递选项参数、gitlab的分支、
镜像仓库、镜像tag等信息。
parameters简介:
string: #字符串类型参数,可以传递账户名、密码等参数
text: #文本型参数,一般用于定义多行文本内容的变量。
booleanParam:#布尔型参数
choice:#选择型参数,一般用于给定几个可选的值,然后选择其中一个进行赋值使用
password: #密码型变量,一般用于定义敏感型变量,在 Jenkins 控制台会输出为*隐藏密码
 
pipeline {
  agent any
  parameters {
    string(name: 'BRANCH', defaultValue:  'develop', description: '分支选择')   //字符串参数,会配置在jenkins的参数化构建过程中
    choice(name: 'DEPLOY_ENV', choices: ['develop', 'production'], description: '部署环境选择')  //选项参数,会配置在jenkins的参数化构建过程中
  }
  stages {
    stage('测试参数1') {
      steps {
        sh "echo $BRANCH"
      }
    }
    stage('测试参数2') {
      steps {
        sh "echo $DEPLOY_ENV"
      }
    }
  }
}
jenkins配置会解析代码里的东西

options选项配置参数简介:
buildDiscarder(logRotator(numToKeepStr: '5')) //保留5个历史构建版本
timeout(time: 5, unit: 'MINUTES') //定义任务执行超时时间1小时,如果不加unit参数默认时间单位为分钟,支持NANOSECONDS,
MICROSECONDS,MILLISECONDS,SECONDS,MINUTES,HOURS,DAYS
timestamps() //在控制台显示命令执行的时间,格式为10:58:39
retry(2) //流水线构建失败后重试次数为2次
 
创建视图

/etc/sysctl.conf

vm.max_map_count = 524288
fs.file-max = 131072

apt-cache madison postgresql
postgresql | 14+238 | https://mirrors.aliyun.com/ubuntu jammy/main amd64 Packages
apt install postgresql

初始化

pg_createcluster --start 14 mycluster4

/etc/postgresql/14/mycluster/postgresql.conf

60 listen_addresses = '*' 
65 max_connections = 4096

/etc/postgresql/14/mycluster/pg_hba.conf

97 host    all             all             0.0.0.0/0            scram-sha-256

systemctl restart postgresql

su - postgres
 psql -U postgres
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.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
logout

root用户

vim /etc/postgresql/14/mycluster/postgresql.conf

listen_addresses = '*' 
max_connections = 4096

vim /etc/postgresql/14/mycluster/pg_hba.conf
96 # IPv4 local connections:
97 host all all 0.0.0.0/0 scram-sha-256
 
 
 

cat /etc/security/limits.conf

sonarqube - nofie 131072
sonarqube - nnorce 8192

/etc/sysctl.conf

vm.max_map_count = 262144
fs.file-max = 65535

mkdir /apps && cd /apps/

useradd -r -m -s /bin/bash sonarqube && chown sonarqube.sonarqube /apps/ -R && su - sonarqube

unzip sonarqube-9.7.1.62043.zip

ln -sv /apps/sonarqube-9.7.1.62043 /apps/sonarqube

/conf/sonar.properties

sonar.jdbc.username=sonar
sonar.jdbc.password=123456

sonar.jdbc.url=jdbc:postgresql://10.4.7.137/sonar

启动sonar

/apps/sonarqube/bin/linux-x86-64$ ./sonar.sh start
/usr/lib/jvm/jdk-11/bin/java
Starting SonarQube...
Started SonarQube.

安装插件

root@jenkins:~# cat /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/lib/jvm/jdk-11/bin/java -Xms512m -Xmx512m -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

systemctl daemon-reload
systemctl start sonarqube.service

部署sonar-scanner

root@jenkins:/usr/local/src# unzip sonar-scanner-cli-4.7.0.2747.zip

root@jenkins:/apps# ln -sv sonar-scanner-4.7.0.2747/ sonar-scanner

当前目录下执行

root@jenkins:/opt/python-test# /apps/sonar-scanner/bin/sonar-scanner

查看扫描结果

命令实现代码扫描

root@jenkins:/opt/python-test# /apps/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=ha -Dsonar.projectName=ha-python-app1 -Dsonar.projectVersion=1.0 -Dsonar.sources=./src -Dsonar.language=py -Dsonar.sourceEncoding=UTF-8

pipeline {
  agent { label 'jenkins-node1' }
  parameters {
    string(name: 'BRANCH', defaultValue:  'develop', description: '分支选择')   //字符串参数,会配置在jenkins的参数化构建过程中
    choice(name: 'DEPLOY_ENV', choices: ['develop', 'production'], description: '部署环境选择')  //选项参数,会配置在jenkins的参数化构建过程中
  }
  stages {
    stage('变量测试1') {
      steps {
        sh "echo $env.WORKSPACE"  //JOB的工作目录,可用于后期目录切换
        sh "echo $env.JOB_URL"  //JOB的URL
        sh "echo $env.NODE_NAME"  //节点名称,master 名称显示built-in
        sh "echo $env.NODE_LABELS" //节点标签
        sh "echo $env.JENKINS_URL"  //jenkins的URL地址
        sh "echo $env.JENKINS_HOME" //jenkins的家目录路径
      }
    }
    stage("code clone"){
            //#agent { label 'master' }  //具体执行的步骤节点,非必须
      steps {
                deleteDir() //删除workDir当前目录
                script {
                    if ( env.BRANCH == 'main' ) {
                        git branch: 'main', credentialsId: 'a3e9ab9f-1445-49af-b5b0-74b418181739', url: 'http://10.4.7.134/awen/app02.git''
                    } else if ( env.BRANCH == 'develop' ) {
                        git branch: 'develop', credentialsId: 'a3e9ab9f-1445-49af-b5b0-74b418181739', url: 'http://10.4.7.134/awen/app02.git''
                    } else {
                        echo '您传递的分支参数BRANCH ERROR,请检查分支参数是否正确'
                    }
                    GIT_COMMIT_TAG = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim() //获取clone完成的分支tagId,用于做镜像做tag
                }
          }
        }
    stage('python源代码质量扫描') {
        steps {
            sh "cd $env.WORKSPACE && /apps/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=magedu -Dsonar.projectName=magedu-python-app1 -Dsonar.projectVersion=1.0  -Dsonar.sources=./src -Dsonar.language=py -Dsonar.sourceEncoding=UTF-8"
            }
        }
    }
}

Jenkins&&gitlab2的更多相关文章

  1. Jenkins 安装的HTML Publisher Plugin 插件无法展示ant生成的JunitReport报告

    最近在做基于jenkins ant  junit 的测试持续集成,单独ant junit生成的junitreport报告打开正常,使用Jenkins的HTML Publisher Plugin 插件无 ...

  2. Python-Jenkins API使用 —— 在后端代码中操控Jenkins

    最近在工作中需要用到在后台代码中触发Jenkins任务的构建,于是想到Jenkins是否有一些已经封装好的API类库提供,用于处理跟Jenkins相关的操作.下面就简单介绍下我的发现. Linux C ...

  3. 在centos7上安装Jenkins

    在centos7上安装Jenkins 安装 添加yum repos,然后安装 sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins ...

  4. 项目持续集成环境(jenkins + SVN + maven + tomcat)

    整体流程 每次SVN上代码有变动,触发自动构建动作,并部署到服务器的tomcat上,具体流程: 1.SVN上提交代码修改 2.maven执行Goals 3.将web工程打成war包 4.关闭服务器的t ...

  5. Jenkins的一个bug-同时build一个项目两次导致失败

    我们有一个job A, A只是配置了一些参数,它会去触发模板job B. 我一开始点击构建A, 马上发现参数配置不对,于是撤消了构建,但是我没有发现B已经被触发,我重新配置参数,然后再次构建A,这个时 ...

  6. 使用Jenkins配置Git+Maven的自动化构建

    Jenkins是一个开源的持续集成工具,应用Jenkins搭建持续集成环境,可以进行自动构建.自动编译和部署,非常方便. 在服务器比较少的情况下,Jenkins的优势并不明显,但是随着项目发展,服务器 ...

  7. Jenkins配置MSBuild实现自动部署(MSBuild+SVN/Subversion+FTP+BAT)

    所要用到的主要插件: [MSBuild Plugin] 具体操作: 1.配置MSBuild的版本 [系统管理]->[Global Tool Configuration]->[MSBuild ...

  8. 在Redhat上为.Net 项目构建基于Jenkins + Github + Mono 的持续集成环境

    在Redhat enterprise 6.5 的服务器上,为在gutub 上的 .net 项目构建一个持续集成环境,用到了Jenkins和mono.因公司的服务器在内网,访问外网时要通过代理,所以在很 ...

  9. 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)

    前言     上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库 ...

随机推荐

  1. C++自学笔记 Composition:对象组合

    继承是实现软件重用的一种方式. 在C++中拥有另一种实现软件重用的方式----- Composition:对象组合 用已经有的对象制造新的对象 (设计一个类的时候它的成员变量可以是另一个类的对象) 对 ...

  2. 玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架

    转载来源:https://www.cnblogs.com/coderzh/archive/2009/04/12/1434155.html 一.前言 上一篇我们分析了gtest的一些内部实现,总的来说整 ...

  3. 路径分析—PostgreSQL+GeoServer+Openlayers(二)

    路径分析-QGIS+PostgreSQL+PostGIS+pgRouting(一) 路径分析-PostgreSQL+GeoServer+Openlayers(二) 前言 上一篇文章中实现数据库层面的路 ...

  4. Chrony时间同步服务

    概:  网络时间协议(Network Time Protocol,NTP)是用于网络时间同步的协议.提供NTP时间同步服务的软件有很多,这里采用Chrony软件来实现时间同步 chrony 的优势:  ...

  5. python读取文本数据某一列

    import codecs f = codecs.open('test1 - 副本.txt', mode='r', encoding='utf-8') # 打开txt文件,以'utf-8'编码读取 l ...

  6. 重新整理 .net core 实践篇 ———— linux上排查问题 [外篇]

    前言 简单介绍一下在排查问题.献给初学者. 该文的前置篇: https://www.cnblogs.com/aoximin/p/16838657.html 正文 什么是linux系统 linux 是基 ...

  7. 某 .NET RabbitMQ SDK 有采集行为,你怎么看?

    一:背景 1.讲故事 前几天有位朋友在微信上找到我,说他的一个程序上了生产之后,被运维监控定位到这个程序会向一个网址为: http://m.365ey.net 上不定期打数据,而且还是加密的格式,要他 ...

  8. while循环条件不成立却无法跳出死循环的问题

    在进入循环的时候,实际上是将A从内存加载到寄存器里面运行的,在整个循环中,A这个变量都只是在读取寄存器里面的值. 而当进入中断的时候,中断里面会从内存加载A到寄存器,修改完之后又存到内存里,然后退出中 ...

  9. JS 学习笔记(二)Ajax的简单使用

    使用Ajax访问本地TXT文件 ajax.js // 创建请求对象 var ajax = new XMLHttpRequest(); // 建立连接 ajax.open('get', 'test.tx ...

  10. Java线程未捕获异常处理 UncaughtExceptionHandler

    当一个线程在执行过程中抛出了异常,并且没有进行try..catch,那么这个线程就会终止运行.在Thread类中,提供了两个可以设置线程未捕获异常的全局处理器,我们可以在处理器里做一些工作,例如将异常 ...