Skip to content

Latest commit

 

History

History
557 lines (441 loc) · 17.5 KB

File metadata and controls

557 lines (441 loc) · 17.5 KB

Jenkins 安装和配置

Jenkins 介绍

Docker 下安装 Jenkins

  • 配置:至少需要 2G 内存
  • 先禁用 selinux
    • 编辑配置文件:vim /etc/selinux/config
    • SELINUX=enforcing 改为 SELINUX=disabled
    • 重启服务器
  • 官网下载中有介绍其版本标识:https://jenkins.io/download/
    • 我们就选用:Long-term Support (LTS)
  • 官网关于 Docker 部署也有专门文档:https://github.com/jenkinsci/docker/blob/master/README.md
  • 先创建一个宿主机以后用来存放数据的目录:mkdir -p /data/jenkins/jenkins_home && chmod 777 -R /data/jenkins/jenkins_home
  • 安装镜像(813MB,有点大):docker pull jenkins/jenkins:lts
  • 查看下载下来的镜像:docker images
  • 首次运行镜像:docker run --name jenkins-master -p 8123:8080 -p 50000:50000 -v /etc/localtime:/etc/localtime -v /data/jenkins/jenkins_home:/var/jenkins_home -e JAVA_OPTS="-Duser.timezone=Asia/Shanghai" -d --restart always jenkins/jenkins:lts
    • 这里的 8080 端口是 jenkins 运行程序的端口,必须要有映射的。50000 端口是非必须映射的,但是如果你要用 Jenkins 分布式构建这个就必须开放
  • 如果报下面的错误:
touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
  • 解决办法:chown -R 1000:1000 /data/jenkins/jenkins_home,具体原因:点击查看
    • 问题的本质就是,jenkins 镜像中的系统用户是:jenkins,当你进入容器 bash 内,输入:whoami && id,你就可以看到他的 uid 是 1000,所以这里才 chown 1000
  • 查看容器运行情况:docker ps
  • 进入容器中 Jenkins shell 交互界面:docker exec -it bd290d5eb0d /bin/bash

首次使用 Jenkins / Jenkins 插件推荐

  • 我这里就不截图了,有需要截图可以看这博文,差不多就是这样的:点击我o(∩_∩)o
  • 首次进入 Jenkins 的 Web UI 界面是一个解锁页面 Unlock Jenkins,需要让你输入:Administrator password
    • 这个密码放在:/var/jenkins_home/secrets/initialAdminPassword,你需要先:docker exec -it ci_jenkins_1 /bin/bash
      • 然后:cat /data/jenkins/jenkins_home/secrets/initialAdminPassword
      • 也有可能是这个目录:cat /var/jenkins_home/secrets/initialAdminPassword
  • 然后再接下来就是插件的安装,我推荐直接用它推荐给我们的插件直接安装,稍后再安装自己需要定制的。
  • 插件安装完会进入:Create First Admin User 页面,填写一个用户信息即可。
  • 我的这里的代码仓库是:Gitlab
  • 推荐插件
    • Publish Over SSH(具体名字要看下)
    • Dashbroad View
    • Folders View
    • OWASP Markup Formatter Plugin
    • Build Name Setter Plugin
    • build timeout plugin
    • Credentials Binding Plugin
    • Embeddable Build Status Plugin
    • Pipeline
    • Build Pipeline Plugin
    • Docker Pipeline Plugin
    • Git plugin
    • GitLab Plugin
    • SSH Slaves plugin
    • Maven Integration plugin
    • Matrix Authorization Strategy Plugin
    • PAM Authentication plugin
    • LDAP Plugin
    • Role-based Authorization Strategy
    • Email Extension Plugin
    • Email Extension Template Plugin
    • Mailer Plugin
    • NotifyQQ(QQ 消息通知
    • 钉钉通知(钉钉 消息通知
    • oauth(具体名字要看下)
    • Build Failure Analyzer 分析构建错误日志并在构建页面显示错误
    • SSH plugin 支持通过SSH执行脚本
    • Pre SCM BuildStep Plugin 在拉代码之前插入一些步骤
    • GitHub API Plugin Github API插件
    • GitHub Pull Request Builder Github Pull Request时自动构建
    • GitHub plugin Github与Jenkins集成
    • GIT client plugin Git客户端插件
    • Maven Integration plugin:用于构建 Maven 项目
    • Gradle Plugin:用于构建 Gradle 项目
    • Gitlab Plugin:可能会直接安装不成功,如果不成功根据报错的详细信息可以看到 hpi 文件的下载地址,挂代理下载下来,然后离线安装即可
    • Gitlab Hook:用于触发 GitLab 的一些 WebHooks 来构建项目
    • Gitlab Authentication 这个插件提供了使用GitLab进行用户认证和授权的方案
    • FireLine Plugin:代码规范检查,已经集成了阿里巴巴的代码规约(P3C)检查
    • Docker Commons Plugin
    • Docker plugin
    • Kubernetes
    • Pre SCM BuildStep Plugin 在拉代码之前插入一些步骤
    • GitHub Pull Request Builder Github Pull Request时自动构建
    • GitHub API Plugin Github API插件
    • AnsiColor(可选):这个插件可以让Jenkins的控制台输出的log带有颜色
    • NodeJS Plugin

Docker 的 Jenkins 与 Docker 结合使用

  • 运行镜像命令:docker run --name jenkins-master -p 8123:8080 -p 50000:50000 -v /etc/localtime:/etc/localtime -v /data/jenkins/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -e JAVA_OPTS="-Duser.timezone=Asia/Shanghai" -d --restart always jenkins/jenkins:lts
    • 比上面多了一步:-v /var/run/docker.sock:/var/run/docker.sock
  • 这样,在 jenkins 里面写 shell 脚本调用 docker 程序,就可以直接调用宿主机的 docker 了。

Jenkins 安装(YUM)

  • 需要 JDK8 环境
  • 当前最新版本:2.138.1-1.1(201810)
  • 官网安装说明 RedHat Linux RPM packages:https://pkg.jenkins.io/redhat-stable/
  • 官网在线安装(72M),该安装方式会自己生成一个 jenkins 用户组和用户:
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

sudo yum install -y jenkins
  • 查看安装后的情况:rpm -ql jenkins
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
/usr/lib/jenkins
/usr/lib/jenkins/jenkins.war
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins
/var/log/jenkins
  • jenkins 相关目录释义:
/usr/lib/jenkins/:jenkins安装目录,war 包会放在这里。
/etc/sysconfig/jenkins:jenkins配置文件,“端口”,“JENKINS_HOME” 等都可以在这里配置。
/var/lib/jenkins/:默认的 JENKINS_HOME。
/var/log/jenkins/jenkins.log:jenkins 日志文件。
  • 配置 jenkins 端口,默认是:8080
vim /etc/sysconfig/jenkins

56 行:JENKINS_PORT="8080"
  • 控制台输出方式启动:java -jar /usr/lib/jenkins/jenkins.war
  • 内置 Jetty
  • 可以看到有一个这个重点内容,这是你的初始化密码,等下会用到的:
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

daacc724767640a29ddc99d159a80cf8

This may also be found at: /root/.jenkins/secrets/initialAdminPassword
  • 守护进程启动:nohup java -jar /usr/lib/jenkins/jenkins.war > /dev/null 2>&1 &
  • 浏览器访问 Jenkins 首页开始配置:http://192.168.0.105:8080/
  • 特殊情况:
    • 如果配置插件过程遇到这个错误:No valid crumb was included in the request,则多重试几次。
    • 登录后把:http://192.168.0.105:8080/configureSecurity/ 下面的 防止跨站点请求伪造 勾选去掉。遇到问题多试几次。

pipeline 语法

BUILD_NUMBER = ${env.BUILD_NUMBER}"
BUILD_ID = ${env.BUILD_ID}"
BUILD_DISPLAY_NAME = ${env.BUILD_DISPLAY_NAME}"
JOB_NAME = ${env.JOB_NAME}"
JOB_BASE_NAME = ${env.JOB_BASE_NAME}"
WORKSPACE = ${env.WORKSPACE}"
JENKINS_HOME = ${env.JENKINS_HOME}"
JENKINS_URL = ${env.JENKINS_URL}"
BUILD_URL = ${env.BUILD_URL}"
JOB_URL = ${env.JOB_URL}"
  • 输出结果:
BUILD_NUMBER = 21
BUILD_ID = 21
BUILD_DISPLAY_NAME = #21
JOB_NAME = react
JOB_BASE_NAME = react
WORKSPACE = /root/.jenkins/workspace/react
JENKINS_HOME = /root/.jenkins
JENKINS_URL = http://192.168.0.105:8080/
BUILD_URL = http://192.168.0.105:8080/job/react/21/
JOB_URL = http://192.168.0.105:8080/job/react/

Jenkins 前端 React 项目构建

简单的 pipeline 写法(开源项目)

pipeline {
  agent any

  options {
    timestamps()
    disableConcurrentBuilds()
    buildDiscarder(logRotator(
      numToKeepStr: '20',
      daysToKeepStr: '30',
    ))
  }

  /*=======================================常修改变量-start=======================================*/

  environment {
    gitUrl = "https://github.com/satan31415/heh_umi_template.git"
    branchName = "master"
    projectBuildPath = "${env.WORKSPACE}/dist"
    nginxHtmlRoot = "/usr/share/nginx/react"
  }
  
  /*=======================================常修改变量-end=======================================*/
  
  stages {
    
    stage('Pre Env') {
      steps {
         echo "======================================项目名称 = ${env.JOB_NAME}"
         echo "======================================项目 URL = ${gitUrl}"
         echo "======================================项目分支 = ${branchName}"
         echo "======================================当前编译版本号 = ${env.BUILD_NUMBER}"
         echo "======================================项目 Build 文件夹路径 = ${projectBuildPath}"
         echo "======================================项目 Nginx 的 ROOT 路径 = ${nginxHtmlRoot}"
      }
    }
    
    stage('Git Clone'){
      steps {
          git branch: "${branchName}", url: "${gitUrl}"
      }
    }

    stage('NPM Install') {
      steps {
        sh "npm install"
      }
    }

    stage('NPM Build') {
      steps {
        sh "npm run build"
      }
    }

    stage('Nginx Deploy') {
      steps {
        sh "rm -rf ${nginxHtmlRoot}/"
        sh "cp -r ${projectBuildPath}/ ${nginxHtmlRoot}/"
      }
    }


  }
}

简单的 pipeline 写法(闭源项目 -- 码云为例)

pipeline {
  agent any

  options {
    timestamps()
    disableConcurrentBuilds()
    buildDiscarder(logRotator(
      numToKeepStr: '20',
      daysToKeepStr: '30',
    ))
  }

  /*=======================================常修改变量-start=======================================*/

  environment {
    gitUrl = "https://gitee.com/youmeek/react-demo.git"
    branchName = "master"
    giteeCredentialsId = "上面全局凭据填写的 ID"
    projectBuildPath = "${env.WORKSPACE}/dist"
    nginxHtmlRoot = "/usr/share/nginx/react"
  }
  
  /*=======================================常修改变量-end=======================================*/
  
  stages {
    
    stage('Pre Env') {
      steps {
         echo "======================================项目名称 = ${env.JOB_NAME}"
         echo "======================================项目 URL = ${gitUrl}"
         echo "======================================项目分支 = ${branchName}"
         echo "======================================当前编译版本号 = ${env.BUILD_NUMBER}"
         echo "======================================项目 Build 文件夹路径 = ${projectBuildPath}"
         echo "======================================项目 Nginx 的 ROOT 路径 = ${nginxHtmlRoot}"
      }
    }
    
    stage('Git Clone'){
      steps {
          git branch: "${branchName}",
          credentialsId: "${giteeCredentialsId}",
          url: "${gitUrl}"
      }
    }

    stage('NPM Install') {
      steps {
        sh "npm install"
      }
    }

    stage('NPM Build') {
      steps {
        sh "npm run build"
      }
    }

    stage('Nginx Deploy') {
      steps {
        sh "rm -rf ${nginxHtmlRoot}/"
        sh "cp -r ${projectBuildPath}/ ${nginxHtmlRoot}/"
      }
    }


  }
}

Jenkins 后端 Spring Boot 项目构建

安装 Maven

配置工具

  • 访问:http://192.168.0.105:8080/configureTools/
  • 我习惯自己安装,所以这里修改配置:
    • 需要注意:配置里面的 别名 不要随便取名字,后面 Pipeline 要用到的。在 tool 标签里面会用到。
    • 具体可以查看该图片说明:点击查看

简单的 pipeline 写法(Jar 方式运行)(闭源项目 -- 码云为例)

先写一个控制 jar 脚本
  • 来源:鹏磊
  • 创建脚本:vim /etc/rc.d/init.d/spring-boot.sh
  • 设置权限:chmod 777 /etc/rc.d/init.d/spring-boot.sh
  • 脚本内容:
#!/bin/bash

SpringBoot=$2

if [ "$1" = "" ];
then
    echo -e "\033[0;31m 未输入操作名 \033[0m  \033[0;34m {start|stop|restart|status} \033[0m"
    exit 1
fi

if [ "$SpringBoot" = "" ];
then
    echo -e "\033[0;31m 未输入应用名 \033[0m"
    exit 1
fi

function start()
{
    count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`
    if [ $count != 0 ];then
        echo "$SpringBoot is running..."
    else
        echo "Start $SpringBoot success..."
        BUILD_ID=dontKillMe nohup java -jar $SpringBoot > /dev/null 2>&1 &
    fi
}

function stop()
{
    echo "Stop $SpringBoot"
    boot_id=`ps -ef |grep java|grep $SpringBoot|grep -v grep|awk '{print $2}'`
    count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`

    if [ $count != 0 ];then
        kill $boot_id
        count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`

        boot_id=`ps -ef |grep java|grep $SpringBoot|grep -v grep|awk '{print $2}'`
        kill -9 $boot_id
    fi
}

function restart()
{
    stop
    sleep 2
    start
}

function status()
{
    count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l`
    if [ $count != 0 ];then
        echo "$SpringBoot is running..."
    else
        echo "$SpringBoot is not running..."
    fi
}

case $1 in
    start)
    start;;
    stop)
    stop;;
    restart)
    restart;;
    status)
    status;;
    *)

    echo -e "\033[0;31m Usage: \033[0m  \033[0;34m sh  $0  {start|stop|restart|status}  {SpringBootJarName} \033[0m\033[0;31m Example: \033[0m\033[0;33m sh  $0  start esmart-test.jar \033[0m"
esac
配置 Jenkins
  • 必须:新增一个全局凭据,方法参考前端部分
pipeline {
  agent any

  /*=======================================工具环境修改-start=======================================*/
  tools {
    jdk 'JDK8'
    maven 'MAVEN3'
  }
  /*=======================================工具环境修改-end=======================================*/

  options {
    timestamps()
    disableConcurrentBuilds()
    buildDiscarder(logRotator(
      numToKeepStr: '20',
      daysToKeepStr: '30',
    ))
  }

  /*=======================================常修改变量-start=======================================*/

  environment {
    gitUrl = "https://gitee.com/youmeek/springboot-jenkins-demo.git"
    branchName = "master"
    giteeCredentialsId = "Gitee"
    projectWorkSpacePath = "${env.WORKSPACE}"
    projectBuildTargetPath = "${env.WORKSPACE}/target"
    projectJarNewName = "${env.JOB_NAME}.jar"

  }
  
  /*=======================================常修改变量-end=======================================*/
  
  stages {
    
    stage('Pre Env') {
      steps {
         echo "======================================项目名称 = ${env.JOB_NAME}"
         echo "======================================项目 URL = ${gitUrl}"
         echo "======================================项目分支 = ${branchName}"
         echo "======================================当前编译版本号 = ${env.BUILD_NUMBER}"
         echo "======================================项目空间文件夹路径 = ${projectWorkSpacePath}"
         echo "======================================项目 build 后 jar 路径 = ${projectBuildTargetPath}"
      }
    }
    
    stage('Git Clone'){
      steps {
          git branch: "${branchName}",
          credentialsId: "${giteeCredentialsId}",
          url: "${gitUrl}"
      }
    }

    stage('Maven Clean') {
      steps {
        sh "mvn clean"
      }
    }

    stage('Maven Package') {
      steps {
        sh "mvn package -DskipTests"
      }
    }

    stage('Spring Boot Run') {
      steps {
        sh "mv ${projectBuildTargetPath}/*.jar ${projectBuildTargetPath}/${projectJarNewName}"
        sh "cp /etc/rc.d/init.d/spring-boot.sh ${projectBuildTargetPath}"
        sh "bash ${projectBuildTargetPath}/spring-boot.sh restart ${projectJarNewName}"
      }
    }

  }
}

简单的 pipeline 写法(Docker 方式运行)(闭源项目 -- 码云为例)


资料