Jenkins容器化部署

一、安装 Docker(CentOS 7/8 示例)

yum install -y yum-utils
yum-config-manager \
  --add-repo \
  https://download.docker.com/linux/centos/docker-ce.repo

yum install -y docker-ce docker-ce-cli containerd.io
systemctl enable docker
systemctl start docker

二、创建 Jenkins 目录结构

mkdir -p /wdata/jenkins
cd /wdata/jenkins
  • 目录结构:
    /wdata/jenkins
    ├── Dockerfile
    ├── docker-compose.yml
    ├── jenkins_home/ # Jenkins 数据目录
    ├── ansible/ # ansible工具目录
    ├── logs/ # 日志(可选)
    └── backup/ # 备份(可选)

  • Dockerfile内容:

FROM jenkins/jenkins:2.528.3-jdk21

USER root

# ===== 安装基础工具 =====
RUN apt-get update && apt-get install -y \
    git \
    ssh \
    curl \
    wget \
    zip \
    unzip \
    rsync \
    ansible \
    vim \
    ca-certificates \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

USER jenkins
  • docker-compose.yml内容:
version: '2.7'
services:
  jenkins:
    user: "root:root"
    image: jenkins:2.528.3-Jdk21
    networks:
      - jenkins
    container_name: jenkins
    restart: always
    privileged: true
    ports:
      - "38080:8080"
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /wdata/jenkins/jenkins_home:/var/jenkins_home
      - /wdata/jenkins/ansible:/etc/ansible
networks:
  jenkins:

三、启动 Jenkins

# 启动
 docker compose -f docker-compose.yml up -d

#停止
 docker compose -f docker-compose.yml down

四、初始化 Jenkins

1️⃣ 获取初始管理员密码

cat /opt/jenkins/data/secrets/initialAdminPassword

2️⃣ 浏览器访问

http://宿主机IP:38080

3️⃣ 初始化流程

  • 输入初始密码
  • 选择 Install suggested plugins
  • 创建管理员账号
  • 完成初始化

五、Jenkins 必装插件(生产推荐)

进入:系统管理 → 插件管理
🔧 CI/CD 核心插件

  • Pipeline
  • Pipeline: Stage View
  • Git
  • GitHub Integration
  • Docker Pipeline
  • Credentials Binding
  • SSH Agent
    🔔 通知(可选)
  • DingTalk
  • Email Extension
  • Telegram Bot

六、创建第一个 Pipeline 示例

pipeline {
    agent any
    
    options {
        skipDefaultCheckout(true)
        timestamps()
    }
    
    parameters {
        choice(name: 'PROJECT', choices: ['uat_hl12_main_gate', 'uat_sx12_main_gate'], description: '选择项目')
        choice(name: 'BRANCH', choices: ['dev_self_new', 'dev_self_jb'], description: '选择分支')
    }

    environment {
        REPO_URL = 'http://1.1.1.1/datang/server/skynet.git'  // Git 仓库地址
        ANSIBLE_HOSTS = '/etc/ansible/hosts' // Ansible 主机清单
        MAIN_DEPLOY_PATH = '/wdata/server/skynet_main'
        GATE_DEPLOY_PATH = '/wdata/server/skynet_gate'
        DATE = sh(script: 'date +%Y%m%d%H%M', returnStdout: true).trim()
        BOT_TOKEN  = '7089847441:AAGUkUL-xEf3Ze-H5kU0kGfb0_jUcky9N2I' // Telegram Bot Token(建议用 credentials)
        CHAT_ID = '-1002145419289' // Telegram Chat ID
        AT_ID = ' @aa69com'
        AT_TEST_ID = '@aa69com'
    }

    stages {
        // 清理工作目录
        stage('🧹 Clean Workspace') {
            steps {
                cleanWs()
            }
        }
        
        // 1️⃣ 拉取代码
        stage('Checkout Code') {
            steps {
                script {
                    echo "📢 拉取项目: ${params.PROJECT}, 仓库: ${env.REPO_URL}, 分支: ${params.BRANCH}"
                    git branch: params.BRANCH,
                        url: env.REPO_URL,
                        credentialsId: 'git-cred-id'
                }
            }
        }

        // 2️⃣ 编译 & 打包
        stage('Build Package') {
            steps {
                script {
                    // 生成时间
                    env.DATE = sh(
                        script: 'date +%Y%m%d%H%M',
                        returnStdout: true
                    ).trim()

                    env.PKG = "/tmp/${params.PROJECT}_${env.DATE}.zip"

                    sh """
                    #!/bin/bash
                    set -e
                    echo "📦 开始打包: ${PKG}"
                    cd "${WORKSPACE}"
                    zip -rq "${PKG}" . \
                      -x geek/script/service/redisd.lua \
                      -x geek/conf/boot.lua \
                      -x geek/boot.lua \
                      -x run.sh \
                      -x geek/script/gate/gated.lua
                    echo "✅ 打包完成"
                    """
                }
            }
        }

        // 3️⃣ 使用 Ansible 进行部署
        stage('Deploy with Ansible') {
            steps {
                script {
                    sh """
                    #!/bin/bash
                    set -e
                    echo "🚀 推送 ${PKG}"
                    ansible -i "${ANSIBLE_HOSTS}" "${params.PROJECT}" \
                      -m copy -a "src=${PKG} dest=/tmp"
                    echo "✅ 推送完成"
                    """
                }
            }
        }

        // 4️⃣ 解压代码
        stage('Extract Package') {
            steps {
                script {
                    sh """
                    #!/bin/bash
                    set -e
                    echo "📢 开始解压${PKG}..."
                    ansible -i "${ANSIBLE_HOSTS}" "${params.PROJECT}" \
                    -m shell -a "unzip -o ${PKG} -d ${MAIN_DEPLOY_PATH}" > /dev/null
                    ansible -i "${ANSIBLE_HOSTS}" "${params.PROJECT}" \
                    -m shell -a "unzip -o ${PKG} -d ${GATE_DEPLOY_PATH}" > /dev/null
                    echo "✅ 解压${PKG}成功..."
                    """
                }
            }
        }

        //  5️⃣ 修改配置文件
        stage(' Modify File') {
            steps {
                script {
                    sh """
                    #!/bin/bash
                    set -e
                    echo "📢 修改文件及属性..."
                    ansible -i "${ANSIBLE_HOSTS}" "${params.PROJECT}" \
                    -b -m replace -a "path=${GATE_DEPLOY_PATH}/geek/script/bootgame.lua regexp='5808' replace='5809'"
                    ansible -i "${ANSIBLE_HOSTS}" "${params.PROJECT}" \
                    -m shell -a "chmod 755 ${MAIN_DEPLOY_PATH}/skynet"
                    ansible -i "${ANSIBLE_HOSTS}" "${params.PROJECT}" \
                    -m shell -a "chmod 755 ${GATE_DEPLOY_PATH}/skynet"
                    ansible -i "${ANSIBLE_HOSTS}" "${params.PROJECT}" \
                    -m shell -a "chown -R skynet:skynet ${MAIN_DEPLOY_PATH}"
                    ansible -i "${ANSIBLE_HOSTS}" "${params.PROJECT}" \
                    -m shell -a "chown -R skynet:skynet ${GATE_DEPLOY_PATH}"
                    echo "✅ 修改文件及属性成功..."
                    """
                }
            }
        }

        // 6️⃣ 重启服务
        stage(' Restart Services') {
            steps {
                script {
                    sh """
                    #!/bin/bash
                    set -e
                    echo "📢 开始重启服务..."
                    ansible -i "${ANSIBLE_HOSTS}" "${params.PROJECT}" \
                    -m shell -a "supervisorctl restart skynet_main"
                    ansible -i "${ANSIBLE_HOSTS}" "${params.PROJECT}" \
                    -m shell -a "supervisorctl restart skynet_gate"
                    echo "✅ 重启服务成功..."
                    """
                }
            }
        }

        // 7️⃣ 检查服务是否启动成功
        stage('Check Service') {
            steps {
                script {
                    sh """
                    #!/bin/bash
                    set -e
                    echo "📢 检查服务状态..."
                    ansible -i "${ANSIBLE_HOSTS}" "${params.PROJECT}" \
                    -m shell -a "pgrep skynet"
                    echo "✅ 服务状态正常..."
                    """
                }
            }
        }
    }

    post {
        success {
            echo "构建成功"
        }
        failure {
            echo "构建失败"
        }
    }
}

posted @ 2026-01-09 21:31  一条长江  阅读(1)  评论(0)    收藏  举报