jenkins 的脚本部署
前沿
Jenkins 是一款开源的自动化服务器,主要用于实现持续集成(Continuous Integration, CI)和持续交付(Continuous Delivery, CD)。它通过插件的方式扩展功能,支持几乎所有主流的开发、构建、测试和部署工具。
一、Jenkins 的核心概念
1. 什么是持续集成(CI)和持续交付(CD)?
- 持续集成(CI):频繁地将代码集成到主分支,并通过自动化测试验证代码的正确性。
- 持续交付(CD):自动将经过测试的代码部署到生产环境,确保随时可以交付给用户。
Jenkins 是一个非常流行的 CI/CD 工具,它可以帮助团队实现:
- 代码自动构建
- 自动化测试
- 自动部署到生产或测试环境
2. Jenkins 的核心特点
- 易用性:通过图形化界面或配置文件,用户可以轻松配置各种任务。
- 高度可扩展性:Jenkins 拥有丰富的插件生态,支持源码管理(如 Git)、构建工具(如 Maven、Gradle)、测试工具(如 JUnit)等。
- 支持分布式构建:可以使用多个节点分布式执行任务。
- 支持多种平台:可以运行在 Windows、Linux、macOS 等主流操作系统上。
二、Jenkins 的核心功能
1.任务(Job)管理
每个任务(Job)可以是代码的构建、测试或部署过程。
支持流水线任务(Pipeline)和传统的自由风格任务。
2.插件支持
Jenkins 的功能可以通过插件扩展。例如:
Git 插件:从 Git 仓库拉取代码。
Docker 插件:支持容器化操作。
Slack 插件:通知构建结果到团队沟通工具。
3.分布式构建
支持配置多台代理服务器(Agent),加速构建任务。
4.持续监控
支持实时监控任务执行状态,查看历史构建记录、日志等。
5.通知与反馈
构建结果可以通过邮件、Slack、微信等方式通知开发人员。
三、Jenkins 的安装与部署
1. 准备环境
- 操作系统:推荐使用 Linux 服务器(如 CentOS、Ubuntu)。
- 运行环境:
Jenkins 运行在 Java 环境中,需要安装 JDK(推荐 Java 11 或 Java 17)。
一台最低 2 核 2G 的服务器,推荐 4 核 8G 或以上。
sudo systemctl stop firewalld sudo systemctl disable firewalld firewall-cmd --state cat /proc/version 查看系统版本 red Hat 是管理工具 yum debian 是管理工具 apt-get sudo yum install git
需要 更新yum
sudo yum update -y sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io sudo systemctl start docker sudo systemctl enable docker docker --version 添加阿里云镜像: sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo systemctl enable docker sudo systemctl start docker
产看运行 新建一个 daemon.json文件,然后去
docker run -d -p 9003:80 --name demo-dev nginx // 查看运行的容器 docker ps // 进入容器内部 docker exec -it demo-dev /bin/bash docker run -p 8120:8080 jenkins/jenkins [root@localhost docker]# cd /etc/docker [root@localhost docker]# touch daemon.json [root@localhost docker]# vim daemon.json # 在daemon.json文件的registry-mirrors列表中,添加/修改国内的镜像源地址 { "registry-mirrors": [ "https://docker.m.daocloud.io", "https://registry.docker-cn.com", "https://quay.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com/", "https://dockerhub.icu" ] }
如何查看 jenkins 版本
docker pull jenkins/jenkins:lts
在宿主机上创建一个目录,用于挂载 Jenkins 容器的工作目录:
mkdir -p /usr/local/jenkins chmod 777 /usr/local/jenkins
启动
启动 docker run -d -p 8080:8080 -p 50000:50000 -v /usr/local/jenkins:/var/jenkins_home --name myjenkins jenkins/jenkins:lts
获取密码
// 获取密码 docker exec myjenkins cat /var/jenkins_home/secrets/initialAdminPassword
进入容器
// 进入jenkins 容器 docker exec -it jenkins bash
但是这里最好是 Docker Compose 来安装 ,如果未安装,请根据你的操作系统安装 Docker 和 Docker Compose。
docker-compose --version sudo curl -L "https://github.com\/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose --version
然后
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.7/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
但是会不成功,还是这样吧运行python
安装下面的
yum -y install python3-pip pip3 install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple pip3 install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple docker-compose --help OPtion default:docker-compose.yml
然后新建 默认 有个 docker-compose.yml 的文件 需要写入下面的
services: jenkins: image: jenkins/jenkins:2.488 container_name: jenkins restart: always privileged: true user: root volumes: - "/usr/local/bin/kubectl:/usr/local/bin/kubectl" - "/usr/bin/docker:/usr/bin/docker" - "/run/docker.sock:/var/run/docker.sock" - "/usr/local/jenkins:/var/jenkins_home" - "/etc/localtime:/etc/localtime:ro" - "/usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7" - "/etc/docker/daemon.json:/etc/docker/daemon.json" - "/usr/local/jenkins_ssh:/root/.ssh:ro" environment: TZ: Asia/Shanghai ports: - "8080:8080" - "50000:50000"
当然是根据你自己的配置文件去写

然后就是打开你的二IP 端口 8080 去运行jenkins 然后让你git 代码去运行
我自己写了脚本shell 脚本
类似就是分支的区别去打包镜像上传
#!/bin/bash # 设置构建环境变量 export IMAGE_TAG=${BUILD_TAG:-latest} # Jenkins 自动生成的构建编号 export env=${ENVIRONMENT:-test} # Jenkins 参数化传入的环境 (test 或 prod) export DOCKER_USERNAME= 你的阿里云 export DOCKER_PASSWORD= 你的密码 # 执行部署脚本 chmod +x ./deploy.sh #./deploy.sh current_time=$(date +%Y-%m-%d-%H-%M-%S) # 参数变量 NAMESPACE="test" # 命名空间 PROJECT="cloudephone-dev" # 项目名称 IMAGELAST="cloudphone-official-website" # 镜像名称后缀 PODNAME="cloudphone-official-website" # pod名称 REGISTRY="你的镜像域名要上传的“ IMAGE_NAME="${PROJECT}/${IMAGELAST}" # 镜像名称 # TAG=${IMAGE_TAG} TAG=${current_time} FULL_IMAGE_NAME="${REGISTRY}/${PROJECT}/${IMAGELAST}:${TAG}" BUILD_ENV=${env} # 获取环境变量传入的值(test 或 prod) DEV_KUBECONFIG="/usr/local/kubeconfig/kubeconfig.yaml" # 开发环境 kubeconfig 文件路径 PRO_KUBECONFIG="/usr/local/kubeconfig/kubeconfig-pro.yaml" # 生产环境 kubeconfig 文件路径 # 检查 Node 版本 check_node_version() { echo "🎯 检查 Node 版本..." node -v || { echo "❌ Node 未安装,请先安装 Node.js"; exit 1; } } # 删除 node_modules 目录以确保清理 clean_node_modules() { echo "🧹 清理 node_modules..." rm -rf node_modules } # 设置 NPM 镜像源为国内镜像 set_npm_registry() { echo "🌍 使用国内 npm 镜像源..." npm config set registry https://registry.npmmirror.com/ } # 安装依赖,忽略 peer-dependencies 错误 install_dependencies() { echo "🔄 安装项目依赖..." npm install --legacy-peer-deps || { echo "❌ 依赖安装失败"; exit 1; } } # 设置 Node 内存限制以避免内存溢出 set_node_memory() { export NODE_OPTIONS=--max-old-space-size=4096 } # 设置 KUBECONFIG 并构建项目 build_project() { local ENV=$1 npm install @emotion/react npm install @emotion/styled if [ "$ENV" == "dev" ]; then echo "📦 当前环境为开发环境 (dev)" NAMESPACE="test" PROJECT="cloudephone-dev" IMAGELAST="cloudphone-official-website" PODNAME="cloudphone-official-website" export KUBECONFIG=$DEV_KUBECONFIG npm run build:test elif [ "$ENV" == "pre" ]; then echo "📦 当前环境为预发布环境 (pre)" NAMESPACE="pre" PROJECT="cloudphone-pre" IMAGELAST="cloud-phone-official-website" PODNAME="cloud-phone-official-website" export KUBECONFIG=$PRO_KUBECONFIG npm run build:pre else echo "📦 当前环境为生产环境 (prod)" NAMESPACE="prod" PROJECT="cloudphone-pro" IMAGELAST="cloud-phone-official-website" PODNAME="cloud-phone-official-website" export KUBECONFIG=$PRO_KUBECONFIG npm run build fi FULL_IMAGE_NAME="${REGISTRY}/${PROJECT}/${IMAGELAST}:${TAG}" echo "✅ 项目构建完成,镜像名称: $FULL_IMAGE_NAME" } # 登录阿里云镜像仓库 docker_login() { echo "🔑 登录阿里云镜像仓库..." docker login -u "${DOCKER_USERNAME}" -p "${DOCKER_PASSWORD}" "${REGISTRY}" || { echo "❌ 登录失败,请检查用户名和密码!"; exit 1; } } # 构建 Docker 镜像 build_docker_image() { echo "🔨 构建 Docker 镜像..." docker build -t "${FULL_IMAGE_NAME}" . || { echo "❌ 镜像构建失败!"; exit 1; } } # 推送 Docker 镜像到阿里云 push_docker_image() { echo "📤 推送镜像到阿里云..." docker push "${FULL_IMAGE_NAME}" || { echo "❌ 镜像推送失败!"; exit 1; } } # 删除本地镜像 remove_local_image() { echo "删除本地镜像 ${FULL_IMAGE_NAME}..." docker rmi --force ${FULL_IMAGE_NAME} || { echo "❌ 删除本地镜像失败!"; exit 1; } } # 更新 Kubernetes Pod update_k8s_pod() { echo ">>> 检查当前 kubectl 上下文..." CURRENT_CONTEXT=$(kubectl config current-context 2>/dev/null) if [ -z "$CURRENT_CONTEXT" ]; then echo "❌ 错误: 当前没有有效的 Kubernetes 上下文,请检查 kubectl 配置!" exit 1 fi echo "✔ 当前上下文: $CURRENT_CONTEXT" # echo "📋 当前上下文中的所有命名空间:" # kubectl get namespaces || { echo "❌ 无法列出命名空间,请检查集群连接状态。"; exit 1; } # echo "--------------------------------------------" # echo ">>> 检查命名空间是否存在..." # if ! kubectl get namespace "$NAMESPACE" >/dev/null 2>&1; then # echo "❌ 错误: 命名空间 '$NAMESPACE' 不存在!" # exit 1 # fi # echo "✔ 命名空间 '$NAMESPACE' 存在" # echo ">>> 检查用户权限..." # if ! kubectl auth can-i list pods -n "$NAMESPACE" >/dev/null 2>&1; then # echo "❌ 错误: 当前用户无权访问命名空间 '$NAMESPACE'!" # exit 1 # fi # echo "✔ 当前用户有权访问命名空间 '$NAMESPACE'" kubectl set image deployment/${IMAGELAST} ${PODNAME}=你的镜像域名/${PROJECT}/${IMAGELAST}:${TAG} -n ${NAMESPACE} #kubectl set image deployment/${IMAGELAST} ${IMAGELAST}=${FULL_IMAGE_NAME} -n ${NAMESPACE} || { echo "❌ 更新镜像失败!"; exit 1; } echo "✅ Pod 更新完成" } # 主流程 main() { check_node_version clean_node_modules set_npm_registry install_dependencies set_node_memory # 构建项目 build_project $BUILD_ENV # 登录并构建推送镜像 docker_login build_docker_image push_docker_image # 删除本地镜像 remove_local_image # 更新 Kubernetes Pod update_k8s_pod echo "✅ 部署成功!镜像已推送到:${FULL_IMAGE_NAME}" } main "$@"
#!/bin/bash 这个 就是类似的规范吧 shell 的脚本这样写

然后就可以看到你的控制台输出了,今天就先这样吧 2024最后一天,加班快乐!!!!

浙公网安备 33010602011771号