当前位置: 首页 > news >正文

CICD从无到会

一 CICD是什么


CI/CD 是指持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery)

1.1 持续集成(Continuous Integration)


持续集成是一种软件开发实践,团队成员频繁地将他们的工作集成到共享的代码仓库中。其主要特点包括:

频繁提交代码:开发人员可以每天多次提交代码,确保代码库始终保持最新状态。

自动化构建:每次提交后,自动触发构建过程,包括编译、测试、静态分析等。

快速反馈:如果构建失败或测试不通过,能够快速地向开发人员提供反馈,以便及时修复问题。

1.2 持续部署(Continuous Deployment)


持续部署是在持续集成的基础上,将通过所有测试的代码自动部署到生产环境中。其特点如下:

自动化流程:从代码提交到生产环境的部署完全自动化,无需人工干预。

高频率部署:可以实现频繁的部署,使得新功能能够快速地提供给用户。

风险控制:需要有强大的测试和监控体系来确保部署的稳定性和可靠性。

1.3 持续交付(Continuous Delivery)


持续交付与持续部署类似,但不一定自动部署到生产环境,而是随时可以部署。其重点在于确保软件随时处于可发布状态。

CI/CD 的好处包括:

提高开发效率:减少手动操作和等待时间,加快开发周期。

尽早发现问题:通过频繁的集成和测试,问题能够在早期被发现和解决。

降低风险:减少了大规模部署时可能出现的问题,提高了软件的质量和稳定性。

增强团队协作:促进团队成员之间的沟通和协作,提高团队的整体效率。

常见的 CI/CD 工具包括 Jenkins、GitLab CI/CD、Travis CI 等。这些工具可以帮助团队实现自动化的构建、测试和部署流程。

二 git工具使用


2.1 git简介


Git 是一个分布式版本控制系统,被广泛用于软件开发中,以管理代码的版本和变更。 主要特点:

分布式

每个开发者都有完整的代码仓库副本,这使得开发者可以在离线状态下进行工作,并且在网络出现问题时也不会影响开发。

即使中央服务器出现故障,开发者仍然可以在本地进行开发和查看项目历史。

高效的分支管理

Git 中的分支创建和切换非常快速和简单。开发人员可以轻松地创建新的分支来进行新功能的开发或修复 bug,而不会影响主分支。

合并分支也相对容易,可以使用多种合并策略来满足不同的需求。

快速的版本回退

如果发现某个版本存在问题,可以快速回退到之前的版本。

可以查看每个版本的详细变更记录,方便了解代码的演进过程。

强大的提交管理

每个提交都有一个唯一的标识符,可以方便地引用和查看特定的提交。

提交可以包含详细的提交信息,描述本次提交的更改内容。

支持协作开发

开发者可以将自己的更改推送到远程仓库,供其他开发者拉取和合并。

可以处理多个开发者同时对同一文件进行修改的情况,通过合并冲突解决机制来确保代码的完整性。

Git必看秘籍:Git - Book

2.2 git 工作流程


Git 有三种状态:已提交(committed)、已修改(modified) 和 已暂存(staged)。

已修改表示修改了文件,但还没保存到数据库中。

已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

已提交表示数据已经安全地保存在本地数据库中。

这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录。

三 部署git


3.1 安装git


#在rhel9的系统中默认自带git
[root@CICD-node1 ~]# dnf install git  -y
 
#设定命令补全功能
[root@CICD-node1 ~]# echo "source  /usr/share/bash-completion/completions/git" >> ~/.bashrc
[root@CICD-node1 ~]# source  ~/.bashrc

3.2 初始化


获取 Git 仓库通常有两种方式:

将尚未进行版本控制的本地目录转换为 Git 仓库。

从其它服务器克隆 一个已存在的 Git 仓库。比如: git clone

初始化版本库

[root@CICD-node1 ~]# mkdir howe
[root@CICD-node1 ~]# cd howe/
 
[root@CICD-node1 howe]# git init 
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint: 
hint:     git config --global init.defaultBranch <name>
hint: 
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint: 
hint:     git branch -m <name>
Initialized empty Git repository in /root/howe/.git/
 
[root@CICD-node1 howe]# ls -a
.  ..  .git
 
[root@CICD-node1 howe]# ls .git/
branches  config  description  HEAD  hooks  info  objects  refs
 
#设定用户信息
[root@CICD-node1 howe]# git config --global user.name "howe"
[root@CICD-node1 howe]# git config --global user.email "howe@exam.com"
 
#查看当前文件状态
[root@CICD-node1 howe]# git status 
On branch master
 
No commits yet
 
nothing to commit (create/copy files and use "git add" to track)
 
[root@CICD-node1 howe]# git status -s    #简化输出

警告:.git目录是git跟踪管理版本库的,没事别瞎溜达!

四 git的使用方法


4.1 常用方法


[root@CICD-node1 howe]# echo superme > README.md 
[root@CICD-node1 howe]# git status 
On branch master
 
No commits yet
 
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    README.md
 
nothing added to commit but untracked files present (use "git add" to track)
 
[root@CICD-node1 howe]# git status -s
?? README.md                #??    新建文件未添加到版本库
 
[root@CICD-node1 howe]# git add README.md 
[root@CICD-node1 howe]# git status -s
A  README.md                #A 已添加到暂存区
 
#提交暂存区的数据
[root@CICD-node1 howe]# git commit -m "add README.md"
[master (root-commit) 2b36cab] add README.md
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
 
[root@CICD-node1 howe]# git status -s            #无任何显示,标识已经提交到版本库
 
#再次修改
[root@CICD-node1 howe]# vim README.md 
[root@CICD-node1 howe]# cat README.md 
superme
superme
 
[root@CICD-node1 howe]# git status -s
 M README.md                        #_M 右边的M表示文件在工作区被修改
 
#撤销修改
[root@CICD-node1 howe]# git checkout -- README.md
从索引区更新了 1 个路径
[root@CICD-node1 howe]# cat README.md 
superme
 
#重新修改
[root@CICD-node1 howe]# echo howe > README.md 
[root@CICD-node1 howe]# git add README.md 
[root@CICD-node1 howe]# git status -s
M  README.md                #M_ 左M表示文件已经在版本库中并被跟踪
 
#从暂存区撤销
[root@CICD-node1 howe]# git restore --staged README.md 
[root@CICD-node1 howe]# git status -s
 M README.md
 
#重新提交
[root@CICD-node1 howe]# git add README.md 
[root@CICD-node1 howe]# git status -s
M  README.md
 
#更新
[root@CICD-node1 howe]# git commit -m "update v1"
[master a6318aa] update v1
 1 file changed, 1 insertion(+), 1 deletion(-)
[root@CICD-node1 howe]# git status -s
 
#更新文件
[root@CICD-node1 howe]# echo hahaha >> README.md 
[root@CICD-node1 howe]# git add README.md 
[root@CICD-node1 howe]# echo xixixi >> README.md 
[root@CICD-node1 howe]# git status -s
MM README.md                #MM表示有一部分在暂存区,还有一部分没有提交
 
#如果现在提交只能提交在暂存区中的部分
[root@CICD-node1 howe]# git commit -m "update v2"
[master 3381f25] update v2
 1 file changed, 1 insertion(+)
[root@CICD-node1 howe]# git status -s
 M README.md                #右M还在
 
#查看已暂存和未暂存的修改变化
[root@CICD-node1 howe]# echo hehehe >> README.md 
[root@CICD-node1 howe]# git diff
diff --git a/README.md b/README.md
index 9f19a78..9a1a9d2 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,4 @@
 howe
 hahaha
+xixixi
+hehehe
 
#跳过使用暂存区,只能在提交过的在版本库中存在的文件使用如果文件状态是“??”不能用此方法
[root@CICD-node1 howe]# git commit -a -m "update v3"
[master 365b7bf] update v3
 1 file changed, 1 insertion(+)
 
#撤销工作区中删除动作
[root@CICD-node1 howe]# touch lee.txt
[root@CICD-node1 howe]# git add lee.txt
[root@CICD-node1 howe]# git commit -m "add lee.txt"
[master c6189a6] add lee.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 lee.txt
 
[root@CICD-node1 howe]# rm lee.txt 
rm: remove regular empty file 'lee.txt'? y
[root@CICD-node1 howe]# git status -s
 D lee.txt                    #右D表示文件在工作区被删除
 
[root@CICD-node1 howe]# git checkout -- lee.txt        #恢复被删除文件
[root@CICD-node1 howe]# ls
lee.txt  README.md
 
#从版本库中删除文件
[root@CICD-node1 howe]# git rm lee.txt 
rm 'lee.txt'
[root@CICD-node1 howe]# git status -s
D  lee.txt                #左D表示文件删除动作被提交到暂存区
 
[root@CICD-node1 howe]# git commit -m "delete lee.txt"
[master ed13788] delete lee.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 lee.txt
 
#恢复从版本库中被删除的文件
[root@CICD-node1 howe]# git log        查看日志
 
[root@CICD-node1 howe]# git reflog 
ed13788 (HEAD -> master) HEAD@{0}: commit: delete lee.txt
c6189a6 HEAD@{1}: commit: add lee.txt
365b7bf HEAD@{2}: commit: update v3
31bea73 HEAD@{3}: commit: update v2
fed7d84 HEAD@{4}: commit: add test.txt
2590b49 HEAD@{5}: commit: delete file.txt
9f79896 HEAD@{6}: commit: add file.txt
d9268c2 HEAD@{7}: commit: add howe.txt
30766d4 HEAD@{8}: commit: update v3
3381f25 HEAD@{9}: commit: update v2
a6318aa HEAD@{10}: commit: update v1
2b36cab HEAD@{11}: commit (initial): add README.md
 
 
#版本回退到删除之前
[root@CICD-node1 howe]# git reset --hard c6189a6
HEAD is now at c6189a6 add lee.txt
[root@CICD-node1 howe]# ls
lee.txt  README.md  test.txt

4.2 git对于文件如何忽略


在做软件开发时对源码编译会产生一些临时文件,我们在提交时需要忽略这些临时文件

[root@CICD-node1 howe]# mkdir dir1/
[root@CICD-node1 howe]# touch dir1/.file2
[root@CICD-node1 howe]# git status -s
?? dir1/
 
[root@CICD-node1 howe]# echo .file1 > /gitignore
[root@CICD-node1 howe]# git status -s
?? .gitignore
?? dir1/
 
[root@CICD-node1 howe]# echo ".*" > /gitignore 
[root@CICD-node1 howe]# git status -s
[root@CICD-node1 howe]# 
五 gitlab代码仓库
5.1 gitlab简介


GitLab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 web 服务。

GitLab 具有很多功能,比如代码托管、持续集成和持续部署(CI/CD)、问题跟踪、合并请求管理等。它可以帮助开发团队更好地协作开发软件项目,提高开发效率和代码质量。

官网:https://about.gitlab.com/install/

中文站点: GitLab下载安装_GitLab安装和配置_GitLab最新中文官网免费版下载-极狐GitLab

官方包地址:gitlab/gitlab-ce - Packages · packages.gitlab.com

5.2 gitlab 的部署实施


5.2.1 部署gitlab


部署gitlab需要内存大于4G

#在安装包之前需配置好软件仓库来解决依赖性
[root@CICD-node1 ~]# yum install -y curl policycoreutils-python openssh-server perl
 
[root@CICD-node1 ~]# ls
gitlab-ce-17.1.6-ce.0.el9.x86_64.rpm
[root@CICD-node1 ~]# dnf install gitlab-ce-17.1.6-ce.0.el9.x86_64.rpm -y

5.2.2 配置gitlab


#修改配置文件
[root@CICD-node1 ~]# cd /etc/gitlab/
[root@CICD-node1 gitlab]# ls
gitlab.rb
[root@CICD-node1 gitlab]# vim gitlab.rb
32 external_url 'http://172.25.250.10'
 
#修改配置文件后需利用gitlab-crt来生效,
[root@CICD-node1 gitlab]# gitlab-ctl reconfigure
 
#执行命令成功后会把所有组件全部启动起来
5.2.3 登陆gitlab
用户名默认为 root 。如果在安装过程中指定了初始密码,则用初始密码登录,如果未指定密码,则系统会随机生成一个密码并存储在 /etc/gitlab/initial_root_password文件中, 查看随机密码并使用 root 用户名登录。

注意:出于安全原因,24 小时后,/etc/gitlab/initial_root_password会被第一次 gitlab-ctl reconfigure 自动删除,因此若使用随机密码登录,建议安装成功初始登录成功之后,立即修改初始密码。

#查看原始密码
[root@CICD-node1 gitlab]# cat /etc/gitlab/initial_root_password 
# WARNING: This value is valid only in the following conditions
#          1. If provided manually (either via `GITLAB_ROOT_PASSWORD` environment variable or via `gitlab_rails['initial_root_password']` setting in `gitlab.rb`, it was provided before database was seeded for the first time (usually, the first reconfigure run).
#          2. Password hasn't been changed manually, either via UI or via command line.
#
#          If the password shown here doesn't work, you must reset the admin password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password.
 
Password: oeBO3vlL00XzqJSv3RjliicyU0RAyKupuj6boCV1yAk=        #密码
 
# NOTE: This file will be automatically deleted in the first reconfigure run after 24 hours.
[!WARNING]

注意:出于安全原因,24 小时后,/etc/gitlab/initial_root_password 会被第一次 gitlab-ctl reconfigure 自动删除,因此若使用随机密码登录,建议安装成功初始登录成功之后,立即修改初始密码。

登陆

设置语言

设置密码

5.3 在gitlab中新建项目


#生成sshd密钥
[root@CICD-node1 ~]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:tD/HEFuyQqQtzHrhJSMYoH1Uri+kI47/nnG3nLivhug root@CICD-node1.exam.com
The key's randomart image is:
+---[RSA 3072]----+
|... ... .        |
|.. + + +         |
|. o o X = o .    |
|   . = O . *     |
|    + o S +      |
|   o o   o o     |
|. o.o.o . o o    |
|o....=.+ o o     |
|.+Eo+.++=        |
+----[SHA256]-----+
[root@CICD-node1 ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCPwT7M13rAjGvO9rRXBC6Ux79CwlUb9NKcJZ6Z2t/1nSmT3Wv2akV3n1jF9Ja+AiBPOe8T25D8nlD4GVtieNLIk0oelESkzvjdPjVMajVPmOERvM5y5IK0EAxJnLi2tOp1IQBEXT6MoKdOuljOTAtYQT7rxg3522L1YIoxrTe4CTK1ECu8IHJRIADGjE55mm4+CG+DVt2qJa8QxCfKeLbxq+Us2lXtuTbs1trOQMlzpVE2IwmSwdGsuowchuv25bJwwwPq/R4dQm1xyKLl7epLVhjxaeD9vr1jv1JL1M62u3Wrsk1vkNGutj0oB2Lr82Q9Uhkd7mRTB6Ny7zC3qDBC6DQCNaZ2ohtmqXPPyh5zOmiGkjDLH/e1U/mizjML80SYwlpCvtoVZqE0NZ83HeT1+VEQayypl7NTxyrO50L2piNtymntHheXc2Dn8ke6wHZGCGJNH6uGvIa1REbQonPuc18SEIFdxaE360k4mclacT1mjhxd5bFuClEXN2PFwLM= root@CICD-node1.exam.com

上传公钥到gitlab中

下载项目

[root@CICD-node1 ~]# git clone git@172.25.250.10:/root/superhowe.git
Cloning into 'superhowe'...
The authenticity of host '172.25.250.10 (172.25.250.10)' can't be established.
ED25519 key fingerprint is SHA256:0KxVks073rJRW4wBFxu4/GJQrfD2k8n22qHtN6e7K7c.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:1: 172.25.250.105
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.25.250.10' (ED25519) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3 (from 1)
Receiving objects: 100% (3/3), done.
 
[root@CICD-node1 ~]# ls -R
.:
howe  
 
./howe:
dir1  lee.txt  README.md  test.txt
 
./SuperHowe:
README.md
 
 
[root@CICD-node1 ~]# cd superhowe/
[root@CICD-node1 superhowe]# ls
README.md
 
[root@CICD-node1 superhowe]# git remote -v
origin    git@172.25.250.10:/root/superhowe.git (fetch)
origin    git@172.25.250.10:/root/superhowe.git (push)
 
 
#文件提交
[root@CICD-node1 superhowe]# echo welcome > superhowe
[root@CICD-node1 superhowe]# git add superhowe
[root@CICD-node1 superhowe]# git commit -m "add superhowe"
[main 12784d0] add superhowe
 1 file changed, 1 insertion(+)
 create mode 100644 superhowe
[root@CICD-node1 superhowe]# git push -u origin main
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 274 bytes | 274.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To 172.25.250.10:/root/superhowe.git
   a0b2b94..12784d0  main -> main
branch 'main' set up to track 'origin/main'.

六 jenkins


6.1 jenkins 简介


Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。

Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行

CI(Continuous integration持续集成)持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。

CD(Continuous Delivery持续交付) 是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中

6.2 部署 jenkins


软件下载:Download and deploy

[WARNING]

jenkins需要部署在新的虚拟机中
建议最少4G内存,4核心cpu
#安装依赖包
[root@jenkins ~]# yum install fontconfig java-17-openjdk git -y
 
#安装jenkins
[root@jenkins ~]# ls
jenkins-2.462.2-1.1.noarch.rpm
[root@jenkins ~]# dnf install jenkins-2.476-1.1.noarch.rpm 
 
#启动jenkins
[root@jenkins ~]# systemctl enable --now jenkins.service
 
#查看原始密码
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword 
b9461bbe81854d4d851a4ecd46216749
部署插件

#注意端口为8080
[root@jenkins ~]# netstat -lntup | jenkins 
Caused: java.io.IOException: Failed to bind to 0.0.0.0/0.0.0.0:8080
 
网页访问172.25.250.150:8080


建议修改admin的密码,在admin的设置中修改即可

6.3 jenkins 与gitlab的整合


这个错误的原因是因为本机没有gitlab上的sshkey

[root@jenkins ~]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:PnpP1ZB1ZFjPjMTokoXtWp0QwHD8kQj8M0p5XgdrkMg root@jenkins.exam.com
The key's randomart image is:
+---[RSA 3072]----+
|       oo*o*.=o+=|
|        E.B O+o*.|
|         o Bo*..+|
|        o B Oo+  |
|       .S+ O...  |
|       .. o.     |
|        o .      |
|       ..o       |
|      .. ..      |
+----[SHA256]-----+
[root@jenkins ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDGvXaZaxNw3IkX1buNDhOci6jz+3eNixBd2sBP25qr65sK2bdTgR44BYb0lxd7g2UPu6tUwaAqqAlcWPFOw4jQi+jHNA8W4vdowozYIivsHySabGS7kcJSxZIE0KIdDhNmei02/zpoQNoxxOdenkrxP2Gj/syjIXIEn5YaPONl8wji50lBiEbTESkfFmNPt8Rnew+XkqBt9UGPvzoTZj5pknang8Z2CWxjH+G41cXTOgvTPGw9rV9hJdLPzWRJ36qcAcge+HBhCEgwboELDZalXr6QPPykOMbUFu8C/dkDcH/jjmLiCfw/skzu5/QqzV2dNXfdXcQ5Zc+D3kMjRRR6CViU37FoxDzvEYo4U/XdKVLdT4kprGY8yWwyoFZx6Bu8qqYYvmjDpowmQjXH0fJkAXBuVrIz9rNVMAJjAPguFF+cG+Y5rX77hlMQst3tA/VC8S+4eI881IH2VlAylIzdCi17jLYskBzV+5BgkuNkSIYnICRyjS5aDBwpTKnp980= root@jenkins.exam.com

把此密钥添加到gitlab上即可

添加密钥凭据

#查看本机私钥
[root@jenkins ~]# cat .ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----

添加完成后报错依然存在,因为ssh首次连接主机是需要签名认证,需要手动输入yes

还有两主机之间要做好解析

[root@jenkins ~]# vim /etc/ssh/ssh_config
20   Host *
33     StrictHostKeyChecking no

相关文章:

CICD从无到会

一 CICD是什么 CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 1.1 持续集成&#xff08;Continuous Integration&#xff09; 持续集成是…...

责任链模式优化 文章发布的接口(长度验证,敏感词验证,图片验证等环节) 代码,示例

需求&#xff1a;后端需要提供一个文章发布的接口&#xff0c;接口中需要先对文章内容进行如下校验&#xff0c;校验通过后才能发布 1. 文章长度不能超过1万个字符 2. 不能有敏感词 3. 文章中图片需要合规 责任链相当于一个链条一样&#xff0c;链条上有很多节点&#xff0c;节…...

Java流程控制语句——条件控制语句详解(附有流程图)#Java条件控制语句有哪些?#if-else、switch

在 Java 编程中&#xff0c;条件控制语句用于控制程序的执行路径&#xff0c;决定根据某些条件来选择执行某段代码或跳过某段代码。它们是 Java 编程的重要组成部分&#xff0c;帮助开发者根据不同的输入、状态或数据流来编写更加灵活和动态的代码。在本文中&#xff0c;我们将…...

十一、SOA(SOA的具体设计模式)

我们现在深入学习SOA的具体设计模式。SOA架构中的设计模式主要是指导服务如何设计、实现、部署和管理&#xff0c;确保服务的松耦合、高可用性、扩展性和复用性。SOA常见的设计模式可以分为以下几类&#xff1a; 1. 服务层次设计模式 1.1. 基础服务&#xff08;Fundamental S…...

Mybatis原理

一. 为什么要使用Mybatis? 1.1 jdbc的使用步骤 首先&#xff0c;在pox.xml中引入MySQl驱动的依赖 第一步, Class.forName 注册驱动 第二步&#xff0c;获取一个Connection。 第三步&#xff0c;创建一个Statement对象。 第四步&#xff0c;execute()方法执行SQL。execute()方…...

黑马头条day3-2 自媒体文章管理

前边还有一个 素材列表查询 没什么难度 就略过了 查询所有频道和查询自媒体文章也是和素材列表查询类似 就是普通的查询 所以略过了 文章发布 这个其实挺复杂的 一共三张表 一个文章表 一个素材表 一个文章和素材的关联表 区分修改与新增就是看是否存在id 如果是保存草稿…...

JinDouYun性能测试工具使用方法

1.功能介绍 2. 安卓端支持安卓6及以上的版本&#xff0c;ios支持大部分版本 3. 可以测试游戏&#xff0c;视频&#xff0c;普通应用的性能数据&#xff0c;数据精准&#xff0c;低延迟&#xff0c;无侵入 4.工具下载链接 筋斗云 5.后续功能添加&#xff0c;高版本支持&…...

操作系统 | 学习笔记 | | 王道 | 5.3 磁盘和固态硬盘

5.3 磁盘和固态硬盘 5.3.1 磁盘 磁盘结构 磁盘&#xff1a;磁盘的表面由一些磁性物质组成&#xff0c;可以用这些磁性物质来记录二进制数据 磁道&#xff1a;磁盘的盘面被划分成一个个磁道。这样的一个“圈”就是一个磁道 扇区&#xff1a;一个磁道又被划分成一个个扇区&am…...

【Oauth2整合gateway网关实现微服务单点登录】

文章目录 一.什么是单点登录&#xff1f;二.Oauth2整合网关实现微服务单点登录三.时序图四.代码实现思路1.基于OAuth2独立一个认证中心服务出来2.网关微服务3产品微服务4.订单微服务5.开始测试单点登录 一.什么是单点登录&#xff1f; 单点登录&#xff08;Single Sign On&…...

WEB领域是不是黄了还是没黄

进入2024年后&#xff0c;WEB领域大批老表失业&#xff0c;一片哀嚎&#xff0c;个个饿的鬼叫狼嚎&#xff0c;为啥呢&#xff0c;下面是我个人的见解和看法。 中国程序员在应用层的集中 市场需求&#xff1a;中国的互联网行业在过去几年中经历了爆炸性增长&#xff0c;尤其是…...

Android系统:系统架构

文章目录 分层设计分块设计总结 分层设计 自上而下分为&#xff1a;应用层、应用架构层、系统运行层、硬件抽象层、Linux内核层 应用层 封装一系列系统App 应用架构层(Framework) 封装一系列运行App需要的Java框架 提供App开发需要的API 系统运行层(Libraries) 封装一系…...

NCNN 源码(1)-模型加载-数据预处理-模型推理

参考 ncnn 第一个版本的代码。 0 整体流程 demo&#xff1a;squeezenet ncnn 自带的一个经典 demo&#xff1a;squeezenet 的代码: // 网络加载 ncnn::Net squeezenet; squeezenet.load_param("squeezenet_v1.1.param"); squeezenet.load_model("squeezenet_…...

重修设计模式-结构型-享元模式

重修设计模式-结构型-享元模式 复用不可变对象&#xff0c;节省内存 享元模式&#xff08;Flyweight Pattern&#xff09;核心思想是通过共享对象方式&#xff0c;达到节省内存和提高性能的目的。享元对象需是不可变对象&#xff0c;因为它会被多处代码共享使用&#xff0c;要避…...

JavaScript 运算符

JavaScript 中的运算符可以根据其功能和用途分为几类。以下是主要的运算符类型及其用法&#xff1a; 1. 算术运算符 用于执行基本的数学运算。 : 加法 let sum 5 3; // 8- : 减法 let difference 5 - 3; // 2* : 乘法 let product 5 * 3; // 15/ : 除法 let quotient 5…...

3.js - 运动曲线

这个球&#xff0c;绕着这个红色的线圈转 代码 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControlslet scene,camera,renderer,controls nulllet moon,earth null// 根据&#xff0c;一系列的点&#xff0c;创建曲线 le…...

免费ppt模板哪里找?职场必备这些利器

一眨眼&#xff0c;9月份的尾声渐近&#xff0c;无论是学生还是职场人士&#xff0c;都开始准备着新一轮的演讲和报告。在这个忙碌的时期&#xff0c;一份精美的PPT模板能够大幅提升你的工作效率&#xff0c;让你的演示更加引人入胜。 不用担心高昂的版权费用&#xff0c;市场…...

wampserve 配置本地域名,出现错误

概述 今天更换了电脑&#xff0c;在本地安装和配置docker的时候&#xff0c;想用自定义域名访问NGINX容器&#xff0c;127.0.0.1和localhost都可以访问&#xff0c;但是自定义域名无法访问&#xff0c; 接着去捯饬已经使用的wampserver的集成环境&#xff0c;出现了同样的问题…...

MySQL慢查询优化指南

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 当遇到慢查询问题时&#xff0c;不仅影响服务效率&#xff0c;还可能成为系统瓶颈。作为一位软件工程师&#xff0c;掌握MySQL慢查询优化技巧至关重要。今天&#xff0c;我们就来一场“数据库加速之旅…...

怎么录制游戏视频?精选5款游戏录屏软件

对于热爱游戏的你来说&#xff0c;记录游戏中的精彩瞬间并分享给朋友或粉丝&#xff0c;无疑是一种享受。然而&#xff0c;在众多录屏软件中&#xff0c;如何选择最适合你的那一款&#xff1f;今天&#xff0c;我们就为大家精选了五款游戏录屏软件&#xff0c;需要的朋友快来选…...

论文阅读 - MDFEND: Multi-domain Fake News Detection

https://arxiv.org/pdf/2201.00987 目录 ABSTRACT INTRODUCTION 2 RELATED WORK 3 WEIBO21: A NEW DATASET FOR MFND 3.1 Data Collection 3.2 Domain Annotation 4 MDFEND: MULTI-DOMAIN FAKE NEWS DETECTION MODEL 4.1 Representation Extraction 4.2 Domain Gate 4.…...

LabVIEW软件出现Bug如何解决

在LabVIEW开发中&#xff0c;程序出现bug是不可避免的。无论是小型项目还是复杂系统&#xff0c;调试与修复bug都是开发过程中的重要环节。下文介绍如何有效解决LabVIEW软件中的bug&#xff0c;包括常见错误类型、调试工具、错误处理机制。 1. 常见Bug类型分析 在LabVIEW中&am…...

【数据结构-栈】力扣844. 比较含退格的字符串

给定 s 和 t 两个字符串&#xff0c;当它们分别被输入到空白的文本编辑器后&#xff0c;如果两者相等&#xff0c;返回 true 。# 代表退格字符。 注意&#xff1a;如果对空文本输入退格字符&#xff0c;文本继续为空。 示例 1&#xff1a; 输入&#xff1a;s “ab#c”, t “…...

DataFrame生成excel后为什么多了一行数字

问题描述 python查询数据生成excel文件&#xff0c;生成的excel多了第一行数字索引&#xff0c;1,2,3,4,5...... 代码&#xff1a; df pd.DataFrame(data)df.to_excel(filename, sheet_name用户信息表, indexFalse) 解决&#xff1a; 原理也很简单&#xff0c;就是设置个参…...

linux 内存屏障(barrier)分析

谈起内存屏障,大家感觉这个"玩意儿"很虚,不太实际,但是内核代码中又广泛地可以看到起身影。内存屏障,英文barrier,这个"玩意儿"它还不太好去定义它。barrier,中文翻译为栅栏&#xff0c;栅栏大家都见过,现实生活中就是防止他人或者动物非法闯入而用来进行隔…...

【人工智能】Transformers之Pipeline(十九):文生文(text2text-generation)

目录 一、引言 二、文生文&#xff08;text2text-generation&#xff09; 2.1 概述 2.2 Flan-T5: One Model for ALL Tasks 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数 ​​​​​​​ 2.3.3 pipeline返回参数 ​​​​​​​​​​​…...

如何使用ssm实现基于VUE的儿童教育网站的设计与实现+vue

TOC ssm676基于VUE的儿童教育网站的设计与实现vue 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全…...

MODBUS TCP 转 CANOpen

产品概述 SG-TCP-COE-210 网关可以实现将 CANOpen 接口设备连接到 MODBUS TCP 网络中。用户不需要了解具体的 CANOpen 和 Modbus TCP 协议即可实现将CANOpen 设备挂载到 MODBUS TCP 接口的 PLC 上&#xff0c;并和 CANOpen 设备进行数据交互。 产品特点 &#xf…...

vue2+elementUI实现handleSelectionChange批量删除-前后端

功能需求&#xff1a;实现选中一个或多个执行批量删除操作 在elementUI官网选择一个表格样式模板&#xff0c;Element - The worlds most popular Vue UI framework 这里采用的是 将代码复制到前端&#xff0c;这里是index.vue <template><el-button type"dang…...

LLMs之OCR:llm_aided_ocr(基于LLM辅助的OCR项目)的简介、安装和使用方法、案例应用之详细攻略

LLMs之OCR&#xff1a;llm_aided_ocr(基于LLM辅助的OCR项目)的简介、安装和使用方法、案例应用之详细攻略 目录 llm_aided_ocr的简介 1、特性 2、详细技术概览 PDF处理和OCR PDF到图像转换 OCR处理 文本处理流程 分块创建 错误校正与格式化 重复内容移除 标题和页码…...

低代码平台后端搭建-阶段完结

前言 最近又要开始为跳槽做准备了&#xff0c;发现还是写博客学的效率高点&#xff0c;在总结其他技术栈之前准备先把这个专题小完结一波。在这一篇中我又试着添加了一些实际项目中可能会用到的功能点&#xff0c;用来验证这个平台的扩展性&#xff0c;以及总结一些学过的知识。…...