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️⃣ 浏览器访问
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 "构建失败"
}
}
}

浙公网安备 33010602011771号