前沿
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 firewalldfirewall-cmd --statecat /proc/version 查看系统版本red Hat 是管理工具 yum debian 是管理工具 apt-getsudo yum install git
需要 更新yum
sudo yum update -ysudo 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 dockersudo systemctl start docker
产看运行 新建一个 daemon.json文件,然后去
docker run -d -p 9003:80 --name demo-dev nginx // 查看运行的容器 docker ps // 进入容器内部 docker exec -it demo-dev /bin/bashdocker 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 --versionsudo 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 --helpOPtion default:docker-compose.yml
然后新建 默认 有个 docker-compose.yml 的文件 需要写入下面的
services:jenkins:image: jenkins/jenkins:2.488 container_name: jenkinsrestart: alwaysprivileged: trueuser: rootvolumes:- "/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=$1npm install @emotion/reactnpm install @emotion/styledif [ "$ENV" == "dev" ]; thenecho "📦 当前环境为开发环境 (dev)"NAMESPACE="test"PROJECT="cloudephone-dev"IMAGELAST="cloudphone-official-website"PODNAME="cloudphone-official-website"export KUBECONFIG=$DEV_KUBECONFIGnpm run build:testelif [ "$ENV" == "pre" ]; thenecho "📦 当前环境为预发布环境 (pre)"NAMESPACE="pre"PROJECT="cloudphone-pre"IMAGELAST="cloud-phone-official-website"PODNAME="cloud-phone-official-website"export KUBECONFIG=$PRO_KUBECONFIGnpm run build:preelseecho "📦 当前环境为生产环境 (prod)"NAMESPACE="prod"PROJECT="cloudphone-pro"IMAGELAST="cloud-phone-official-website"PODNAME="cloud-phone-official-website"export KUBECONFIG=$PRO_KUBECONFIGnpm run buildfiFULL_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" ]; thenecho "❌ 错误: 当前没有有效的 Kubernetes 上下文,请检查 kubectl 配置!"exit 1fiecho "✔ 当前上下文: $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_versionclean_node_modulesset_npm_registryinstall_dependenciesset_node_memory# 构建项目build_project $BUILD_ENV# 登录并构建推送镜像docker_loginbuild_docker_imagepush_docker_image# 删除本地镜像remove_local_image# 更新 Kubernetes Podupdate_k8s_podecho "✅ 部署成功!镜像已推送到:${FULL_IMAGE_NAME}" }main "$@"
#!/bin/bash 这个 就是类似的规范吧 shell 的脚本这样写
然后就可以看到你的控制台输出了,今天就先这样吧 2024最后一天,加班快乐!!!!