温馨提示×

Linux Jenkins怎样实现持续集成

小樊
39
2025-11-18 12:50:14
栏目: 智能运维

Linux 上用 Jenkins 实现持续集成的落地步骤

一 环境准备与安装

  • 安装 Java:建议 Java 11 或 17(LTS)。例如在 Ubuntu/Debian 执行:sudo apt update && sudo apt install openjdk-11-jdk;在 CentOS/RHEL 执行:sudo yum install java-11-openjdk-devel。完成后用 java -version 验证。
  • 安装 Jenkins:
    • Ubuntu/Debian(使用签名密钥与 APT 源):
      curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
      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 && sudo apt install jenkins
    • CentOS/RHEL(YUM 源):
      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-2023.key
      sudo yum install jenkins
  • 启动与开机自启:sudo systemctl start jenkins && sudo systemctl enable jenkins;查看状态:sudo systemctl status jenkins。
  • 防火墙放行:
    • Ubuntu/Debian(ufw):sudo ufw allow 8080
    • CentOS/RHEL(firewalld):sudo firewall-cmd --permanent --add-port=8080/tcp && sudo firewall-cmd --reload
  • 首次访问与解锁:浏览器打开 http://<服务器IP>:8080,初始管理员密码在 /var/lib/jenkins/secrets/initialAdminPassword
  • 可选 Docker 方式:docker pull jenkins/jenkins:lts;数据持久化建议挂载 /var/jenkins_home

二 初始化与安全配置

  • 安装插件:首次进入选择 Install suggested plugins;后续可在 Manage Jenkins > Manage Plugins 安装所需插件,如 GitMaven IntegrationPipelineSSH Pipeline Steps 等。
  • 更换插件镜像源(国内加速):进入 Manage Jenkins > Manage Plugins > Advanced,将 Update Site URL 改为 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
  • 系统配置:在 Global Tool Configuration 配置 JDK、Git、Maven 路径;在 Configure System 配置 SSH 服务器(用于发布与远程执行)。
  • 安全与权限:启用 CSRF 保护,使用 Role-Based Authorization Strategy 进行细粒度授权;建议配置 Nginx 反向代理 + HTTPS(证书可用 Let’s Encrypt)。

三 创建任务与触发器

  • Freestyle 任务(通用):
    • 源码管理:选择 Git,填写仓库 URL 与分支(如 main),配置凭证(SSH 或 HTTPS)。
    • 构建触发器:
      • 轮询 SCM:如 **H/5 * * * ***(每 5 分钟检查一次变更)
      • Webhook:在代码托管平台(如 GitLab/GitHub)配置 Webhook URL:http:///git/notifyCommit?url=<REPO_URL>,Jenkins 安装 Git plugin 后可用;需要 CSRF 保护时配合 Crumb Issuer
    • 构建步骤:
      • Java/Maven:执行 mvn clean packagemvn clean install
      • Node.js:执行 npm install && npm run build
      • C/C++:执行 make && make test
  • Pipeline 任务(推荐,代码即流程):在项目根目录创建 Jenkinsfile,将构建、测试、部署流程纳入版本控制,便于复用与审计。

四 示例 Jenkinsfile 模板

  • Java + Maven
pipeline {
  agent any
  tools {
    maven 'Maven-3'   // 需在 Global Tool Configuration 中定义
    jdk   'JDK-11'   // 需在 Global Tool Configuration 中定义
  }
  stages {
    stage('Checkout') {
      steps { git url: 'https://github.com/your-org/your-app.git', branch: 'main' }
    }
    stage('Build') {
      steps { sh 'mvn clean package -DskipTests' }
    }
    stage('Test') {
      steps { sh 'mvn test' }
    }
    stage('Deploy') {
      when { branch 'main' }
      steps {
        sh 'mvn deploy'   // 结合 settings.xml 与仓库凭证
        // 或使用 sshPublisher 将产物发布到目标主机
      }
    }
  }
  post {
    always { cleanWs() }
    success { echo 'Build & Test SUCCESS' }
    failure { echo 'Build FAILED' }
  }
}
  • Node.js(前端)
pipeline {
  agent any
  tools { nodejs 'Node-16' }  // 需在 Global Tool Configuration 中定义
  stages {
    stage('Checkout') { steps { git url: 'https://github.com/your-org/your-web.git', branch: 'main' } }
    stage('Install')  { steps { sh 'npm ci' } }
    stage('Build')    { steps { sh 'npm run build' } }
    stage('Deploy')   {
      when { branch 'main' }
      steps {
        // 示例:使用 sshPublisher 发布到 Nginx 目录
        sshPublisher(publishers: [sshPublisherDesc(
          configName: 'prod-ssh',
          transfers: [sshTransfer(execCommand: 'cd /var/www && git pull', remoteDirectory: '/var/www')]
        )])
      }
    }
  }
}
  • C/C++
pipeline {
  agent any
  stages {
    stage('Checkout') { steps { git url: 'https://github.com/your-org/your-cpp.git', branch: 'main' } }
    stage('Build')    { steps { sh 'make -j$(nproc)' } }
    stage('Test')     { steps { sh 'make test || true' } } // 视测试框架调整
    stage('Archive')  { steps { archiveArtifacts artifacts: '**/target/*.zip,**/build/*.tar.gz', fingerprint: true } }
  }
}

说明:上述示例使用 Jenkins Pipeline拉取代码、构建、测试、部署 串联为可重复执行的流水线;SSH 发布可借助 sshPublisher 插件完成远程部署。

五 运维与优化要点

  • 日志与排错:查看服务日志 sudo journalctl -u jenkins.service -f;构建日志在 Jenkins 控制台/var/log/jenkins/jenkins.log
  • 端口与路径:默认 8080;修改 /etc/default/jenkins(Debian/Ubuntu)或 /etc/sysconfig/jenkins(CentOS/RHEL)中的 JENKINS_PORT;Jenkins 主目录 /var/lib/jenkins(备份与迁移重点)。
  • 性能与扩展:使用 Jenkins Agent 做分布式构建;构建环境使用 Docker 镜像 固化依赖;按项目拆分 Job/Pipeline视图,减少资源争用。
  • 安全加固:限制 代理到目标主机的 SSH 密钥 权限(仅部署所需目录与命令);开启 审计日志;定期升级 Jenkins 与插件;为外网访问启用 反向代理 + HTTPS

0