BluePen BluePen
  • Jenkins
  • OS
  • 算法
随笔
分类
标签
归档
关于
留言板
GitHub (opens new window)

Alex

一个好人
  • Jenkins
  • OS
  • 算法
随笔
分类
标签
归档
关于
留言板
GitHub (opens new window)
  • Jenkins 安装
    • 最简单的安装方式
    • 安装为服务
    • docker 安装
    • 参考文档
  • Jenkins 权限控制
  • Jenkins 环境变量
  • 流水线语法
  • 流水线任务
  • Jenkins 邮件通知
  • Jenkins 参数化构建
  • Jenkins 使用 FTP插件上传文件
  • Jenkins 使用提交信息
  • Jenkins 执行命令和脚本
  • 多分支流水线插件
  • Jenkins REST api
  • Jenkins 踩坑总结
  • Jenkins
Alex
2019-04-05
目录

Jenkins 安装

Jenkins 的安装不是一个很难得事情,官网也有安装文档 (opens new window)。

but, 有点小问题:

  • Docker的方式,不是很熟的话后续维护成问题。
  • linux下载整个 Jenkins包太慢了,而且很多时候并没用外网环境
  • windows下安装是最简单的,没毛病,但也用的很少😂

本文记录下 linux下手动安装的方式,总的来说其实就两步:

  1. 安装 Java
  2. 下载 Jenkins,使用 Java启动 Jenkins

-> 最简单的安装方式

  • 将最新的稳定Jenkins WAR包 (opens new window) 下载到您计算机上的相应目录。
    • 其他下载地址见 https://jenkins.io/zh/download/ (opens new window)
  • 在下载的目录内打开一个终端/命令提示符窗口到。
  • 运行命令 java -jar jenkins.war
  • 浏览http://localhost:8080并等到Unlock Jenkins页面出现。
  • 后续升级更新 war包版本即可 该方式默认 Java已安装完成。下载速度稍微能让人接受。

-> 安装为服务

直接以上文的方式安装没有问题,但停止和重启不够优雅,比较推荐的方式是安装为jenkins 服务,并设置开机启动。

如果是使用的 init.d (centos 6),最终期望的使用方式是这样的:

  • 启动:service jenkins start
  • 查看状态:service jenkins status
  • 重启: service jenkins restart
  • 停止: service jenkins stop
  • 设置开机启动: chkconfig --add jenkins
  • 取消开机启动: chkconfig --del jenkins

如果是使用的 systemd (centos 7),使用方式则是:

  • 启动:systemctl start jenkins
  • 查看状态:systemctl status jenkins
  • 重启: systemctl restart jenkins
  • 停止: systemctl stop jenkins
  • 设置开机启动:systemctl enable jenkins
  • 取消开机启动:systemctl disable jenkins

具体实现如下:

-> 以守护进程的方式

  1. 新建一个 jenkins用户,使用该用户来启动服务
    sudo useradd jenkins
    
    1

    提示

    该步骤非必须,有人喜欢用 root或个人账户也可以,只是推荐

  2. 编写 Jenkin 配置文件
    • 配置文件路径定为 /etc/sysconfig/jenkins
    # Jenkins system configuration
    JENKINS_HOME=/home/jenkins
    JENKINS_USER=jenkins
    JENKINS_LOG=/home/jenkins/jenkins.log
    JENKINS_JAVA=/usr/bin/java
    JENKINS_JAVAOPTS="-Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Shanghai \
        -Duser.timezone=Asia/Shanghai -Dfile.encoding=UTF-8 -Djava.awt.headless=true"
    JENKINS_IP=0.0.0.0
    JENKINS_PORT=8080
    JENKINS_ARGS=""
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    • 给该文件添加可执行权限 sudo chmod +x /etc/sysconfig/jenkins
    • 设置 /home/jenkins为 jenkins工作目录, 并设置为全局环境变量 JENKINS_HOME
      • 编辑文件 /etc/profile, 追加以下内容
        export JENKINS_HOME=/home/jenkins
        
        1
      • source /etc/profile 使环境变量生效
    • 将下载的 jenkins.war 资源文件放在 jenkins工作目录

    注意

    确保 JENKINS_USER 对 JENKINS_HOME 有读写权限

  3. 在 jenkins工作目录编写启动脚本 start-jenkins.sh
    #!/bin/bash
    
    # import sysconfig settings and set defaults
    [ -f /etc/sysconfig/jenkins ] && . /etc/sysconfig/jenkins
    
    JENKINS_WAR=${JENKINS_HOME}/jenkins.war
    
    # check for config errors
    JENKINS_ERRORS=()
    [ ! -f ${JENKINS_WAR} ] &&
      JENKINS_ERRORS[${#JENKINS_ERRORS[*]}]="JENKINS_HOME : The jenkins.war could not be found at ${JENKINS_HOME}/jenkins.war"
    [ ! -f $JENKINS_JAVA ] &&
      JENKINS_ERRORS[${#JENKINS_ERRORS[*]}]="JENKINS_JAVA : The java executable could not be found at $JENKINS_JAVA"
    
    # display errors if there are any, otherwise start the process
    if [ ${#JENKINS_ERRORS[*]} != '0' ]
    then
      echo "CONFIGURATION ERROR:"
      echo "    The following errors occurred when starting Jenkins."
      echo "    Please set the appropriate values at /etc/sysconfig/jenkins"
      echo ""
      for (( i=0; i<${#JENKINS_ERRORS[*]}; i++ ))
      do
        echo "${JENKINS_ERRORS[${i}]}"
      done
      echo ""
      exit 1
    else
      echo "starting service"
      echo "nohup nice $JENKINS_JAVA $JENKINS_JAVAOPTS -jar $JENKINS_WAR --httpListenAddress=$JENKINS_IP --httpPort=$JENKINS_PORT $> $JENKINS_LOG 2>&1 &"
      nohup nice $JENKINS_JAVA $JENKINS_JAVAOPTS -jar $JENKINS_WAR --httpListenAddress=$JENKINS_IP --httpPort=$JENKINS_PORT $> $JENKINS_LOG 2>&1 &
    fi
    
    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

    提示

    此时该脚本就可启动 jenkins,通过读取配置文件,并使用nohup以守护进程的方式启动,只是不是一个系统服务

  4. 在 jenkins工作目录编写停止脚本 stop-jenkins.sh
    #!/bin/bash
    kill `ps -ef | grep [j]enkins.war | awk '{ print $2 }'`
    
    1
    2
  5. 安装为服务并设置为开机启动
    • 编写服务脚本,路径为 /etc/init.d/jenkins
    #! /bin/bash
    # chkconfig: 2345 90 10
    # description: Jenkins Continuous Integration server
    
    # Source function library.
    . /etc/rc.d/init.d/functions
    
    # Get network sysconfig.
    . /etc/sysconfig/network
    
    # Check that networking is up, otherwise we can't start
    [ "${NETWORKING}" = "no" ] && exit 0
    
    # Get the Jenkins sysconfig
    [ -f /etc/sysconfig/jenkins ] && . /etc/sysconfig/jenkins
    
    startup=${JENKINS_HOME}/start-jenkins.sh
    shutdown=${JENKINS_HOME}/stop-jenkins.sh
    
    start(){
      echo -n $"Starting Jenkins service: "
      pid=`ps -ef | grep [j]enkins.war | grep -v grep | wc -l`
      if [ $pid -gt 0 ]; then
        echo "Jenkins is already running"
        exit 1
      fi
      su - $JENKINS_USER -c $startup
      RETVAL=$?
      [ $RETVAL == 0 ] &&
        echo "Jenkins was started successfully." ||
        echo "There was an error starting Jenkins."
    }
    
    stop(){
      action $"Stopping Jenkins service: "
      pid=`ps -ef | grep [j]enkins.war | grep -v grep | wc -l`
      if [ ! $pid -gt 0 ]; then
        echo "Jenkins is not running"
        exit 1
      fi
      su - $JENKINS_USER -c $shutdown
      RETVAL=$?
      [ $RETVAL == 0 ] &&
        echo "Jenkins was stopped successfully." ||
        echo "There was an error stopping Jenkins."
    }
    
    status(){
      pid=`ps -ef | grep [j]enkins.war | grep -v grep | wc -l`
      if [ $pid -gt 0 ]; then
        echo "Jenkins is running..."
      else
        echo "Jenkins is stopped..."
      fi
    }
    
    restart(){
      stop
      sleep 5
      start
    }
    
    # Call functions as determined by args.
    case "$1" in
    start)
      start;;
    stop)
      stop;;
    status)
      status;;
    restart)
      restart;;
    *)
      echo $"Usage: $0 {start|stop|status|restart}"
      exit 1
    esac
    
    exit 0
    
    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
    • 给启动脚本,停止脚本,服务脚本添加执行权限
    chmod a+x /home/jenkins/start-jenkins.sh
    chmod a+x /home/jenkins/stop-jenkins.sh
    chmod a+x /etc/init.d/jenkins
    
    1
    2
    3

到这里即可运行 service jenkins start命令启动 jenkins服务了

-> systemd 服务

centos 7已经使用 systemd来做系统初始化了,在 centos 7等系统上安装服务上面的方式不适用,但很多地方可以复用。

前面的步骤相同,还需额外创建 systemd的服务脚本, 脚本路径为 /lib/systemd/system/jenkins.service

[Unit]  
Description=Jenkins Continuous Integration server  
After=network.target  

[Service]  
ExecStart=/etc/init.d/jenkins start  
ExecReload=/etc/init.d/jenkins restart  
ExecStop=/etc/init.d/jenkins stop  
Restart=on-failure

[Install]  
WantedBy=multi-user.target  
1
2
3
4
5
6
7
8
9
10
11
12

提示

修改 service文件后需运行命令 sudo systemctl daemon-reload使生效

如果使这样运行启动命令 systemctl start jenkins, 再通过 systemctl status jenkins查看服务会发现 jenkins服务启动成功后立刻停止。

StackOverflow 了以下,似懂非懂,大概是 systemd管理进程的方式已经变了,如果还是用之前的守护进程的方式启动,systemd无法获取它的状态信息。
因此,解决方案也很简单,将启动方式改成普通的进程启动方式即可,不再使用 nohup即可解决该问题。

即,将 start-jenkins.sh 脚本的第 31行,从

nohup nice $JENKINS_JAVA $JENKINS_JAVAOPTS -jar $JENKINS_WAR --httpListenAddress=$JENKINS_IP --httpPort=$JENKINS_PORT $> $JENKINS_LOG 2>&1 &
1

改为

$JENKINS_JAVA $JENKINS_JAVAOPTS -jar $JENKINS_WAR --httpListenAddress=$JENKINS_IP --httpPort=$JENKINS_PORT $> $JENKINS_LOG 2>&1
1

即可。
并且还收获了意外退出可自动重启的功能,确实功能更强大了。

-> docker 安装

https://github.com/jenkinsci/docker/blob/master/README.md (opens new window)

-> 参考文档

  • install jenkins as a service on centos6 (opens new window)
  • systemd service faq (opens new window)
编辑此页 (opens new window)
更新于: 2019-04-05
Jenkins 权限控制

Jenkins 权限控制→

Copyright © 2019-2022 | yxxy | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式