第2章 安装部署与环境配置

发布于:2025-09-06 ⋅ 阅读:(21) ⋅ 点赞:(0)

2.1 系统要求与准备

硬件要求

最小配置:

  • CPU:1核心
  • 内存:512MB RAM
  • 存储:1GB可用空间
  • 网络:基本网络连接

推荐配置:

  • CPU:2核心以上
  • 内存:4GB RAM以上
  • 存储:50GB可用空间(SSD推荐)
  • 网络:高速网络连接

生产环境配置:

  • CPU:4核心以上
  • 内存:8GB RAM以上
  • 存储:100GB以上(SSD)
  • 网络:千兆网络
  • 备份:定期备份策略

软件要求

Java环境:

  • Java 11或更高版本(推荐OpenJDK)
  • 支持的Java版本:11, 17, 21
  • 不再支持Java 8

操作系统支持:

  • Linux:Ubuntu 18.04+, CentOS 7+, RHEL 7+
  • Windows:Windows 10+, Windows Server 2016+
  • macOS:macOS 10.14+
  • Docker:支持容器化部署

浏览器要求:

  • Chrome 90+
  • Firefox 88+
  • Safari 14+
  • Edge 90+

网络和防火墙配置

端口要求:

# Jenkins默认端口
8080/tcp    # Web界面
50000/tcp   # Agent连接端口(JNLP)

# 可选端口
8443/tcp    # HTTPS(如果配置)
22/tcp      # SSH Agent连接

防火墙配置示例:

# Ubuntu/Debian
sudo ufw allow 8080/tcp
sudo ufw allow 50000/tcp

# CentOS/RHEL
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --permanent --add-port=50000/tcp
sudo firewall-cmd --reload

2.2 Java环境安装

Linux环境Java安装

Ubuntu/Debian系统:

# 更新包列表
sudo apt update

# 安装OpenJDK 11
sudo apt install openjdk-11-jdk -y

# 验证安装
java -version
javac -version

# 配置JAVA_HOME
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64' >> ~/.bashrc
echo 'export PATH=$PATH:$JAVA_HOME/bin' >> ~/.bashrc
source ~/.bashrc

CentOS/RHEL系统:

# 安装OpenJDK 11
sudo yum install java-11-openjdk-devel -y

# 或者使用dnf (CentOS 8+)
sudo dnf install java-11-openjdk-devel -y

# 验证安装
java -version

# 配置JAVA_HOME
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk' >> ~/.bashrc
echo 'export PATH=$PATH:$JAVA_HOME/bin' >> ~/.bashrc
source ~/.bashrc

使用SDKMAN管理Java版本:

# 安装SDKMAN
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"

# 列出可用Java版本
sdk list java

# 安装特定版本
sdk install java 11.0.19-tem
sdk install java 17.0.7-tem

# 切换Java版本
sdk use java 11.0.19-tem
sdk default java 11.0.19-tem

Windows环境Java安装

下载和安装:

  1. 访问OpenJDK官网
  2. 下载适合的Windows版本
  3. 运行安装程序
  4. 配置环境变量

PowerShell配置:

# 设置JAVA_HOME环境变量
[Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\OpenJDK\jdk-11.0.19", "Machine")

# 添加到PATH
$path = [Environment]::GetEnvironmentVariable("PATH", "Machine")
[Environment]::SetEnvironmentVariable("PATH", "$path;%JAVA_HOME%\bin", "Machine")

# 验证安装
java -version

2.3 Jenkins安装方法

方法一:包管理器安装(推荐)

Ubuntu/Debian:

# 添加Jenkins仓库密钥
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
  /usr/share/keyrings/jenkins-keyring.asc > /dev/null

# 添加Jenkins仓库
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list > /dev/null

# 更新包列表
sudo apt update

# 安装Jenkins
sudo apt install jenkins -y

# 启动Jenkins服务
sudo systemctl start jenkins
sudo systemctl enable jenkins

# 检查服务状态
sudo systemctl status jenkins

CentOS/RHEL:

# 添加Jenkins仓库
sudo wget -O /etc/yum.repos.d/jenkins.repo \
    https://pkg.jenkins.io/redhat-stable/jenkins.repo

# 导入GPG密钥
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key

# 安装Jenkins
sudo yum install jenkins -y

# 启动Jenkins服务
sudo systemctl start jenkins
sudo systemctl enable jenkins

# 检查服务状态
sudo systemctl status jenkins

方法二:WAR文件安装

下载和运行:

# 下载最新版本Jenkins WAR文件
wget https://get.jenkins.io/war-stable/latest/jenkins.war

# 创建Jenkins用户和目录
sudo useradd -m -s /bin/bash jenkins
sudo mkdir -p /var/lib/jenkins
sudo chown jenkins:jenkins /var/lib/jenkins

# 运行Jenkins
sudo -u jenkins java -jar jenkins.war --httpPort=8080 --prefix=/jenkins

# 或者指定JENKINS_HOME
sudo -u jenkins JENKINS_HOME=/var/lib/jenkins java -jar jenkins.war

创建systemd服务:

# 创建服务文件
sudo tee /etc/systemd/system/jenkins.service > /dev/null <<EOF
[Unit]
Description=Jenkins Automation Server
After=network.target

[Service]
Type=simple
User=jenkins
Group=jenkins
ExecStart=/usr/bin/java -jar /opt/jenkins/jenkins.war --httpPort=8080
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

# 重新加载systemd
sudo systemctl daemon-reload
sudo systemctl start jenkins
sudo systemctl enable jenkins

方法三:Docker容器安装

基本Docker运行:

# 拉取Jenkins镜像
docker pull jenkins/jenkins:lts

# 运行Jenkins容器
docker run -d \
  --name jenkins \
  -p 8080:8080 \
  -p 50000:50000 \
  -v jenkins_home:/var/jenkins_home \
  jenkins/jenkins:lts

# 查看初始管理员密码
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

Docker Compose配置:

# docker-compose.yml
version: '3.8'

services:
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins
    restart: unless-stopped
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - JENKINS_OPTS=--prefix=/jenkins
    user: root

volumes:
  jenkins_home:
    driver: local

运行Docker Compose:

# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f jenkins

# 停止服务
docker-compose down

方法四:Kubernetes部署

Helm Chart安装:

# 添加Jenkins Helm仓库
helm repo add jenkins https://charts.jenkins.io
helm repo update

# 创建命名空间
kubectl create namespace jenkins

# 安装Jenkins
helm install jenkins jenkins/jenkins \
  --namespace jenkins \
  --set controller.serviceType=LoadBalancer \
  --set persistence.enabled=true \
  --set persistence.size=20Gi

# 获取管理员密码
kubectl exec --namespace jenkins -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/additional/chart-admin-password && echo

YAML配置文件:

# jenkins-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      containers:
      - name: jenkins
        image: jenkins/jenkins:lts
        ports:
        - containerPort: 8080
        - containerPort: 50000
        volumeMounts:
        - name: jenkins-home
          mountPath: /var/jenkins_home
      volumes:
      - name: jenkins-home
        persistentVolumeClaim:
          claimName: jenkins-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: jenkins
spec:
  selector:
    app: jenkins
  ports:
  - name: web
    port: 8080
    targetPort: 8080
  - name: agent
    port: 50000
    targetPort: 50000
  type: LoadBalancer

2.4 初始配置

首次访问设置

1. 访问Jenkins Web界面:

http://your-server-ip:8080

2. 获取初始管理员密码:

# 包管理器安装
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

# WAR文件安装
cat $JENKINS_HOME/secrets/initialAdminPassword

# Docker安装
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

3. 插件安装选择:

  • 安装推荐插件:适合大多数用户
  • 选择插件安装:自定义插件选择

推荐的基础插件:

# 版本控制
Git plugin
Subversion plugin

# 构建工具
Maven Integration plugin
Gradle plugin
Ant plugin

# 通知
Email Extension plugin
Slack Notification plugin

# 部署
Deploy to container plugin
SSH plugin

# 测试
JUnit plugin
Cobertura plugin

# 安全
LDAP plugin
Role-based Authorization Strategy

管理员用户创建

创建第一个管理员用户:

用户名:admin
密码:强密码(至少8位,包含大小写字母、数字、特殊字符)
确认密码:重复密码
全名:Jenkins Administrator
电子邮件:admin@company.com

实例配置

Jenkins URL配置:

# 生产环境示例
https://jenkins.company.com/

# 开发环境示例
http://jenkins-dev.company.com:8080/

# 本地开发
http://localhost:8080/

2.5 基本系统配置

全局安全配置

访问路径: Manage Jenkins → Configure Global Security

安全域配置:

// Jenkins自带用户数据库
security {
    realm = 'HudsonPrivateSecurityRealm'
    allowUsersToSignUp = false
}

// LDAP集成
security {
    realm = 'LDAPSecurityRealm'
    ldap {
        server = 'ldap://ldap.company.com:389'
        rootDN = 'dc=company,dc=com'
        userSearchBase = 'ou=users'
        userSearch = 'uid={0}'
        groupSearchBase = 'ou=groups'
    }
}

授权策略:

// 基于矩阵的安全
authorization {
    strategy = 'GlobalMatrixAuthorizationStrategy'
    permissions = [
        'hudson.model.Hudson.Administer:admin',
        'hudson.model.Hudson.Read:authenticated',
        'hudson.model.Item.Build:developers',
        'hudson.model.Item.Read:developers'
    ]
}

系统配置

访问路径: Manage Jenkins → Configure System

关键配置项:

  1. Jenkins Location

    Jenkins URL: https://jenkins.company.com/
    System Admin e-mail address: admin@company.com
    
  2. Global properties

    # 环境变量
    JAVA_HOME=/usr/lib/jvm/java-11-openjdk
    MAVEN_HOME=/opt/maven
    GRADLE_HOME=/opt/gradle
    
  3. 邮件通知

    SMTP server: smtp.company.com
    Default user e-mail suffix: @company.com
    Use SMTP Authentication: ✓
    User Name: jenkins@company.com
    Password: [password]
    Use SSL: ✓
    SMTP Port: 465
    

工具配置

访问路径: Manage Jenkins → Global Tool Configuration

JDK配置:

Name: JDK-11
JAVA_HOME: /usr/lib/jvm/java-11-openjdk
Install automatically: ✗

Git配置:

Name: Default
Path to Git executable: /usr/bin/git
Install automatically: ✗

Maven配置:

Name: Maven-3.8
Maven_HOME: /opt/maven
Install automatically: ✓
Version: 3.8.6

Gradle配置:

Name: Gradle-7.6
Gradle_HOME: /opt/gradle
Install automatically: ✓
Version: 7.6

2.6 高级配置

HTTPS配置

生成SSL证书:

# 生成自签名证书(开发环境)
keytool -genkey -keyalg RSA -alias jenkins -keystore jenkins.jks -storepass password -keysize 2048

# 或使用Let's Encrypt(生产环境)
certbot certonly --standalone -d jenkins.company.com

Jenkins HTTPS配置:

# 修改Jenkins启动参数
sudo systemctl edit jenkins

# 添加以下内容
[Service]
Environment="JENKINS_OPTS=--httpPort=-1 --httpsPort=8443 --httpsKeyStore=/var/lib/jenkins/jenkins.jks --httpsKeyStorePassword=password"

# 重启服务
sudo systemctl restart jenkins

反向代理配置

Nginx配置:

# /etc/nginx/sites-available/jenkins
server {
    listen 80;
    server_name jenkins.company.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name jenkins.company.com;

    ssl_certificate /etc/ssl/certs/jenkins.crt;
    ssl_certificate_key /etc/ssl/private/jenkins.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        
        # WebSocket support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        # Timeouts
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

Apache配置:

# /etc/apache2/sites-available/jenkins.conf
<VirtualHost *:80>
    ServerName jenkins.company.com
    Redirect permanent / https://jenkins.company.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName jenkins.company.com
    
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/jenkins.crt
    SSLCertificateKeyFile /etc/ssl/private/jenkins.key
    
    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
    
    ProxyPassReverse / http://jenkins.company.com/
    
    # Headers
    ProxyPassReverse / http://127.0.0.1:8080/
    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-Port "443"
</VirtualHost>

性能调优

JVM参数优化:

# /etc/default/jenkins (Ubuntu/Debian)
# /etc/sysconfig/jenkins (CentOS/RHEL)

JAVA_ARGS="-Xmx4g -Xms2g -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+DisableExplicitGC -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap"

# 系统属性
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Djenkins.install.runSetupWizard=false -Dhudson.DNSMultiCast.disabled=true"

系统级优化:

# 增加文件描述符限制
echo "jenkins soft nofile 65536" >> /etc/security/limits.conf
echo "jenkins hard nofile 65536" >> /etc/security/limits.conf

# 优化网络参数
echo "net.core.somaxconn = 1024" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 1024" >> /etc/sysctl.conf
sysctl -p

2.7 备份和恢复

备份策略

完整备份脚本:

#!/bin/bash
# jenkins-backup.sh

JENKINS_HOME="/var/lib/jenkins"
BACKUP_DIR="/backup/jenkins"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="jenkins_backup_${DATE}.tar.gz"

# 创建备份目录
mkdir -p $BACKUP_DIR

# 停止Jenkins服务
sudo systemctl stop jenkins

# 创建备份
tar -czf $BACKUP_DIR/$BACKUP_FILE \
    --exclude="$JENKINS_HOME/workspace/*" \
    --exclude="$JENKINS_HOME/logs/*" \
    --exclude="$JENKINS_HOME/war/*" \
    $JENKINS_HOME

# 启动Jenkins服务
sudo systemctl start jenkins

# 清理旧备份(保留30天)
find $BACKUP_DIR -name "jenkins_backup_*.tar.gz" -mtime +30 -delete

echo "Backup completed: $BACKUP_FILE"

增量备份脚本:

#!/bin/bash
# jenkins-incremental-backup.sh

JENKINS_HOME="/var/lib/jenkins"
BACKUP_DIR="/backup/jenkins/incremental"
DATE=$(date +%Y%m%d_%H%M%S)

# 重要配置文件备份
rsync -av --delete \
    $JENKINS_HOME/config.xml \
    $JENKINS_HOME/jobs/ \
    $JENKINS_HOME/users/ \
    $JENKINS_HOME/secrets/ \
    $JENKINS_HOME/plugins/ \
    $BACKUP_DIR/$DATE/

echo "Incremental backup completed: $DATE"

恢复过程

完整恢复:

#!/bin/bash
# jenkins-restore.sh

BACKUP_FILE="$1"
JENKINS_HOME="/var/lib/jenkins"

if [ -z "$BACKUP_FILE" ]; then
    echo "Usage: $0 <backup_file>"
    exit 1
fi

# 停止Jenkins服务
sudo systemctl stop jenkins

# 备份当前配置
mv $JENKINS_HOME $JENKINS_HOME.old

# 恢复备份
tar -xzf $BACKUP_FILE -C /

# 修复权限
sudo chown -R jenkins:jenkins $JENKINS_HOME

# 启动Jenkins服务
sudo systemctl start jenkins

echo "Restore completed from: $BACKUP_FILE"

自动化备份

Cron任务配置:

# 编辑crontab
sudo crontab -e

# 添加备份任务
# 每天凌晨2点执行完整备份
0 2 * * * /opt/scripts/jenkins-backup.sh

# 每4小时执行增量备份
0 */4 * * * /opt/scripts/jenkins-incremental-backup.sh

2.8 故障排除

常见问题

1. Jenkins无法启动

# 检查Java版本
java -version

# 检查端口占用
sudo netstat -tlnp | grep 8080

# 检查日志
sudo journalctl -u jenkins -f
tail -f /var/log/jenkins/jenkins.log

2. 内存不足

# 检查内存使用
free -h
top -p $(pgrep -f jenkins)

# 调整JVM参数
sudo systemctl edit jenkins
# 添加:Environment="JAVA_OPTS=-Xmx2g"

3. 权限问题

# 修复Jenkins目录权限
sudo chown -R jenkins:jenkins /var/lib/jenkins
sudo chmod -R 755 /var/lib/jenkins

# 检查SELinux状态(CentOS/RHEL)
getenforce
sudo setsebool -P httpd_can_network_connect 1

4. 插件问题

# 安全模式启动
java -Dhudson.Main.development=true -jar jenkins.war

# 禁用所有插件
touch $JENKINS_HOME/plugins/.disabled

# 手动删除问题插件
rm -rf $JENKINS_HOME/plugins/problematic-plugin*

日志分析

重要日志文件:

# 系统日志
/var/log/jenkins/jenkins.log

# 访问日志
$JENKINS_HOME/logs/

# 系统服务日志
journalctl -u jenkins

# 应用日志
$JENKINS_HOME/logs/tasks/

日志配置:

// 在Jenkins Script Console中执行
import java.util.logging.Logger
import java.util.logging.Level

// 设置日志级别
Logger.getLogger("hudson.model.Run").setLevel(Level.FINE)
Logger.getLogger("hudson.model.Build").setLevel(Level.FINE)

2.9 本章小结

本章详细介绍了Jenkins的安装部署和环境配置:

关键要点:

  1. 合理的硬件配置和Java环境是基础
  2. 多种安装方式适应不同场景需求
  3. 初始配置决定了后续使用体验
  4. 安全配置和性能优化不可忽视
  5. 备份恢复策略确保数据安全

最佳实践:

  • 生产环境使用包管理器安装
  • 配置HTTPS和反向代理
  • 定期备份JENKINS_HOME
  • 监控系统资源使用情况
  • 建立故障排除流程

下一章预告:
下一章将介绍Jenkins的基本概念和术语,包括项目、构建、工作空间等核心概念的详细解释。

2.10 练习与思考

实践练习

  1. 基础安装

    • 在虚拟机中安装Jenkins
    • 完成初始配置向导
    • 创建第一个管理员用户
  2. 高级配置

    • 配置HTTPS访问
    • 设置反向代理
    • 优化JVM参数
  3. 备份恢复

    • 编写备份脚本
    • 测试恢复过程
    • 配置自动化备份

思考题

  1. 在容器化环境中部署Jenkins有哪些优势和挑战?
  2. 如何设计Jenkins的高可用架构?
  3. 生产环境中应该如何监控Jenkins的健康状态?
  4. 如何平衡Jenkins的安全性和易用性?

网站公告

今日签到

点亮在社区的每一天
去签到