乐于分享
好东西不私藏

Jenkins 部署文档(war包模式)

Jenkins 部署文档(war包模式)

一、文档介绍

本文档详细描述 Jenkins war 包方式部署步骤

二、部署说明

  • 操作系统:Linux(CentOS 7.6)
  • 安装包版本:Jenkins 2.479.2

三、下载

(一) jenkins

国内下载地址:

https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/

cd /usr/local/srcwget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.479.2/jenkins.war

(二) jdk

由于 Jenkins 最新版本原因,推荐使用 JDK17 以上版本,所以本文档中使用 JDK21。

官网下载地址:

https://www.oracle.com/java/technologies/downloads/#java21

注意:由于 oracle 官网下载安装包需要认证,所以无法直接通过命令下载 ;所以请通过上述地址下载最新 JDK 安装包,请上传到服务器的 /usr/local/src 目录 。

四、安装依赖包

yum install fontconfig -y

五、安装

(一) jdk

cd /usr/local/srctar zxf jdk-21_linux-x64_bin.tar.gzmv jdk-21.0.3 /usr/local/cd /usr/local/ln -s jdk-21.0.3 jdkcat <<"EOF" >> /etc/profile# jdkexport JAVA_HOME=/usr/local/jdkexport CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jarexport PATH=$JAVA_HOME/bin:$PATHEOFsource /etc/profilejava -version

(二) jenkins

cd /usr/localmkdir -p jenkins-2.479.2mv src/jenkins.war jenkins-2.479.2ln -s jenkins-2.479.2 jenkins

创建启动脚本

cd /usr/local/jenkins/cat <<"EOF" | tee jenkins#!/bin/shdie() {        echo "$(basename "$0"): $*" >&2        exit 1}check_env() {        required=true        for var in "$@"do                if [ "${var}" = '--' ]; then                        required=false                        continue                fi                val=$(eval echo "\$${var}")                if $required && [ -z "${val}" ]; then                        die "check_env: ${var} must be non-empty"                fi        done}infer_java_cmd() {        if [ -n "${JENKINS_JAVA_CMD}" ] && [ -x "${JENKINS_JAVA_CMD}" ]; then                return 0        fi        if [ -n "${JAVA_HOME}" ] && [ -x "${JAVA_HOME}/bin/java" ]; then                JENKINS_JAVA_CMD="${JAVA_HOME}/bin/java"                return 0        fi        JENKINS_JAVA_CMD="$(command -v java)" || return "$?"}infer_jenkins_opts() {        inferred_jenkins_opts=""        if [ -n "${JENKINS_WEBROOT}" ]; then                inferred_jenkins_opts="${inferred_jenkins_opts} --webroot='${JENKINS_WEBROOT}'"        fi        if [ -n "${JENKINS_LOG}" ]; then                inferred_jenkins_opts="${inferred_jenkins_opts} --logfile='${JENKINS_LOG}'"        fi        if [ -n "${JENKINS_PORT}" ]; then                inferred_jenkins_opts="${inferred_jenkins_opts} --httpPort=${JENKINS_PORT}"        fi        if [ -n "${JENKINS_LISTEN_ADDRESS}" ]; then                inferred_jenkins_opts="${inferred_jenkins_opts} --httpListenAddress=${JENKINS_LISTEN_ADDRESS}"        fi        if [ -n "${JENKINS_UNIX_DOMAIN_PATH}" ]; then                inferred_jenkins_opts="${inferred_jenkins_opts} --httpUnixDomainPath=${JENKINS_UNIX_DOMAIN_PATH}"        fi        if [ -n "${JENKINS_HTTPS_PORT}" ]; then                inferred_jenkins_opts="${inferred_jenkins_opts} --httpsPort=${JENKINS_HTTPS_PORT}"        fi        if [ -n "${JENKINS_HTTPS_LISTEN_ADDRESS}" ]; then                inferred_jenkins_opts="${inferred_jenkins_opts} --httpsListenAddress=${JENKINS_HTTPS_LISTEN_ADDRESS}"        fi        if [ -n "${JENKINS_HTTPS_KEYSTORE}" ]; then                inferred_jenkins_opts="${inferred_jenkins_opts} --httpsKeyStore='${JENKINS_HTTPS_KEYSTORE}'"        fi        if [ -n "${JENKINS_HTTPS_KEYSTORE_PASSWORD}" ]; then                inferred_jenkins_opts="${inferred_jenkins_opts} --httpsKeyStorePassword='${JENKINS_HTTPS_KEYSTORE_PASSWORD}'"        fi        if [ -n "${JENKINS_HTTP2_PORT}" ]; then                inferred_jenkins_opts="${inferred_jenkins_opts} --http2Port=${JENKINS_HTTP2_PORT}"        fi        if [ -n "${JENKINS_HTTP2_LISTEN_ADDRESS}" ]; then                inferred_jenkins_opts="${inferred_jenkins_opts} --http2ListenAddress=${JENKINS_HTTP2_LISTEN_ADDRESS}"        fi        if [ -n "${JENKINS_DEBUG_LEVEL}" ] && [ "${JENKINS_DEBUG_LEVEL}" -ne 5 ]; then                inferred_jenkins_opts="${inferred_jenkins_opts} --debug=${JENKINS_DEBUG_LEVEL}"        fi        if [ -n "${JENKINS_PREFIX}" ]; then                inferred_jenkins_opts="${inferred_jenkins_opts} --prefix='${JENKINS_PREFIX}'"        fi        if [ -n "${JENKINS_OPTS}" ]; then                inferred_jenkins_opts="${inferred_jenkins_opts}${JENKINS_OPTS}"        fi        if [ -n "${JENKINS_ENABLE_ACCESS_LOG}" ] && $JENKINS_ENABLE_ACCESS_LOGthen                inferred_jenkins_opts="${inferred_jenkins_opts} --accessLoggerClassName=winstone.accesslog.SimpleAccessLogger"                inferred_jenkins_opts="${inferred_jenkins_opts} --simpleAccessLogger.format=combined"                inferred_jenkins_opts="${inferred_jenkins_opts} --simpleAccessLogger.file='/var/log/jenkins/access_log'"        fi}main() {        if [ -n "${JENKINS_HOME}" ]; then                [ -d "${JENKINS_HOME}" ] || die "${JENKINS_HOME} is not a directory"        fi        [ -f "${JENKINS_WAR}" ] || die "${JENKINS_WAR} is not a file"        infer_java_cmd || die 'failed to find a valid Java installation'        infer_jenkins_opts        java_opts_tmp="${JAVA_OPTS}"        unset JAVA_OPTS        unset JENKINS_DEBUG_LEVEL        unset JENKINS_ENABLE_ACCESS_LOG        unset JENKINS_HTTP2_LISTEN_ADDRESS        unset JENKINS_HTTP2_PORT        unset JENKINS_HTTPS_KEYSTORE        unset JENKINS_HTTPS_KEYSTORE_PASSWORD        unset JENKINS_HTTPS_LISTEN_ADDRESS        unset JENKINS_HTTPS_PORT        java_cmd="${JENKINS_JAVA_CMD}"        unset JENKINS_JAVA_CMD        unset JENKINS_UNIX_DOMAIN_PATH        unset JENKINS_LISTEN_ADDRESS        unset JENKINS_LOG        unset JENKINS_OPTS        unset JENKINS_PORT        unset JENKINS_PREFIX        jenkins_war_tmp="${JENKINS_WAR}"        unset JENKINS_WAR        unset JENKINS_WEBROOT        eval exec \                "${java_cmd}" \                ${java_opts_tmp} \                -jar "${jenkins_war_tmp}" \                ${inferred_jenkins_opts}}if [ -z "${JENKINS_OPTS}" ]; then        JENKINS_OPTS="$*"else        JENKINS_OPTS="${JENKINS_OPTS} $*"fiif [ -z "${JENKINS_WAR}" ]; then        JENKINS_WAR=/usr/share/java/jenkins.warficheck_env \        JENKINS_WAR \        -- \        JAVA_HOME \        JENKINS_DEBUG_LEVEL \        JENKINS_ENABLE_ACCESS_LOG \        JENKINS_HOME \        JENKINS_HTTP2_LISTEN_ADDRESS \        JENKINS_HTTP2_PORT \        JENKINS_HTTPS_KEYSTORE \        JENKINS_HTTPS_KEYSTORE_PASSWORD \        JENKINS_HTTPS_LISTEN_ADDRESS \        JAVA_OPTS \        JENKINS_HTTPS_PORT \        JENKINS_JAVA_CMD \        JENKINS_UNIX_DOMAIN_PATH \        JENKINS_LISTEN_ADDRESS \        JENKINS_LOG \        JENKINS_OPTS \        JENKINS_PORT \        JENKINS_PREFIX \        JENKINS_WEBROOTmainexit 0EOFchmod +x /usr/local/jenkins/jenkins

六、创建目录

mkdir -p /data/jenkins_data/{conf,data,tmp}mkdir -p /data/logs/jenkins/

七、修改配置文件

cd /data/jenkins_data/confcat <<EOF | tee jenkins.confJAVA_HOME=/usr/local/jdkJENKINS_WAR=/usr/local/jenkins/jenkins.warJENKINS_HOME=/data/jenkins_data/dataJENKINS_PORT=8080JENKINS_PREFIX=/jenkinsJENKINS_LOG=/data/logs/jenkins/jenkins.logJENKINS_OPTS="-Djava.io.tmpdir=/data/jenkins_data/tmp"EOF

Jenkins 配置变量说明:

变量
默认值
说明
JENKINS_WAR
/usr/share/java/jenkins.war
Jenkins war 包路径
JENKINS_WEBROOT
%C/jenkins/war
Jenkins 运行时生成的 WEB 目录
JENKINS_LOG
%L/jenkins/jenkins.log
日志目录
JAVA_OPTS
JAVA 程序启动扩展参数
JAVA_HOME
JAVA_HOME
JENKINS_JAVA_CMD
运行 Jenkins 的 java 路径
JENKINS_UNIX_DOMAIN_PATH
/run/jenkins/jenkins.socket
Jenkins unix 路径
JENKINS_LISTEN_ADDRESS
0.0.0.0
监听地址
JENKINS_PORT
8080
监听端口
JENKINS_HTTPS_LISTEN_ADDRESS
0.0.0.0
HTTPS监听地址
JENKINS_HTTPS_PORT
443
HTTPS监听端口
JENKINS_HTTPS_KEYSTORE
/path/to/keystore.jks
HTTPS keystore 路径
JENKINS_HTTP2_LISTEN_ADDRESS
HTTP2 监听地址
JENKINS_HTTP2_PORT
HTTP2 监听端口
JENKINS_DEBUG_LEVEL
5
日志等级
JENKINS_ENABLE_ACCESS_LOG
false
是否开启访问日志
JENKINS_PREFIX
/
URL 访问路径

八、创建服务

cd /data/jenkins_data/cat <<EOF | teejenkins.service[Unit]Description=Jenkins Continuous Integration ServerRequires=network.targetAfter=network.targetStartLimitBurst=5StartLimitIntervalSec=5m[Service]User=rootGroup=rootType=notifyNotifyAccess=mainWorkingDirectory=/usr/local/jenkinsEnvironmentFile=-/data/jenkins_data/conf/jenkins.confExecStart=/usr/local/jenkins/jenkinsExecStartPre=/bin/sleep 10Restart=on-failureSuccessExitStatus=143[Install]WantedBy=multi-user.targetEOFcp jenkins.service /usr/lib/systemd/system/jenkins.service

九、启动服务

systemctl daemon-reloadsystemctl enable jenkins --nowsystemctl status jenkins

十、jenkins 初始化

服务启动成功后,通过浏览器访问

http://127.0.0.1:8080/jenkins/

注意:IP 地址和端口需根据实际情况进行替换。

(一) 修改配置为国内镜像

修改内容:

  1. Jenkins 默认去探测谷歌来校验网络情况,不通则会进入到离线部署界面;
  2. Jenkins 插件或更新包,默认从 Jenkins 官网下载,速度较慢;

根据上述修改点,将 default.json 配置中的地址替换为国内源

cd /data/jenkins_data/data/updatessed -i 's#https://updates.jenkins.io/download/#https://mirrors.tuna.tsinghua.edu.cn/jenkins/#g' default.json sed -i 's/www.google.com/www.baidu.com/g' default.jsonchattr +i default.json# 重启systemctl restart jenkins

注意:修改配置后需要重启 Jenkins 生效,但是重启后配置又会被还原,所以 chattr +i 操作非常关键,此命令会锁定文件,不允许修改。

(二) 输入初始化密码

Jenkins 启动时会设置一个随机密码,根据配置生成密码路径;查看该路径文件,输入密码进入下一步。

(三) 安装推荐的插件

(四) 创建新的管理员

(五)  配置实例

(六) 开始使用 Jenkins