Jenkins安装及使用教程

一、jenkins是什么?

​ Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。

二、jenkins安装

1.源码安装jenkins(推荐)

1) 安装java

https://blog.nevergiveup.tech/post/dev_language/java/java%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/

2) war安装

  • 下载 Jenkins.

    1
    2
    
    mkdir -p /root/jenkins-data && cd /root/jenkins-data
    wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war/latest/jenkins.war
    
  • 配置

    1
    2
    3
    4
    5
    6
    
    vim /etc/profile
    [添加内容]
    export JENKINS_HOME=/root/jenkins-data
    export JENKINS_LOGFILE=/root/jenkins-data/jenkins.log
    
    source /etc/profile
    
  • 运行命令jenkins

    1
    2
    3
    
    java -Xms128m -Xmx256m -jar /root/jenkins-data/jenkins.war --httpPort=9090
    
    nohup java -Xms128m -Xmx256m -jar /root/jenkins-data/jenkins.war --httpPort=9090 > /root/jenkins-data/jenkins.log 2>&1 &
    
  • 提供一个jenkins启动脚本,可以自行修改

    脚本保存至/root/jenkins.sh,使用方法:

    1
    2
    3
    
    vim /root/jenkins.sh #新建文件保存脚本内容
    chmod 777 /root/jenkins.sh
    sh jenkins.sh start|stop|restart
    

    脚本内容如下:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    
    #!/bin/bash
    
    # 在执行过程中若遇到使用了未定义的变量或命令返回值为非零,将直接报错退出
    set -eu
    
    # 检查参数个数
    if [ "${#}" -lt 1 ]; then
    	echo " 脚本使用示例: sh jenkins.sh start|stop|restart "
    	exit
    fi
    
    # 获取脚本第一个参数
    APP_OPT=${1}
    # 端口
    APP_PORT=9090
    # 名称
    APP_NAME=jenkins
    # jar名 | war名
    APP_JAR=${APP_NAME}.war
    # 程序根目录
    APP_JAR_HOME=/root/jenkins-data
    # 日志名
    APP_LOG_NAME=jenkins-run
    # 日志根目录
    APP_LOG_HOME=/root/jenkins-data
    # 程序运行参数
    JAVA_OPTS="--httpPort=${APP_PORT}"
    
    echo "本次操作服务名:[${APP_NAME}]"
    echo "本次操作选择:[${APP_OPT}]"
    
    # 停止
    function stop(){
      echo "<-------------------------------------->"
      echo "[${APP_NAME}] ... stop ..."
      # 查看该jar进程
      pid=`ps -ef | grep ${APP_NAME} | grep -v 'grep' | awk '{print $2}'`
      echo "[${APP_NAME}] pid="${pid}
      # 存在则kill,不存在打印一下吧
      if [ "${pid}" ]; then
        kill -9 ${pid}
        # 检查kill是否成功
        if [ "$?" -eq 0 ]; then
            echo "[${APP_NAME}] stop success"
        else
            echo "[${APP_NAME}] stop fail"
        fi
      else
        echo "[${APP_NAME}] 进程不存在"
      fi
    }
    
    
    # 运行
    function start(){
      echo "<-------------------------------------->"
      echo "[${APP_NAME}] ... start ..."
      cd ${APP_JAR_HOME}
      echo "当前路径:`pwd`"
      # 赋予可读可写可执行权限
      chmod 777 ${APP_JAR}
      echo "启动命令: nohup java -jar ${APP_JAR} ${JAVA_OPTS} >> ${APP_LOG_HOME}/${APP_LOG_NAME}.log 2>&1 &"
      nohup java -jar ${APP_JAR} ${JAVA_OPTS} >> ${APP_LOG_HOME}/${APP_LOG_NAME}.log 2>&1 &
      if [ "$?" -eq 0 ]; then
        echo "[${APP_NAME}] start success"
      else
        echo "[${APP_NAME}] start fail"
      fi
    }
    
    
    # 重启
    function restart(){
      echo "<-------------------------------------->"
      echo "[${APP_NAME}] ... restart ..."
    	stop
    	start
    }
    
    
    # 多分支条件判断执行参数
    case "${APP_OPT}" in
    	"stop")
    		stop
    		;;
    	"start")
    		start
    		;;
    	"restart")
    		restart
    		;;
    	*)
    	echo " 提示:不支持参数 命令 -> ${APP_OPT}"
    	;;
    esac
    

3) rpm安装

  • 下载安装

    1
    2
    3
    
    cd /data/tools
    wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.332.1-1.1.noarch.rpm
    rpm -ivh jenkins-2.332.1-1.1.noarch.rpm
    
  • 默认配置文件位置

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    JENKINS_WAR="/usr/share/java/jenkins.war"
    JENKINS_CONFIG="/etc/sysconfig/jenkins"
    JENKINS_PID_FILE="/var/run/jenkins.pid"
    JENKINS_LOCKFILE="/var/lock/subsys/jenkins"
    JENKINS_DAEMON="/etc/init.d/jenkins"
    JENKINS_LOGFILE="/var/log/jenkins/jenkins.log"   
    
    [root@node1 /data]# rpm -ql jenkins
    /etc/init.d/jenkins
    /etc/logrotate.d/jenkins
    /etc/sysconfig/jenkins
    /usr/bin/jenkins
    /usr/lib/systemd/system/jenkins.service
    /usr/sbin/rcjenkins
    /usr/share/java/jenkins.war
    /usr/share/jenkins
    /usr/share/jenkins/migrate
    /var/cache/jenkins
    /var/lib/jenkins
    /var/log/jenkins
    
  • 配置修改

    修改jenkins本身配置

    1
    2
    3
    4
    5
    6
    
    cp /etc/sysconfig/jenkins /etc/sysconfig/jenkins.bak
    vim /etc/sysconfig/jenkins
    [修改内容]
    JENKINS_HOME="/root/jenkins-data" #设置工作目录
    JENKINS_USER="root" #设置jenkins用户为root
    JENKINS_PORT="9090" #设置访问端口为9090
    

    修改jenkins启动文件配置,修改java命令路径

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    [root@node1 /data/tools]# which java
    /usr/local/java/bin/java
    
    [root@node1 /data/tools]# vim /etc/init.d/jenkins
    [root@node1 /data/tools]# vim /etc/rc.d/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-11.0/bin/java
    /usr/lib/jvm/jre-11.0/bin/java
    /usr/lib/jvm/java-11-openjdk-amd64
    /usr/bin/java
    /usr/local/java/bin/java   #新增行
    "
    
    systemctl daemon-reload 
    service jenkins start
    
  • 设置开机启动

    1
    
    systemctl enable jenkins
    
  • 开启关闭jenkins服务

    1
    
    systemctl start/stop/restart jenkins
    

4) yum安装(推荐)

  • 下载安装

    1
    2
    3
    
    [root@localhost ~]# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
    [root@localhost ~]# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
    [root@localhost ~]# yum -y install jenkins
    
  • 默认配置文件位置

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    # WAR包 
    /usr/lib/jenkins/jenkins.war    
    # 配置文件, 修改用户为:root
    /etc/sysconfig/jenkins      
    # 默认的JENKINS_HOME目录
    /var/lib/jenkins/       
    # Jenkins日志文件
    /var/log/jenkins/jenkins.log   
    
    [root@node1 /data]# rpm -ql jenkins
    /etc/init.d/jenkins
    /etc/logrotate.d/jenkins
    /etc/sysconfig/jenkins
    /usr/bin/jenkins
    /usr/lib/systemd/system/jenkins.service
    /usr/sbin/rcjenkins
    /usr/share/java/jenkins.war
    /usr/share/jenkins
    /usr/share/jenkins/migrate
    /var/cache/jenkins
    /var/lib/jenkins
    /var/log/jenkins
    
  • 配置修改

    1
    2
    3
    4
    5
    6
    
    cp /etc/sysconfig/jenkins /etc/sysconfig/jenkins.bak
    vim /etc/sysconfig/jenkins
    [修改内容]
    JENKINS_HOME="/root/jenkins-data" #设置工作目录
    JENKINS_USER="root" #设置jenkins用户为root
    JENKINS_PORT="9090" #设置访问端口为9090
    
  • 启动并设置开机启动

    1
    2
    
    service jenkins start
    chkconfig jenkins on
    

2.docker安装jenkins

1) 拉取镜像

建议使用的Docker映像是jenkinsci/blueocean image(来自 the Docker Hub repository)。 该镜像包含当前的长期支持 (LTS) 的Jenkins版本 (可以投入使用) ,捆绑了所有Blue Ocean插件和功能。这意味着你不需要单独安装Blue Ocean插件。

1
docker pull jenkinsci/blueocean

2) 运行容器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
docker run \
-u root \
-d \
-p 9090:8080 \
-p 50000:50000 \
--privileged=true -e TZ="Asia/Shanghai" \
-v /root/docker/jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins-blueocean \
jenkinsci/blueocean

3) 容器操作

1
2
3
4
#访问Jenkins / Blue Ocean Docker容器
docker exec -it jenkins-blueocean bash
#通过Docker日志访问Jenkins控制台日志
docker logs jenkins-blueocean

4) 容器内安装软件

1
2
3
#进入容器
docker exec -it jenkins-blueocean bash
#安装软件

3.初始化jenkins

访问 http://{主机ip}:8080 进行Post-installation setup wizard安装

  • 修改jenkins的插件下载源

    1
    2
    3
    4
    5
    6
    
    [root@node1 ~]# cd /root/docker/jenkins-data/updates/
    [root@node1 ~/jenkins-data/updates]# ls
    default.json  hudson.tasks.Maven.MavenInstaller
    [root@node1 ~/jenkins-data/updates]# cp default.json default.json.bak
    [root@node1 ~/jenkins-data/updates]# sudo sed -i 's#updates.jenkins.io/download/plugins#mirrors.tuna.tsinghua.edu.cn/jenkins/plugins#g' default.json && sudo sed -i 's#www.google.com#www.baidu.com#g' default.json
    [root@node1 ~/jenkins-data/updates]#
    
  • 重启jenkins

    1
    2
    3
    
    systemctl restart jenkins
    #docker 安装:
    docker restart jenkins-blueocean
    
  • 解锁 Jenkins

    页面上显示的密码文件路径是容器内的,因为做了文件夹映射,替换为主机地址即可

    1
    2
    3
    4
    
    [root@node1 ~]# cd /root/docker/jenkins-data
    [root@node1 ~/jenkins-data]# cat secrets/initialAdminPassword
    12889e7f0fa94aafbcc2f83081ec0475
    [root@node1 ~/jenkins-data]#
    
  • 选择“Install suggested plugins”安装默认的插件

    等待系统安装插件完成

  • 下载完成之后会进入一个创建账号的界面,这里自己创建一个就行,后续登录就用这个账号。

三、jenkins配置

1.管理系统配置

进入管理Jenkins–>系统配置

2.流水线配置

  • 创建流水线job,配置名称

  • 设置流水线代码

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    pipeline {
        agent any
        stages {
            stage('Build') {
                steps {
                    sh 'cd /workspace/srv-gw-infinity/build'
                    sh 'sh build.sh'
                }
            }
        }
        post {
            always {
                echo 'This will always run'
            }
            success {
                echo 'This will run only if successful'
            }
            failure {
                echo 'This will run only if failed'
            }
            unstable {
                echo 'This will run only if the run was marked as unstable'
            }
            changed {
                echo 'This will run only if the state of the Pipeline has changed'
                echo 'For example, if the Pipeline was previously failing but is now successful'
            }
        }
    }
    

3.设置自定义风格工程配置

  • 设置git

  • 设置构建ssh

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    #局部变量(执行文件名称)
    project_name="infi-srv-gw"
    #1.杀掉之前正在运行的程序
    go_id=`ps -ef|grep "./${project_name}" |grep -v "grep" | awk '{print $2}'`
    if [ -z "$go_id" ];
    then
        echo "[go pid not found]"
    else
    	#杀掉进程
        kill -9 $go_id
        echo "killed $go_id"
    fi
    #2.清除旧的编译文件
    echo "clean old file"
    rm -rf ${WORKSPACE}/build/bin/${project_name}
    rm -rf ${WORKSPACE}/build/bin/${project_name}.log
    #3.进入工作目录,构建工作
    cd  ${WORKSPACE}
    pwd
    go version
    go mod tidy
    cd build
    sh build.sh
    ls bin
    #4.运行构建后的文件
    cd  ${WORKSPACE}/build/bin
    if [ -f "${project_name}" ]; then
        echo "strat new process"
        chmod 777 ${project_name}
        #这里要防止nohup不执行,添加了一个BUILD_ID
        BUILD_ID=DONTKILLME nohup ./${project_name} >${project_name}.log 2>&1 &
    else
    echo "executable file not found,quit"
    fi