温馨提示×

如何自动化centos上的jenkins部署

小樊
38
2025-12-23 15:41:43
栏目: 智能运维

在 CentOS 上实现 Jenkins 自动化部署

一 架构与准备

  • 部署模式选型
    • 单机一体化:在单台 CentOS 上安装 Jenkins,直接在本机拉代码、构建、部署(适合演示或小规模环境)。
    • 分离式:一台 Jenkins 服务器(可容器化),一台或多台 应用服务器(部署目标),通过 SSHDocker 远程发布(适合生产)。
  • 基础环境
    • 安装 Java(Jenkins 运行依赖)、GitMaven(Java 项目)、NodeJS(前端项目)。
    • 安装 Docker(可选,用于容器化部署与一致性环境)。
  • 安全与权限
    • 为 Jenkins 创建专用用户(如 jenkins),配置 sudo 免密仅限于部署脚本所需命令。
    • 使用 SSH 密钥 进行代码拉取与远程部署,避免明文口令。
    • 防火墙放行 8080(Jenkins Web)、50000(JNLP 代理,如用到)、以及应用端口(如 8081/80/443)。

二 安装与初始化

  • 安装 Java(示例为 OpenJDK 11)
    • 命令:sudo yum install -y java-11-openjdk-devel
  • 安装与启动 Jenkins(RPM 方式)
    • 添加仓库并安装:
      • 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.key
      • sudo yum install -y jenkins
    • 启动并设置开机自启:
      • sudo systemctl start jenkins
      • sudo systemctl enable jenkins
    • 获取初始管理员密码:
      • sudo cat /var/lib/jenkins/secrets/initialAdminPassword
    • 访问 http://<服务器IP>:8080 完成初始化与插件安装。
  • 可选 使用 Docker 运行 Jenkins(便于迁移与隔离)
    • 启动示例:
      • docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -v /opt/jenkins_home:/var/jenkins_home --restart unless-stopped jenkins/jenkins:lts
    • 初始密码路径:/opt/jenkins_home/secrets/initialAdminPassword
  • 安装常用插件
    • GitMaven IntegrationNodeJSGeneric Webhook TriggerPublish Over SSHDocker PipelineBlue Ocean

三 触发器与权限配置

  • 代码托管 Webhook
    • GitLab/GitHub 项目设置 Webhook,指向 http://<JENKINS_URL>/generic-webhook-trigger/invoke(或项目专用端点),触发 push/merge 事件自动构建。
    • Jenkins 任务中安装并启用 Generic Webhook Trigger,按需配置 Token 与请求参数映射。
  • SSH 免密与远程部署
    • 在 Jenkins 凭据中新增 SSH 私钥(目标服务器为 root 或具备 sudo 权限的部署用户),用于拉取私有仓库与远程执行脚本。
    • 系统管理 → 系统配置 → Publish over SSH 中添加目标服务器信息(Host、Port、Credentials、Remote Directory)。

四 自动化部署方案与示例

  • 方案 A 远程发布脚本 + Publish Over SSH(通用、简单)
    • 思路:Jenkins 构建后将产物(如 target/app.jar 或前端 dist/)通过 SSH 传到目标机,执行远程脚本完成停旧、启新、健康检查。
    • 远程示例脚本 deploy.sh(Java)
      • 作用:停止旧进程、拷贝新包、启动并防止被 Jenkins 杀掉子进程。
      • 关键点:设置环境变量 JENKINS_NODE_COOKIE=dontKillMe 或使用 BUILD_ID=dontKillMe,避免 Jenkins 在构建结束后终止后台进程。
      • 示例:
        • #!/bin/bash
        • JENKINS_NODE_COOKIE=dontKillMe
        • JAR_NAME_NEW="app.jar"; APP_DIR="/opt/myapp"; PID=$(ps -ef | grep $JAR_NAME_NEW | grep -v grep | awk '{print $2}')
        • [ -n "$PID" ] && kill -9 $PID || echo "No old process."
        • mkdir -p $APP_DIR
        • cp $WORKSPACE/target/$JAR_NAME_NEW $APP_DIR/
        • cd $APP_DIR && nohup java -jar $JAR_NAME_NEW > app.log 2>&1 &
        • sleep 10 && tail -n 200 app.log
    • Jenkins 任务配置
      • 构建后操作选择 Send build artifacts over SSH
        • Source files:target/*.jar,deploy.sh
        • Remove prefix:target
        • Remote directory:/opt/myapp
        • Exec command:sh /opt/myapp/deploy.sh
  • 方案 B Docker 化部署(一致性与回滚友好)
    • 思路:在代码仓库提供 Dockerfile 与可选 docker-compose.yml,Jenkins 构建镜像并推送到仓库(如 HarborDocker Hub),在目标机拉取并启动。
    • 示例 Dockerfile(Java)
      • FROM eclipse-temurin:11-jre
      • WORKDIR /app
      • COPY target/app.jar /app/app.jar
      • EXPOSE 8080
      • CMD ["java","-jar","/app/app.jar"]
    • Jenkins Pipeline 片段(声明式)
      • pipeline { agent any stages { stage('Build') { steps { sh 'mvn clean package' } } stage('Build & Push Image') { steps { sh 'docker build -t $REGISTRY/namespace/app:$BUILD_NUMBER .' sh 'docker push $REGISTRY/namespace/app:$BUILD_NUMBER' } } stage('Deploy') { steps { sh 'ssh deploy@prod "docker pull $REGISTRY/namespace/app:$BUILD_NUMBER && docker stop app || true && docker rm app || true && docker run -d --name app -p 8080:8080 $REGISTRY/namespace/app:$BUILD_NUMBER"' } } }
    • 如需回滚,可在目标机执行 docker run ... $REGISTRY/namespace/app:<上一个版本>

五 前端与 Java 的落地要点

  • 前端(Vue/Nuxt 等)
    • 安装 NodeJS 插件并配置版本;在构建步骤执行:
      • node -v && npm -v
      • npm install -g yarn --registry=https://registry.npmmirror.com
      • yarn install && yarn lint && yarn build
    • dist/ 目录通过 SSH 发布到 Nginx 静态目录,或构建 Nginx 镜像进行容器化发布。
  • Java(Maven)
    • 安装 Maven Integration 插件;在构建步骤执行:
      • mvn clean package -DskipTests
    • 产物 target/*.jar 通过 SSH 或 Docker 发布到目标环境。

0