【Jenkins简单自动化部署案例:基于Docker和Harbor的自动化部署流程记录】
摘要
本文记录了作者使用Jenkins时搭建的一个简单自动化部署案例,涵盖Jenkins的Docker化安装、Harbor私有仓库配置、Ansible远程部署等核心步骤。通过一个SpringBoot项目 (RuoYi) 的完整流程演示,从代码提交到镜像构建、推送、滚动更新,逐步实现CI/CD的基础能力。文章重点解决可能遇到的权限问题、证书配置、流水线调试等痛点,并提供可复现的操作命令和排错思路,适合刚接触DevOps工具链的朋友参考。
安装Jenkins
Jenkins-Docker官网
1.创建网络
使用以下命令在 Docker 中创建一个桥接网络:
docker network create jenkins
2.Dockerfile创建Jenkins Docker 镜像
通过执行以下两个步骤来自定义官方的 Jenkins Docker 镜像:
创建一个包含以下内容的 Dockerfile:
FROM jenkins/jenkins:2.504.1-jdk21
USER root
RUN apt-get update && apt-get install -y lsb-release ca-certificates curl && \install -m 0755 -d /etc/apt/keyrings && \curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc && \chmod a+r /etc/apt/keyrings/docker.asc && \echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \https://download.docker.com/linux/debian $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable" \| tee /etc/apt/sources.list.d/docker.list > /dev/null && \apt-get update && apt-get install -y docker-ce-cli && \apt-get clean && rm -rf /var/lib/apt/lists/*
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow json-path-api"
根据此 Dockerfile 构建一个新的 Docker 镜像,“myjenkins-blueocean:2.504.1-1”:
docker build -t myjenkins-blueocean:2.504.1-1 .
如果您尚未下载官方的 Jenkins Docker 镜像,上述过程会自动为您下载。
使用到对应工具需添加安装步骤, 例: 安装Ansible
FROM myjenkins-blueocean:2.504.1-1
USER root
RUN apt-get update && apt-get install -y ansible \&& git config --global --add safe.directory '*'
# 配置 Git 安全目录(root用户)
#RUN git config --global --add safe.directory '*'USER jenkins
docker build -t myjenkins-ansible .
4.启动容器
使用以下 docker run
命令在 Docker 中以容器形式运行您自己的 myjenkins
镜像:
docker run --name jenkins-blueocean --restart=on-failure --detach \
--user root \
--publish 8080:8080 --publish 50000:50000 \
--volume jenkins-data:/var/jenkins_home \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume /etc/docker/certs.d:/etc/docker/certs.d:ro \
--volume /etc/ansible/hosts:/etc/ansible/hosts:ro \
--volume ~/.ssh/id_rsa:/root/.ssh/id_rsa \
--volume ~/.ssh/known_hosts:/root/.ssh/known_hosts:ro \
--add-host=harbor.host3:192.168.0.223 \
myjenkins-ansible# 停止并删除旧容器
docker stop jenkins-blueocean
docker rm jenkins-blueocean
- Ansible Inventory
--volume /etc/ansible/hosts:/etc/ansible/hosts:ro
- 免密登录
--volume ~/.ssh/id_rsa:/root/.ssh/id_rsa
--volume ~/.ssh/known_hosts:/root/.ssh/known_hosts:ro
- harbor主机host:
--add-host=harbor.host3:192.168.0.223
访问测试
http://192.168.0.220:8080
提示输入密码可查看容器日志获取:docker logs jenkins-blueocean
一:基础环境配置
环境架构概览
节点名称 | 角色及配置 | 关键组件链接 | 功能说明 |
---|---|---|---|
host0 (内存>2G) | 控制节点(Ansible + Jenkins) | Ubuntu 安装 Docker CE + Jenkins | 负责 CI/CD 流程调度与任务分发 |
host3 (内存>1G) | 私有镜像仓库(Harbor v2.13.0) | Harbor v2.13.0 HTTPS 安装指南 | 存储 Docker 镜像与项目管理 |
host1/host2 (内存>2G) | 目标服务器(Docker 运行时) | - | 运行业务容器集群 |
快速创建虚拟环境: 【Vagrant+VirtualBox创建自动化虚拟环境】
节点详细配置
1. 控制节点 (host0)
-
核心组件
- Jenkins:用于自动化构建、测试与部署
- Ansible:实现批量服务器配置管理
-
安装步骤
参考教程:Ubuntu 部署 Docker CE + Jenkins
2. 镜像仓库节点 (host3)
-
核心配置
- HTTPS 证书配置
- 创建项目
ruoyi
用于镜像管理 - 参考教程:Harbor HTTPS 安装与配置
3. 目标服务器 (host1/host2)
- 基础环境
- Docker 运行时
- 开放必要端口(80、3306 等)
4.所有服务器
- 域名映射
echo "192.168.0.223 harbor.host3" | sudo tee -a /etc/hosts
- 确保 Harbor 的证书文件(如 harbor.host3.cert)已存于目标主机
#jenkins挂载目录
docker volume inspect jenkins-docker-certs#确保 Harbor 的证书文件(如 harbor.host3.cert)已存于宿主机的 /etc/docker/certs.d/harbor.host3/ca.crt,,
sudo scp root@harbor.host3:/opt/harbor/certs/ca.crt /etc/docker/certs.d/harbor.host3/#构建时报错需添加为.pem
sudo scp root@harbor.host3:/opt/harbor/certs/ca.crt /var/lib/docker/volumes/jenkins-docker-certs/_data/ca.pem
1.1 配置Docker信任Harbor仓库(所有主机)
# 在host0/host1/host2上执行
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://docker.1ms.run","https://docker.mybacc.com","https://dytt.online","https://lispy.org","https://docker.xiaogenban1993.com","https://docker.yomansunter.com","https://aicarbon.xyz","https://666860.xyz","https://docker.zhai.cm","https://a.ussh.net","https://hub.littlediary.cn","https://hub.rat.dev","https://docker.m.daocloud.io"],"insecure-registries": ["https://harbor.host3"]
}
EOFsudo systemctl daemon-reload
sudo systemctl restart docker
1.2 Jenkins添加凭证(host0 Jenkins网页)
-
访问
http://host0:8080
-
Dashboard -> 系统管理 -> 插件管理-> 选择 Available plugins
- 安装插件
Ansible plugin
,Git Plugin
,GitHub API Plugin
- 安装插件
-
左侧菜单点击 Manage Jenkins -> Credentials -> System -> Global credentials
-
点击 Add Credentials
-
harbor凭证
-
Kind:
Username with password
-
ID:
harbor-creds
-
Username: [你的Harbor用户名]
-
Password: [你的Harbor密码]
-
-
git凭证
- Kind:
Username with password
- Username: 你的 Gitee 用户名
- Password: 你的 Gitee 密码或 Token
- ID:
gitee-creds
- ashboard–>系统管理–>全局工具配置
- 勾选
自动安装
-->保存
- 勾选
- Kind:
-
1.3 准备Git仓库
部署的项目来自github-RuoYi: yangzongzhuan/RuoYi
可克隆我的Gitee来获取:
git clone https://gitee.com/xbd_zc/rytest.git
将以下文件推送到Git仓库:
tree├── deploy.yml
├── docker-compose.yml
├── Jenkinsfile
├── mysql
│ ├── conf
│ │ └── my.cnf
│ ├── Dockerfile
│ ├── init
│ │ ├── 01-init.sql
│ │ ├── 02-quartz.sql
│ │ └── 03-ry_20250416.sql
│ └── runmysql.sh
└── tomcat9├── conf│ ├── context.xml│ └── server.xml├── Dockerfile├── runtomcat.sh├── tomcat│ └── apache-tomcat-9.0.82.tar.gz└── war└── ruoyi-admin-docker.war
- Dockerfile(tomcat/mysql)
- docker-compose.yml
- Jenkinsfile
- ansible-playbook(deploy.yml)
#初始化项目
git init
#码云复制的路径,将本地仓库和码 云上的仓库关联起来
git remote add origin https://gitee.com/xx/xx.git
#将远程仓库pull到本地仓库
git pull origin master
#将所有的文件都添加进去,也可以选择使用git add + 文件名 提交具体的某个文件。
git add .
#‘内容描述’ 提交时的描述
git commit -m "first create"
#推送到远程仓库(也就是码云上)
git push origin master #配置ssh协议认证
#1生成SSH密钥
ssh-keygen -t ed25519 -C "your_email@qq.com"
按提示生成密钥对(默认路径为 ~/.ssh/id_ed25519 和 ~/.ssh/id_ed25519.pub)34。
cat ~/.ssh/id_ed25519.pub
#2添加公钥到Gitee账户
将公钥文件(id_ed25519.pub)内容复制到Gitee的 SSH公钥管理 页面并保存6。#3修改远程仓库协议为SSH
检查当前远程地址是否为HTTPS:
git remote -v
若为HTTPS格式,修改为SSH协议地址:
git remote set-url origin git@gitee.com:用户名/仓库名.git
此后push时将自动使用SSH密钥认证,无需输入账号密码
二:流水线配置(host0)
任务步骤
- 开发人员提交代码到Git仓库
- Jenkins触发构建任务
- 构建成功后自动推送镜像到Harbor
- 触发Ansible Playbook进行滚动部署
2.1 创建Pipeline任务
-
Dashboard -> 新建任务 -> 输入名称
image-builder
-> 选择 流水线 -
Pipeline 配置:
-
流水线
-
Definition 定义: 选择 :
Pipeline script from SCM
-
SCM:
Git
-
Repository URL: [你的Git仓库地址]
-
Credentials: [选择Git仓库的凭证]
- 没有可添加
-
-
-
Script Path 脚本路径:
Jenkinsfile
-
2.2 配置Ansible Inventory
# host0上操作
sudo tee /etc/ansible/hosts <<-'EOF'
[webservers]
host1 ansible_host=192.168.0.221 ansible_user=root
host2 ansible_host=192.168.0.222 ansible_user=root
EOF
2.3 配置SSH免密登录
# host0上操作
ssh-keygen -t rsa
ssh-copy-id root@host1
ssh-copy-id root@host2
2.4 编写Ansible Playbook
harbor拉取镜像后启动容器
# deploy.yml
- hosts: webserverstasks:- name: Login Harborshell: docker login -u {{ harbor_user }} -p {{ harbor_password }} harbor.host3- name: Pull imagesshell: |docker pull harbor.host3/ruoyi/ry-tomcat:{{ build_number }}docker pull harbor.host3/ruoyi/ry-mysql:{{ build_number }}- name: Stop old containersshell: |docker stop ry-tomcat || truedocker stop ry-mysql || truedocker rm ry-tomcat || truedocker rm ry-mysql || true- name: Create app directory with permissionsfile:path: /opt/appstate: directoryowner: rootgroup: rootmode: '0755'- name: Copy docker-compose.ymlcopy:src: "docker-compose.yml"dest: /opt/app/docker-compose.ymlbackup: yes- name: Ensure docker-compose.yml existsstat:path: /opt/app/docker-compose.ymlregister: compose_file- name: Fail if docker-compose.yml does not existfail:msg: "docker-compose.yml not found at /path/to/docker-compose.yml"when: not compose_file.stat.exists- name: Start new containersshell: |export TAG={{ build_number }}docker compose -f /opt/app/docker-compose.yml downdocker compose -f /opt/app/docker-compose.yml up -d
2.5 Jenkinsfile内容
pipeline {agent anyenvironment {HARBOR_URL = "harbor.host3"PROJECT_NAME = "ruoyi"// 添加 IMAGE_TAG 定义(使用 BUILD_NUMBER 或自定义值)IMAGE_TAG = "${BUILD_NUMBER}"}stages {// 阶段 1:构建镜像stage('Build Images') {steps {script {docker.withRegistry("https://${HARBOR_URL}", 'harbor-creds') {// 构建 Tomcat 镜像def tomcatImage = docker.build("${HARBOR_URL}/${PROJECT_NAME}/ry-tomcat:${IMAGE_TAG}",'./tomcat9')tomcatImage.push()// 构建 MySQL 镜像def mysqlImage = docker.build("${HARBOR_URL}/${PROJECT_NAME}/ry-mysql:${IMAGE_TAG}",'./mysql')mysqlImage.push()} // 闭合 docker.withRegistry} // 闭合 script} // 闭合 steps} // 闭合 stage('Build Images')// 阶段 2:部署stage('Deploy') {steps {ansiblePlaybook(playbook: 'deploy.yml', // Ansible Playbook 路径inventory: '/etc/ansible/hosts', // Ansible Inventory 文件extras: '-e ansible_ssh_private_key_file=/root/.ssh/id_rsa', // 指定私钥路径extraVars: [harbor_user: 'admin',harbor_password: 'Harbor12345',build_number: "${BUILD_NUMBER}"],installation: 'Auto-Install-Ansible' // 引用全局工具名称)} // 闭合 steps} // 闭合 stage('Deploy')} // 闭合 stages
} // 闭合 pipeline
2.6 执行流水线imag-builder
Dashboard --> image-builder --> 立即构建
- 可在构建的任务重查看日志
Console Output
最后成功Console Output
应输出一下内容
Started by user xbdzc
Obtained Jenkinsfile from git https://gitee.com/xbd_zc/rytest.git
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/image-builder
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Declarative: Checkout SCM)
[Pipeline] checkout
The recommended git tool is: git
using credential gitee-creds> git rev-parse --resolve-git-dir /var/jenkins_home/workspace/image-builder/.git # timeout=10
Fetching changes from the remote Git repository> git config remote.origin.url https://gitee.com/xbd_zc/rytest.git # timeout=10
Fetching upstream changes from https://gitee.com/xbd_zc/rytest.git> git --version # timeout=10> git --version # 'git version 2.39.5'
using GIT_ASKPASS to set credentials xbdzc-passwd> git fetch --tags --force --progress -- https://gitee.com/xbd_zc/rytest.git +refs/heads/*:refs/remotes/origin/* # timeout=10> git rev-parse refs/remotes/origin/master^{commit} # timeout=10
Checking out Revision b3d95a777b4fa27956fa864ce008527296196630 (refs/remotes/origin/master)> git config core.sparsecheckout # timeout=10> git checkout -f b3d95a777b4fa27956fa864ce008527296196630 # timeout=10
Commit message: "update compose"> git rev-list --no-walk cd6d562fb8aa4472ecfa32177959752d75f371d8 # timeout=10
[Pipeline] }
[Pipeline] // stage
[Pipeline] withEnv
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Build Images)
[Pipeline] script
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] withDockerRegistry
Using the existing docker config file.
Removing blacklisted property: auths
$ docker login -u admin -p ******** https://harbor.host3
WARNING! Using --password via the CLI is insecure. Use --password-stdin.WARNING! Your credentials are stored unencrypted in '/var/jenkins_home/workspace/image-builder@tmp/3425a5d5-afa6-4967-ac2a-891cbc224086/config.json'.
Configure a credential helper to remove this warning. See
https://docs.docker.com/go/credential-store/Login Succeeded
[Pipeline] {
[Pipeline] isUnix
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ docker build -t harbor.host3/ruoyi/ry-tomcat:39 ./tomcat9
#0 building with "default" instance using docker driver#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 773B done
#1 DONE 0.0s#2 [internal] load metadata for docker.io/library/eclipse-temurin:8-jre-jammy
#2 DONE 3.6s#3 [internal] load .dockerignore
#3 transferring context: 2B done
#3 DONE 0.0s#4 [1/6] FROM docker.io/library/eclipse-temurin:8-jre-jammy@sha256:d45584c02ee4da09862673207d57121049b89eb99d2a3415573efc0530a87e61
#4 DONE 0.0s#5 [internal] load build context
#5 transferring context: 89.77MB 0.3s done
#5 DONE 0.3s#6 [3/6] RUN mkdir -p "/opt/tomcat" && tar xzvf /tmp/tomcat.tar.gz -C /opt/tomcat --strip-components=1 && rm -rf /tmp/tomcat.tar.gz /opt/tomcat/webapps/*
#6 CACHED#7 [4/6] COPY conf/server.xml /opt/tomcat/conf/
#7 CACHED#8 [5/6] COPY conf/context.xml /opt/tomcat/conf/
#8 CACHED#9 [2/6] COPY tomcat/apache-tomcat-9.0.82.tar.gz /tmp/tomcat.tar.gz
#9 CACHED#10 [6/6] COPY war/ruoyi-admin-docker.war /opt/tomcat/webapps/ROOT.war
#10 CACHED#11 exporting to image
#11 exporting layers done
#11 writing image sha256:e1157c41978f859e8f9ca9c631b635c2b694a156a9f127f9efb94904e5dccc9f done
#11 naming to harbor.host3/ruoyi/ry-tomcat:39 done
#11 DONE 0.0s
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] isUnix
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ docker tag harbor.host3/ruoyi/ry-tomcat:39 harbor.host3/ruoyi/ry-tomcat:39
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] isUnix
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ docker push harbor.host3/ruoyi/ry-tomcat:39
The push refers to repository [harbor.host3/ruoyi/ry-tomcat]
be3aaabe879b: Preparing
3180fdaa6749: Preparing
b7e66be23a97: Preparing
7700871d37e6: Preparing
abd6fe352750: Preparing
77f2daad0e52: Preparing
b31e18c35f3d: Preparing
735b0864b65b: Preparing
06dd982b4145: Preparing
346f14bf17b9: Preparing
77f2daad0e52: Waiting
b31e18c35f3d: Waiting
735b0864b65b: Waiting
06dd982b4145: Waiting
346f14bf17b9: Waiting
b7e66be23a97: Layer already exists
abd6fe352750: Layer already exists
3180fdaa6749: Layer already exists
7700871d37e6: Layer already exists
b31e18c35f3d: Layer already exists
be3aaabe879b: Layer already exists
77f2daad0e52: Layer already exists
735b0864b65b: Layer already exists
06dd982b4145: Layer already exists
346f14bf17b9: Layer already exists
39: digest: sha256:be702d8f76de44a3da0a1a8f9b3763531f1c82f5ac1b8b0c32c52cec6c5f424c size: 2419
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] isUnix
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ docker build -t harbor.host3/ruoyi/ry-mysql:39 ./mysql
#0 building with "default" instance using docker driver#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile:
#1 transferring dockerfile: 777B done
#1 DONE 0.2s#2 [internal] load metadata for docker.io/library/mysql:5.7
#2 DONE 2.7s#3 [internal] load .dockerignore
#3 transferring context: 2B done
#3 DONE 0.1s#4 [1/5] FROM docker.io/library/mysql:5.7@sha256:4bc6bc963e6d8443453676cae56536f4b8156d78bae03c0145cbe47c2aad73bb
#4 DONE 0.0s#5 [internal] load build context
#5 transferring context: 74.34kB done
#5 DONE 0.1s#6 [2/5] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone
#6 CACHED#7 [3/5] COPY conf/my.cnf /etc/mysql/conf.d/
#7 CACHED#8 [4/5] RUN chmod 644 /etc/mysql/conf.d/my.cnf
#8 CACHED#9 [5/5] COPY init/*.sql /docker-entrypoint-initdb.d/
#9 CACHED#10 exporting to image
#10 exporting layers done
#10 writing image sha256:e41ca592aefc8dd1e70ed6926f764d560bbf812e811af16f0a8d854a2fd7010e done
#10 naming to harbor.host3/ruoyi/ry-mysql:39 done
#10 DONE 0.0s
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] isUnix
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ docker tag harbor.host3/ruoyi/ry-mysql:39 harbor.host3/ruoyi/ry-mysql:39
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] isUnix
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ docker push harbor.host3/ruoyi/ry-mysql:39
The push refers to repository [harbor.host3/ruoyi/ry-mysql]
f1f76fda4403: Preparing
8664e10de2b4: Preparing
300d02752ddc: Preparing
bf6dd8c03784: Preparing
441e16cac4fe: Preparing
73cb62467b8f: Preparing
337ec6bae222: Preparing
532b66f4569d: Preparing
0d9e9a9ce9e4: Preparing
4555572a6bb2: Preparing
8527ccd6bd85: Preparing
d76a5f910f6b: Preparing
8b2952eb02aa: Preparing
7ff7abf4911b: Preparing
cff044e18624: Preparing
73cb62467b8f: Waiting
337ec6bae222: Waiting
532b66f4569d: Waiting
0d9e9a9ce9e4: Waiting
4555572a6bb2: Waiting
8527ccd6bd85: Waiting
d76a5f910f6b: Waiting
8b2952eb02aa: Waiting
7ff7abf4911b: Waiting
cff044e18624: Waiting
441e16cac4fe: Layer already exists
8664e10de2b4: Layer already exists
300d02752ddc: Layer already exists
bf6dd8c03784: Layer already exists
f1f76fda4403: Layer already exists
73cb62467b8f: Layer already exists
0d9e9a9ce9e4: Layer already exists
337ec6bae222: Layer already exists
532b66f4569d: Layer already exists
4555572a6bb2: Layer already exists
7ff7abf4911b: Layer already exists
8527ccd6bd85: Layer already exists
8b2952eb02aa: Layer already exists
d76a5f910f6b: Layer already exists
cff044e18624: Layer already exists
39: digest: sha256:bdd554f007c7cf0af8a9d320e9b711e4f7a2cc32e1ed49e3ed5a7360881b69bc size: 3448
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // withDockerRegistry
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Deploy)
[Pipeline] ansiblePlaybook
[image-builder] $ ansible-playbook deploy.yml -i /etc/ansible/hosts -e ******** -e ******** -e ******** -e ansible_ssh_private_key_file=/root/.ssh/id_rsaPLAY [webservers] **************************************************************TASK [Gathering Facts] *********************************************************
ok: [host1]
ok: [host2]TASK [Login Harbor] ************************************************************
changed: [host1]
changed: [host2]TASK [Pull images] *************************************************************
changed: [host1]
changed: [host2]TASK [Stop old containers] *****************************************************
changed: [host2]
changed: [host1]TASK [Create app directory with permissions] ***********************************
ok: [host2]
ok: [host1]TASK [Copy docker-compose.yml] *************************************************
changed: [host1]
changed: [host2]TASK [Ensure docker-compose.yml exists] ****************************************
ok: [host2]
ok: [host1]TASK [Fail if docker-compose.yml does not exist] *******************************
skipping: [host1]
skipping: [host2]TASK [Start new containers] ****************************************************
changed: [host1]
changed: [host2]PLAY RECAP *********************************************************************
host1 : ok=8 changed=5 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
host2 : ok=8 changed=5 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 [Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
访问测试
host1登录若依系统
host2-登录若依系统
三 常见问题
Jenkins容器内工作目录/var/jenkins_home/workspace/image-builder
排查问题可进入容器测试遇到的问题
docker exec -it jenkins-blueocean bash
cd /var/jenkins_home/workspace/image-builder #此目录下应有从git拉取的文件
git连接和权限问题
报错 fatal: not in a git directory
表明 Jenkins 任务执行时 未在 Git 仓库目录中操作,可能由以下原因导致:
- Jenkins 任务未正确克隆仓库:Git 仓库未成功拉取到工作目录。
- 权限问题:容器内用户对工作目录无读写权限。
- Docker 组配置残留影响:之前的
--group-add
参数可能干扰了容器用户组。
# 在宿主机host0执行,确保 Jenkins 数据卷权限正确
docker run --rm -v jenkins-data:/var/jenkins_home alpine \chown -R 1000:1000 /var/jenkins_home
#进入容器执行git命令
docker exec -it jenkins-blueocean bash
cd /var/jenkins_home/workspace/image-builder
git config --global --add safe.directory '*' # 忽略目录安全警告
git clone https://gitee.com/xbd_zc/rytest.git
# 预期输出:成功克隆仓库
-
Git 安全机制升级:Git 2.35.2+ 引入了
safe.directory
检查,防止在非信任目录执行操作(避免恶意脚本攻击)。 -
用户权限变化:
- 旧启动参数中 Jenkins 可能以
jenkins
用户运行(UID=1000),工作目录所有权为1000:1000
。 - 新参数以
root
用户运行,工作目录所有权可能变为0:0
(root),Git 会认为目录不安全。
- 旧启动参数中 Jenkins 可能以
-
安全目录匹配规则:
- Git 默认只信任与当前用户匹配的目录所有权。
- 以 root 用户操作非 root 所有的目录时需显式声明安全。
# 全局信任所有目录 git config --global --add safe.directory '*'# 或仅信任 Jenkins 工作目录 git config --global --add safe.directory /var/jenkins_home/workspace/image-builder
harbor证书问题 ERROR: Could not find credentials matching harbor-creds
在 Jenkins 中添加 Harbor 凭证
Dashboard–>系统管理–>凭据–>系统–>全局凭据 (unrestricted) -->New credentials
-
点击 Add Credentials。
-
按以下参数填写:
字段 值 Scope范围 Global
全局Username用户名 你的 Harbor 用户名(如 admin
)Password密码 你的 Harbor 密码 (如Harbor12345) ID harbor-creds
(必须与 Jenkinsfile 中一致)
手动测试(host0)
docker exec -it jenkins-blueocean bash
docker login harbor.host3 -u admin -p Harbor12345
-
成功输出:
Login Succeeded
。 -
失败处理:
可能报错: x509: certificate signed by unknown authority
-
检查 Harbor 地址是否正确(
harbor.host3
是否可解析)。 -
检查 Docker 是否信任 Harbor 仓库(参考阶段一中的
insecure-registries
配置)。#在 host0/host1/host2 上配置 Docker 信任 Harbor 的 CA 证书: sudo scp root@harbor.host3:/opt/harbor/certs/ca.crt /etc/docker/certs.d/harbor.host3/ sudo systemctl restart docker # 进入容器检查证书路径,应看到 ca.crt 文件 docker exec jenkins-blueocean ls -l /etc/docker/certs.d/harbor.host3/
-
Jenkins容器无法操作Docker的权限报错
报错 permission denied while trying to connect to the Docker daemon socket
表示 Jenkins 容器内的用户无权访问宿主机的 Docker Socket。根本原因是:
宿主机上的 /var/run/docker.sock
文件权限不足。
#查看Jenkins启动容器命令# 停止并删除旧容器
docker stop jenkins-blueocean
docker rm jenkins-blueoceandocker run --name jenkins-blueocean --restart=on-failure --detach \
--user root \
--publish 8080:8080 --publish 50000:50000 \
--volume jenkins-data:/var/jenkins_home \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume /etc/docker/certs.d:/etc/docker/certs.d:ro \
--volume /etc/ansible/hosts:/etc/ansible/hosts:ro \
--volume ~/.ssh/id_rsa:/root/.ssh/id_rsa \
--volume ~/.ssh/known_hosts:/root/.ssh/known_hosts:ro \
--add-host=harbor.host3:192.168.0.223 \
myjenkins-ansible
- 使用root测试 :
--user root
- 挂载
docker.sock
文件
Jenkins Ansible和Ansible插件问题
Jenkins Pipeline 中的命令是在 容器内 执行的,因此必须在容器内安装 Ansible。
未安装会报错**
No such file or directory
**
#启动容器时动态安装
docker exec -it jenkins-blueocean bash
apt-get update && apt-get install -y ansible
exit
缺点:容器重启后需重新安装。固化到镜像(永久生效)
修改 Dockerfile:dockerfile
FROM myjenkins-blueocean:2.504.1-1
USER root
# 配置 Git 安全目录
RUN git config --global --add safe.directory '*'
# 可选:安装其他工具(如 Ansible)
RUN apt-get update && apt-get install -y ansible
USER jenkins # 切换回原用户(如果基础镜像是非 root)
一、Jenkins Ansible 插件自动安装机制解析
- 插件能力:
Ansible 插件本身 不直接安装 Ansible,但允许通过 “Installers” 配置安装逻辑(如执行 Shell 脚本或使用包管理器)。 - 核心步骤:
- 在 Jenkins 全局工具中定义 Ansible 安装方式。
- 在 Pipeline 中指定使用该工具,触发自动安装。
二、配置 Ansible 自动安装
步骤1:进入全局工具配置
- 访问
http://host0:8080/configureTools/
。 - 找到 Ansible 部分,点击 新增 Ansible。
步骤2:配置自动安装器
# 示例配置(根据你的环境调整)
Name: Auto-Install-Ansible # 自定义名称
Installers:- 选择 "Run shell command"- Command:# 适用于 Debian/Ubuntu 容器apt-get update && apt-get install -y ansible# 或使用 pip 安装# pip3 install ansible-core
步骤3:验证安装路径
- Path to ansible-playbook executable:
/usr/bin/ansible-playbook
(默认 APT 安装路径)
三、修改 Jenkinsfile 触发自动安装
更新部署阶段代码
stage('Deploy') {steps {ansiblePlaybook(playbook: 'deploy.yml',inventory: '/etc/ansible/hosts',extraVars: [harbor_user: 'admin',harbor_password: 'Harbor12345',build_number: "${BUILD_NUMBER}"],installation: 'Auto-Install-Ansible' // 引用全局工具名称)}
}
Ansible Inventory 管理和 容器内 SSH 连接问题
一、自动管理 Ansible Inventory 文件
方案1:挂载宿主机 Inventory 到容器
# 宿主机 Inventory 路径:/home/user/ansible/hosts
docker run ... \--volume /home/user/ansible/hosts:/etc/ansible/hosts:ro \myjenkins-blueocean:latest
验证:
docker exec jenkins-blueocean cat /etc/ansible/hosts
方案2:动态生成 Inventory 文件
在 Jenkins Pipeline 中动态创建:
stage('Prepare Inventory') {steps {sh '''echo "[webservers]" > inventoryecho "host1 ansible_host=192.168.0.101" >> inventoryecho "host2 ansible_host=192.168.0.102" >> inventory'''}
}
stage('Deploy') {steps {ansiblePlaybook(playbook: 'deploy.yml',inventory: 'inventory', // 使用动态生成的文件// ...)}
}
二、解决 SSH Host Key 验证失败
1. 禁用 Host Key 检查(仅限测试环境)
在 ansible.cfg
或 Playbook 中配置:
# ansible.cfg
[defaults]
host_key_checking = False
或在 Jenkinsfile 中传递参数:
ansiblePlaybook(extras: '-e ansible_ssh_common_args="-o StrictHostKeyChecking=no"'
)
2. 挂载宿主机的 known_hosts 文件
docker run ... \--volume ~/.ssh/known_hosts:/root/.ssh/known_hosts:ro \myjenkins-blueocean:latest
3. 预配置 known_hosts
在容器构建阶段添加目标主机指纹:
FROM myjenkins-blueocean:2.504.1-1
RUN mkdir -p /root/.ssh && \ssh-keyscan host1 host2 >> /root/.ssh/known_hosts
三、完整操作流程
步骤1:准备 Inventory 和 SSH 配置
-
宿主机 Inventory 文件
/home/user/ansible/hosts
:[webservers] host1 ansible_host=192.168.0.101 ansible_user=root host2 ansible_host=192.168.0.102 ansible_user=root
-
挂载 Inventory 和 SSH 密钥:
docker run --name jenkins-ansible \--volume /home/user/ansible/hosts:/etc/ansible/hosts:ro \--volume ~/.ssh/id_rsa:/root/.ssh/id_rsa \--volume ~/.ssh/known_hosts:/root/.ssh/known_hosts:ro \myjenkins-blueocean:latest
步骤2:调整 Jenkinsfile
stage('Deploy') {steps {ansiblePlaybook(playbook: 'deploy.yml',inventory: '/etc/ansible/hosts',extras: '-e ansible_ssh_private_key_file=/root/.ssh/id_rsa', // 指定私钥路径installation: 'Auto-Install-Ansible')}
}
步骤3:验证 SSH 连接
# 在容器内手动测试
docker exec -it jenkins-ansible bash
ansible webservers -m ping
# 预期输出:pong
四、关键错误排查
错误:Permission denied (publickey)
-
原因:SSH 私钥权限过宽或路径错误。
-
修复:
# 容器内执行 chmod 600 /root/.ssh/id_rsa
错误:No such file or directory
-
原因:Inventory 文件路径错误。
-
修复:
// 确认 inventory 参数路径 inventory: '/etc/ansible/hosts'
五、自动化优化建议
-
使用 Ansible Vault 管理敏感变量:
ansible-vault encrypt secrets.yml
ansiblePlaybook(extras: '--ask-vault-pass -e @secrets.yml' )
-
动态 Inventory 脚本:
stage('Generate Inventory') {steps {writeFile file: 'inventory', text: """[webservers]${env.HOST1_IP}${env.HOST2_IP}"""} }
可使用 ansible xxx -vvv
调试输出。, 进入容器执行测试
#进入容器
docker exec -it jenkins-blueocean bash
cd /var/jenkins_home/workspace/image-builderansible-playbook deploy.yml -i /etc/ansible/hosts -e harbor_user='admin' -e harbor_password='Harbor12345' -e build_number="36" -e ansible_ssh_private_key_file=/root/.ssh/id_rsa -vvv
相关文章:
【Jenkins简单自动化部署案例:基于Docker和Harbor的自动化部署流程记录】
摘要 本文记录了作者使用Jenkins时搭建的一个简单自动化部署案例,涵盖Jenkins的Docker化安装、Harbor私有仓库配置、Ansible远程部署等核心步骤。通过一个SpringBoot项目 (RuoYi) 的完整流程演示,从代码提交到镜像构建、推送、滚动更新,逐步实…...
【愚公系列】《Manus极简入门》034-跨文化交流顾问:“文化桥梁使者”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
数字滤波器应用介绍
此示例说明如何设计、分析数字过滤器并将其应用于数据。它将帮助您回答以下问题: 如何补偿滤波器引入的延迟?如何避免使信号失真?如何从信号中删除不需要的内容?如何微分信号?以及积分信号文章目录 补偿筛选引入的延迟补偿恒定滤波器延迟 如FIR引起的消除方法,末尾添零补…...
木马查杀篇—Opcode提取
【前言】 介绍Opcode的提取方法,并探讨多种机器学习算法在Webshell检测中的应用,理解如何在实际项目中应用Opcode进行高效的Webshell检测。 Ⅰ 基本概念 Opcode:计算机指令的一部分,也叫字节码,一个php文件可以抽取出…...
栈和队列复习(C语言版)
目录 一.栈的概念 二.栈的实现 三.队列的概念 四.队列的实现 五.循环队列的实现 一.栈的概念 可以将栈抽象地理解成羽毛球桶,或者理解成坐直升电梯;最后一个进去的,出来时第一个出来,并且只有一个出入口。这边需要注意的是&am…...
SDK does not contain ‘libarclite‘ at the path
Xcode16以上版本更新SDK之后就报错了。是因为缺少libarclite_iphoneos.a文件。所以需要在网上找一下该文件根据路径添加进去,arc文件可能需要新建一下。 clang: error: SDK does not contain ‘libarclite’ at the path ‘/Applications/Xcode.app/Contents/Develo…...
Kotlin跨平台Compose Multiplatform实战指南
Kotlin Multiplatform(KMP)结合 Compose Multiplatform 正在成为跨平台开发的热门选择,它允许开发者用一套代码构建 Android、iOS、桌面(Windows/macOS/Linux)和 Web 应用。以下是一个实战指南,涵盖核心概念…...
Oracle数据库全局性HANG的处理过程
如果Oracle数据库全局性HANG,首先要做的就是收集数据库HANG时的状态,只有收集到了相应状态,抓住故障现场,才可以进一步分析故障产生的可能原因。 出现此故障,一般情况下可以如此处理: 如果数据库是单节点&a…...
MySQL 8.0 OCP(1Z0-908)英文题库(21-30)
目录 第21题题目分析正确答案 第22题题目分析正确答案 第23题题目分析正确答案 第24题题目分析正确答案 第25题题目分析正确答案 第26题题目分析正确答案 第27题题目分析正确答案 第28题题目分析正确答案 第29题题目分析正确答案 第30题题目解析正确答案 第21题 Choose three.…...
beyond compare 免密钥进入使用(删除注册表)
beyond compare 免密钥进入,免费使用(删除注册表) 温馨提醒:建议仅个人使用,公司使用小心律师函警告! 1.winr 输入regedit 打开注册表 2.删除计算机 \HKEY_CURRENT_USER\Software\Scooter Software\Beyo…...
前端项目2-01:个人简介页面
目录 一.代码显示 二.效果图 三.代码分析 1. 文档声明和 HTML 基本结构 2. CSS 样式部分 全局样式 body 样式 页面主要容器 box 样式 左侧区域 l 样式 右侧区域 r 样式 左侧区域中头像容器 to 样式 头像图片样式及悬停效果 左侧区域中个人信息容器 tit 样式 个人…...
.NET 8 API 实现websocket,并在前端angular实现调用
.NET 8 API 实现websocket,并在前端angular实现调用。 后端:.NET 8 WebSocket API 实现 在 .NET 8 中,可以通过 Microsoft.AspNetCore.WebSockets 提供的支持来实现 WebSocket 功能。以下是创建一个简单的 WebSocket 控制器的步骤。 安装必…...
P2P架构
P2P 是 Peer-to-Peer(点对点) 的缩写,是一种 去中心化 的网络架构,其中每个节点(称为 “对等节点”,Peer)既是 “客户端”,也是 “服务器”,可以直接与其他节点通信、共享…...
菊厂0510面试手撕题目解答
题目 输入一个整数数组,返回该数组中最小差出现的次数。 示例1:输入:[1,3,7,5,9,12],输出:4,最小差为2,共出现4次; 示例2:输入:[90,98,90,90,1,1]…...
【25软考网工】第六章(4)VPN虚拟专用网 L2TP、PPTP、PPP认证方式;IPSec、GRE
博客主页:christine-rr-CSDN博客 专栏主页:软考中级网络工程师笔记 大家好,我是christine-rr !目前《软考中级网络工程师》专栏已经更新二十多篇文章了,每篇笔记都包含详细的知识点,希望能帮助到你!…...
C语言:深入理解指针(3)
目录 一、数组名的理解 二、用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组模拟二维数组 八、结语 一、数组名的理解 数组名其实就是首元素的地址 int arr[3] {1,2,3}; printf("arr :%p\n" ,arr); printf(…...
R语言实战第5章(1)
第一部分:数学、统计和字符处理函数 数学和统计函数:R提供了丰富的数学和统计函数,用于执行各种计算和分析。这些函数可以帮助用户快速完成复杂的数学运算、统计分析等任务,例如计算均值、方差、相关系数、进行假设检验等。字符处…...
Lodash isEqual 方法源码实现分析
Lodash isEqual 方法源码实现分析 Lodash 的 isEqual 方法用于执行两个值的深度比较,以确定它们是否相等。这个方法能够处理各种 JavaScript 数据类型,包括基本类型、对象、数组、正则表达式、日期对象等,并且能够正确处理循环引用。 1. is…...
探索边缘计算:赋能物联网的未来
摘要 随着物联网(IoT)技术的飞速发展,越来越多的设备接入网络,产生了海量的数据。传统的云计算模式在处理这些数据时面临着延迟高、带宽不足等问题,而边缘计算的出现为解决这些问题提供了新的思路。本文将深入探讨边缘…...
Ubuntu中配置【Rust 镜像源】
本篇主要记录Ubuntu中配置Rust编程环境时,所需要做的镜像源相关的配置 无法下载 Rust 工具链 通过环境变量指定 Rust 的国内镜像源(如中科大或清华源)。 方法一:临时设置镜像 export RUSTUP_DIST_SERVERhttps://mirrors.ustc.e…...
netty 客户端发送消息服务端收到消息无法打印,springBoot配合 lombok使用@Slf4j
netty 客户端发送消息服务端收到消息无法打印,springBoot配合 lombok使用Slf4j 服务端代码 Slf4j public class EventLoopServer {public static void main(String[] args) throws InterruptedException {new ServerBootstrap().group(new NioEventLoopGroup()).c…...
学习笔记:黑马程序员JavaWeb开发教程(2025.4.3)
12.1 基础登录功能 EmpService中的login方法,是根据接收到的用户名和密码,查询时emp数据库中的员工信息,会返回一个员工对象。使用了三元运算符来写返回 Login是登录,是一个业务方法,mapper接口是持久层,是…...
Spark SQL 运行架构详解(专业解释+番茄炒蛋例子解读)
1. 整体架构概览 Spark SQL的运行过程可以想象成一个"SQL查询的加工流水线",从原始SQL语句开始,经过多个阶段的处理和优化,最终变成分布式计算任务执行。主要流程如下: SQL Query → 解析 → 逻辑计划 → 优化 → 物理…...
【时时三省】(C语言基础)字符数组的输入输出
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 字符数组的输入输出可以有两种方法。 ( 1 )逐个字符输入输出。用格式符“% c”输入或输出一个字符. ( 2 )将整个字符串一次输入或输出。用“% s”格式符,意思是对字符串( strin…...
Hive HA配置高可用
Hive的高可用性(HA)通过消除关键组件的单点故障来实现,确保系统在部分故障时仍能正常运行。其基本原理涉及以下核心组件和策略: 1. Hive Metastore 的高可用 多实例部署:部署多个Metastore服务实例,每个实例连接到共享的后端数据库(如MySQL、PostgreSQ…...
Python爬虫第20节-使用 Selenium 爬取小米商城空调商品
目录 前言 一、 本文目标 二、环境准备 2.1 安装依赖 2.2 配置 ChromeDriver 三、小米商城页面结构分析 3.1 商品列表结构 3.2 分页结构 四、Selenium 自动化爬虫实现 4.1 脚本整体结构 4.2 代码实现 五、关键技术详解 5.1 Selenium 启动与配置 5.2 页面等待与异…...
重构金融数智化产业版图:中电金信“链主”之道
近日,《商学院》杂志独家专访了中电金信常务副总经理(主持经营工作)冯明刚,围绕“金融科技”“数字底座”“架构转型”“AI驱动”等议题,展开了一场关于未来架构、技术变革与系统创新的深入对话。 当下,数字…...
笔记本电脑升级实战手册【扩展篇1】:flash id查询硬盘颗粒
文章目录 前言:一、硬盘颗粒介绍1、MLC(Multi-Level Cell)2、TLC(Triple-Level Cell)3、QLC(Quad-Level Cell) 二、硬盘与主控1、主控介绍2、主流主控厂家 三 、硬盘颗粒查询使用flash id工具查…...
文档外发安全:企业数据防护的最后一道防线
在当今数字化时代,数据已成为企业最宝贵的资产之一。随着网络安全威胁日益增多,企业安装专业加密软件已从"可选"变为"必选"。本文将全面分析企业部署华途加密解决方案后获得的各项战略优势。 一、数据安全防护升级 核心数据全面保护…...
springboot集成langchain4j实现票务助手实战
前言 看此篇的前置知识为langchain4j整合springboot,以及springboot集成langchain4j记忆对话。 Function-Calls介绍 langchain4j 中的 Function Calls(函数调用)是一种让大语言模型(LLM)与外部工具(如 A…...
ZYNQ笔记(二十一): VDMA HDMI 彩条显示
版本:Vivado2020.2(Vitis) 任务:实现驱动 HDMI 显示彩条图像,同时支持输出给 HDMI 的图像分辨率可调。 目录 一、介绍 二、硬件设计 (1)DVI_Transmitter (2)Clockin…...
常用的maven插件及其使用指南
目录 1.maven官方插件列表2.两种方式调用maven插件3.常用的maven插件总结参考文献 1.maven官方插件列表 groupId为org.apache.maven.pluginshttp://maven.apache.org/plugins/index.html 2.两种方式调用maven插件 将插件目标与生命周期阶段绑定,例如maven默认将m…...
Meilisearch 安装
1.环境 rockey linux 9.2 meilisearch-linux-amd64 2.下载 访问:https://github.com/meilisearch/meilisearch/releases 下载适合自己系统版本的。 注意:我下载的不是最新版本的,因为最新版本的需要GLIBC2.35,我本地系统的是…...
用postman的时候如何区分服务器还是自己的问题?
作为测试人员,在使用Postman进行接口测试时,准确判断问题是出在服务器端还是本地环境非常重要。以下是一些实用的区分方法: 1. 基础检查方法 本地问题排查清单: ✅ 检查网络连接是否正常 ✅ 确认Postman版本是否为最新 ✅ 验证请求URL是否正确(特别是环境变量是否被正确…...
【Python算法】最长递增子序列
题目链接 方法1: 记忆化搜索 class Solution:def lengthOfLIS(self, nums: List[int]) -> int:cachedef dfs(i):res0 for j in range(i):if nums[j]<nums[i]:res max(res,dfs(j))return res1 # 返回res表示以nums[i]结尾的LIS长度return max(dfs(i) for i…...
springboot-web基础
21.web spring MVC 基于浏览器的 B/S 结构应用十分流行。Spring Boot 非常适合 Web 应用开发。可以使用嵌入式 Tomcat、Jetty、 Undertow 或 Netty 创建一个自包含的 HTTP 服务器。一个 Spring Boot 的 Web 应用能够自己独立运行,不依赖需 要安装的 Tomcat&#x…...
解构赋值
【系统学习ES6】 本专题旨在对ES6的常用技术点进行系统性梳理,帮助大家对其有更好的掌握,希望大家有所收获。 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。解构是一种打破数据结构&#x…...
Leetcode-BFS问题
LeetCode-BFS问题 1.Floodfill问题 1.图像渲染问题 [https://leetcode.cn/problems/flood-fill/description/](https://leetcode.cn/problems/flood-fill/description/) class Solution {public int[][] floodFill(int[][] image, int sr, int sc, int color) {//可以借助另一…...
AI 时代 UI 设计的未来范式
在人工智能技术持续突破的浪潮下,UI 设计领域正经历着前所未有的变革。AI 的深度介入不仅重塑了设计流程,更催生了全新的设计范式,为用户带来颠覆式的交互体验。探索 AI 时代 UI 设计的未来范式,是把握行业发展趋势的关键所在。…...
键盘输出希腊字符方法
在不同操作系统中,输出希腊字母的方法有所不同。以下是针对 Windows 和 macOS 系统的详细方法,以及一些通用技巧: 1.Windows 系统 1.1 使用字符映射表 字符映射表是一个内置工具,可以方便地找到并插入希腊字母。 • 步骤…...
[数据结构高阶]并查集初识、手撕、可以解决哪类问题?
标题:[数据结构高阶]并查集初识、手撕、可以解决哪类问题? 水墨不写bug 文章目录 一、认识并查集二、模拟实现并查集三、用并查集解决问题1、[省份的数量](https://leetcode.cn/problems/number-of-provinces/)2、[等式方程的可满足性](https://leetcode…...
BUUCTF——PYWebsite
BUUCTF——PYWebsite 进入靶场 看看基本信息 没有什么信息 扫个目录看看 http://node5.buuoj.cn:28115/.DS_Store http://node5.buuoj.cn:28115/flag.php http://node5.buuoj.cn:28115/index.html访问flag.php 提示保存购买者的IP 抓包看看 直接XFF伪造一下 X-Forwarded-F…...
【学习笔记】机器学习(Machine Learning) | 第六章(2)| 过拟合问题
机器学习(Machine Learning) 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习(Machine Learning)简要声明 解决过拟合问题一、收集更多训练数据二、选择特征三、正则化四、过拟合解决方法总结 过…...
单片机-STM32部分:13-1、编码器
飞书文档https://x509p6c8to.feishu.cn/wiki/BpEywhaX9iqbiLkdqdAcmDnwnab EC旋转编码器 在产品开发过程中,需要位置闭环的的产品,类似电机类产品来说,编码器至关重要,它不仅可以使我们对带年纪进行精确的速度闭环,位…...
浅谈大语言模型原理
1.反向传播算法 背景 反向传播算法是当前深度学习的核心技术。 神经网络 x是输入,o是输出,w是需要训练的参数(w有初始值)三层全连接的神经网络:输入层、隐藏层、输出层 激活函数 f ( x ) 1 1 x − 1 f(x)\frac…...
设计模式之中介者模式
在我们实际开发中,我们经常会遇到多个对象之间互相依赖、互相调用的场景。如果这些对象之间的耦合度太高,不仅会让系统变得难以维护,还会让扩展变得异常困难。此时,中介者模式(Mediatro)就是一种非常实用的设计方案,它…...
Matlab 空调温度时延模型的模糊pid控制
1、内容简介 Matlab 231-空调温度时延模型的模糊pid控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略中央空调温湿度采用PID控制系统的探讨.pdf 中央空调房间温度智能 PID控制的仿真研究.pdf...
RabbitMQ ③-Spring使用RabbitMQ
Spring使用RabbitMQ 创建 Spring 项目后,引入依赖: <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp --> <dependency><groupId>org.springframework.boot</groupId><artifac…...
C++修炼:模板进阶
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞,关注&am…...
Spring Boot集成RabbitMQ高级篇:可靠性与性能提升
一、环境准备 安装 RabbitMQ 在官网上下载对应操作系统的安装包(如 Windows、Linux 等),按照安装向导完成安装。 安装完成后,启动 RabbitMQ 服务。在 Windows 系统下,可以在服务列表中找到 RabbitMQ Server 并启动&am…...