没自己搭过Jenkins?你可能需要这篇文章!

358 阅读3分钟

一、Jenkins安装

  1. 软件准备

    jenkins-2.204.6-1.1.noarch.rpm

    官网自行下载

  2. 安装Jenkins

    rpm -ivh jenkins-2.204.6-1.1.noarch.rpm

  3. 启动前配置Jenkins的java环境

    vim /etc/init.d/jenkins

    candidates="
    /etc/alternatives/java
    /usr/lib/jvm/java-1.8.0/bin/java
    /usr/lib/jvm/jre-1.8.0/bin/java
    /usr/lib/jvm/java-1.7.0/bin/java
    /usr/lib/jvm/jre-1.7.0/bin/java
    /usr/lib/jvm/java-11.0/bin/java
    /usr/lib/jvm/jre-11.0/bin/java
    /usr/lib/jvm/java-11-openjdk-amd64
    /usr/bin/java
    /usr/java/jdk1.8.0_231/bin/java
    
    
  4. jenkins的目录结构
    /usr/lib/jenkins/jenkins.war     WAR包 
    
    /etc/sysconfig/jenkins          配置文件
    
    /var/lib/jenkins/               默认的JENKINS_HOME目录
    
    /var/log/jenkins/jenkins.log      Jenkins日志文件
    
  5. 启动Jenkins
    service jenkins start/stop/restart
    
    chkconfig jenkins on
    
  6. Jenkins页面打开很慢

    cd /var/lib/jenkins/hudson.model.UpdateCenter.xml

    http://mirror.xmission.com/jenkins/updates/update-center.json
    
  7. 防火墙端口开通
    vim /etc/sysconfig/iptables
    # 新增端口
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080  -j ACCEPT
    
    systemctl restart iptables.service
    
  8. Jenkins访问

    http://192.168.0.169:8080/

  9. Jenkins插件安装很慢

    cd /var/lib/jenkins/updates`

     sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
    
  10. 修改Jenkins 以root用户运行

    # 打开配置文件
    vim /etc/sysconfig/jenkins
    # 修改$JENKINS_USER,并去掉当前行注释
    $JENKINS_USER="root"
    修改Jenkins相关文件夹用户权限
    
    chown -R root:root /var/lib/jenkins
    chown -R root:root /var/cache/jenkins
    chown -R root:root /var/log/jenkins
    重启Jenkins服务并检查运行Jenkins的用户是否已经切换为root
    
    # 重启Jenkins(若是其他方式安装的jenkins则重启方式略不同)
    service jenkins restart
    # 查看Jenkins进程所属用户
    ps -ef | grep jenkins
    # 若显示为root用户,则表示修改完成
    

二、Jenkins配置

  1. 手动安装必要插件
    • Extended Choice Parameter
    • Blue Ocean
    • Publish Over SSH
  2. 环境变量配置

    Manage Jenkins -> Global Tool Configuration

    JDK配置

    • 配置jdk环境变量

MAVEN配置

  • 官网下载,配置maven环境变量

Git配置

  • yum -y install git

  • 在jenkins服务器执行以下命令生成git密钥

    ssh-keygen -t rsa -C "793918655@qq.com"
    

    密钥生成位置

    /root/.ssh
    id_rsa #私钥
    id_rsa.pub #公钥
    
  • 将公钥复制到gitea中

  • 将私钥复制到 Jenkins中

  • 完成git配置

三、PipeLine项目配置

  1. 创建pipeline项目

  1. 选择This project is parameterized,Extended Choice Paramer配置需要选择的项目

  1. 编写Pipeline Script

  1. 点击Build with Parameters

    • 服务器选择和重新构建选择只有在构建一次之后才会出现

  1. 发布成功

四、发布脚本

1.Pipeline Script 【groovy脚本】

pipeline {
    agent any
    //参数化变量,目前只支持[booleanParam, choice, credentials, file, text, password, run, string]这几种参数类型,其他高级参数化类型还需等待社区支持。
    parameters {
        //发布的服务器
        choice(name: 'DEPLOY_SERVER', choices: ['server1', 'server2', 'server3'], description: '请选择发布的服务器')
        booleanParam(name: 'IS_BUILD', defaultValue:true, description: '项目是否需要重新构建?')
    }
    tools {
        maven 'M3'
        jdk 'jdk1.8.0_231'
    }
    stages {
        stage('checkout') {
            steps {
                echo 'Gitea 拉取代码 Checkout'
                //拉取代码
                git credentialsId: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx', url: 'giturl'

            }
        }

        stage('build') {
            when {
                expression {
                    return (params.IS_BUILD == true)
                }
            }
            steps {
                echo 'Maven 开始构建 Building ......'
                // Run Maven on a Unix agent.
                sh 'mvn -Dmaven.test.failure.ignore=true clean package'
            }

            post {
                // If Maven was able to run the tests, even if some of the test
                // failed, record the test results and archive the jar file.
                success {
                    echo 'application Build Success!'
                }
            }
        }
        // 请选择需要部署的应用服务
        stage('choose-app') {
            steps {
                script {
                    def chooses = "${chooseDeployApp}"
                    echo "需要部署的应用服务, 选择结果如下:${chooseDeployApp}"
                    APP1_DEPLOY_FLAG = chooses.contains("app1") ? true : false
                    println "ADMIN_DEPLOY_FLAG:" + ADMIN_DEPLOY_FLAG //服务1

                    APP2_DEPLOY_FLAG = chooses.contains("app2") ? true : false
                    println "DATA_DEPLOY_FLAG:" + DATA_DEPLOY_FLAG //服务2

                }
            }
        }

        //准备工作,将run.sh脚本上传至服务器
        stage('Prepare') {
            steps {
                sshPublisher(publishers: [
                        sshPublisherDesc(
                                configName: "${params.DEPLOY_SERVER}",
                                transfers: [sshTransfer(
                                        cleanRemote: false,
                                        excludes: '',
                                        execCommand: 'chmod 777 /opt/app/run.sh',
                                        execTimeout: 120000,
                                        flatten: false,
                                        makeEmptyDirs: false,
                                        noDefaultExcludes: false,
                                        patternSeparator: '[, ]+',
                                        remoteDirectory: '/opt/app',
                                        remoteDirectorySDF: false,
                                        removePrefix: 'doc/',
                                        sourceFiles: 'doc/run.sh')],
                                usePromotionTimestamp: false,
                                useWorkspaceInPromotion: false,
                                verbose: false)])

            }

            post {
                // If Maven was able to run the tests, even if some of the test
                // failed, record the test results and archive the jar file.
                success {
                    echo 'run.sh deploy Success!'
                }
            }
        }

        stage('app1') {

            when {
                expression {
                    return (APP1_DEPLOY_FLAG == true)
                }
            }
            steps {
                sshPublisher(
                        publishers: [sshPublisherDesc(
                                configName: "${params.DEPLOY_SERVER}",
                                transfers: [sshTransfer(
                                        cleanRemote: false,
                                        excludes: '',
                                        execCommand: 'sh /opt/app/run.sh backups_restart app1',
                                        execTimeout: 120000,
                                        flatten: false,
                                        makeEmptyDirs: false,
                                        noDefaultExcludes: false,
                                        patternSeparator: '[, ]+',
                                        remoteDirectory: '/opt/app/app1/jar',
                                        remoteDirectorySDF: false,
                                        removePrefix: 'app1/target/',
                                        sourceFiles: 'app1/target/app1.jar')],
                                usePromotionTimestamp: false,
                                useWorkspaceInPromotion: false,
                                verbose: false)])

            }

            post {
                // If Maven was able to run the tests, even if some of the test
                // failed, record the test results and archive the jar file.
                success {
                    echo '部署 app1 Success!'
                }
            }
        }
    }
}


2.项目启动脚本【run.sh】

#!/bin/bash
export JAVA_HOME=/usr/java/jdk1.8.0_231
export PATH=$PATH:$JAVA_HOME/bin
#java虚拟机启动参数  
JAVA_OPTS="-Xms512m -Xmx512m -Xmn64m -XX:MaxPermSize=128m"
#需要启动的Java主程序(main方法类) 
APP_NAME=$2
APP_MAINCLASS=$2".jar"
APP_PATH="/opt/app/"$2

#初始化psid变量(全局)
psid=0
checkpid() {
    javaps=`jps -l | grep $APP_MAINCLASS`
#   javaps=`$(ps x | grep $APP_MAINCLASS | grep -v grep | awk '{print $1}')`

   if [ -n "$javaps" ]; then
      psid=`echo $javaps | awk '{print $1}'`  
   else
      psid=0  
   fi
}
start() {
   checkpid

   if [ $psid -ne 0 ]; then
      echo "================================"  
      echo "info: $APP_MAINCLASS already started! (pid=$psid)"  
      echo "================================"  
   else  
      echo -n "Starting $APP_MAINCLASS ..."  
      `nohup java $JAVA_OPTS -jar $APP_PATH/$APP_MAINCLASS > /dev/null 2>&1 &`
      checkpid
      if [ $psid -ne 0 ]; then
         echo "(pid=$psid) [OK]"  
      else  
         echo "[Failed]"  
      fi  
   fi
}
stop() {  
   checkpid  
   
   if [ $psid -ne 0 ]; then  
      echo -n "Stopping $APP_MAINCLASS ...(pid=$psid) "
      `kill -9 $psid`  
      if [ $? -eq 0 ]; then  
         echo "[OK]"  
      else  
         echo "[Failed]"  
      fi  
   
      checkpid  
      if [ $psid -ne 0 ]; then  
         stop  
      fi  
   else  
      echo "======================================="  
      echo "[WARN]: $APP_MAINCLASS is not running"  
      echo "======================================="  
   fi  
}
backups() {
  if [ ! -d "$APP_PATH/backups" ];then
    mkdir -p $APP_PATH/backups
    echo "[WARN] backups dir is not exist, mkdir success ========================================="
  else
    echo "[info] backups dir is exist========================================="
  fi
  
  if [ ! -d "$APP_PATH/log" ];then
    mkdir -p $APP_PATH/log
    echo "[WARN] log dir is not exist, mkdir success ========================================="
  else
    echo "[info] log dir is exist========================================="
  fi
  
  if [ ! -d "$APP_PATH/jar" ];then
    mkdir -p $APP_PATH/jar
    echo "[WARN] jar dir is not exist, mkdir success ========================================="
  else
    echo "[info] jar dir is exist========================================="
  fi
  
  mv $APP_PATH/$APP_MAINCLASS $APP_PATH/backups/$APP_NAME$(date +%Y%m%d%H%M).jar
  cp $APP_PATH/jar/$APP_MAINCLASS $APP_PATH
  sleep 3
}
case "$1" in  
   'start')  
      start  
      ;;  
   'stop')  
     stop  
     ;;  
   'restart')  
     stop 
     start  
     ;;
   'backups_restart')  
     stop 
     backups 
     start  
     ;;
  *)  
echo "Usage: $0 {start|stop|restart|backups_restart}"
exit 1  
esac   
exit 0