CICD 持续集成与持续交付

news2024/11/16 2:57:28

目录

一 CICD是什么

1.1 持续集成(Continuous Integration)

1.2 持续部署(Continuous Deployment)

1.3 持续交付(Continuous Delivery)

二 git工具使用

2.1 git简介

2.2 git 工作流程

三 部署git

3.1 安装git

3.2 初始化

四 git的使用方法

4.1 常用方法

4.1 常用方法

4.2 git对于文件如何忽略

五 gitlab代码仓库

5.1 gitlab简介

5.2 gitlab 的部署实施

5.2.1 部署gitlab

5.2.2 配置gitlab

5.2.3 登陆gitlab

5.3 在gitlab中新建项目

六 jenkins

6.1 jenkins 简介

6.2 部署 jenkins

6.3 jenkins 与gitlab的整合


一 CICD是什么

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

1.1 持续集成(Continuous Integration)

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

  1. 频繁提交代码:开发人员可以每天多次提交代码,确保代码库始终保持最新状态。
  2. 自动化构建:每次提交后,自动触发构建过程,包括编译、测试、静态分析等。
  3. 快速反馈:如果构建失败或测试不通过,能够快速地向开发人员提供反馈,以便及时修复问题。

1.2 持续部署(Continuous Deployment)

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

  1. 自动化流程:从代码提交到生产环境的部署完全自动化,无需人工干预。
  2. 高频率部署:可以实现频繁的部署,使得新功能能够快速地提供给用户。
  3. 风险控制:需要有强大的测试和监控体系来确保部署的稳定性和可靠性。

1.3 持续交付(Continuous Delivery)

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

CI/CD 的好处包括:

  1. 提高开发效率:减少手动操作和等待时间,加快开发周期。
  2. 尽早发现问题:通过频繁的集成和测试,问题能够在早期被发现和解决。
  3. 降低风险:减少了大规模部署时可能出现的问题,提高了软件的质量和稳定性。
  4. 增强团队协作:促进团队成员之间的沟通和协作,提高团队的整体效率。

常见的 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@getlab-node1 ~]# dnf install git  -y
[root@getlab-node1 ~]# mkdir zhang
[root@getlab-node1 ~]# cd zhang/


#设定命令补全功能
[root@getlab-node1 zhang]# echo "source  /usr/share/bash-completion/completions/git" >> ~/.bashrc
[root@getlab-node1 zhang]# source  ~/.bashrc

3.2 初始化

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

  • 将尚未进行版本控制的本地目录转换为 Git 仓库。
  • 从其它服务器克隆 一个已存在的 Git 仓库。比如: git clone

初始化版本库

[root@getlab-node1 zhang]# git init
提示:使用 'master' 作为初始分支的名称。这个默认分支名称可能会更改。要在新仓库中
提示:配置使用初始分支名,并消除这条警告,请执行:
提示:
提示:	git config --global init.defaultBranch <名称>
提示:
提示:除了 'master' 之外,通常选定的名字有 'main'、'trunk' 和 'development'。
提示:可以通过以下命令重命名刚创建的分支:
提示:
提示:	git branch -m <name>
已初始化空的 Git 仓库于 /root/zhang/.git/

#设定用户信息
[root@getlab-node1 zhang]# git config --global user.name "haha"
[root@getlab-node1 zhang]# git config --global user.email "haha@qq.com"

[root@getlab-node1 zhang]# ls -a
.  ..  .git
[root@getlab-node1 zhang]# ls ./.git/
branches  config  description  HEAD  hooks  info  objects  refs

#查看文件状态
[root@getlab-node1 zhang]# git status 
位于分支 master

尚无提交

无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)

[root@getlab-node1 zhang]# git status -s		#简化输出

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

四 git的使用方法

4.1 常用方法

4.1 常用方法

#提交到暂存区
git add README.md 

#提交暂存区的数据
git commit -m "add README.md"

 #撤销修改
git checkout -- README.md

#从暂存区撤销
git restore --staged README.md 

#撤销工作区中删除动作
git checkout -- haha.txt

#查看提交动作
git reflog   

#版本回退到删除之前
git reset 33c058b
[root@getlab-node1 zhang]# echo haha > README.md
[root@getlab-node1 zhang]# git status 
位于分支 master

尚无提交

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)
	README.md

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

[root@getlab-node1 zhang]# git status -s
?? README.md          #??	新建文件未添加到版本库

#提交到暂存区
[root@getlab-node1 zhang]# git add README.md 
[root@getlab-node1 zhang]# git status -s
A  README.md              #A 已添加到暂存区

#提交暂存区的数据
[root@getlab-node1 zhang]# git commit -m "add README.md"
[master(根提交) 1f98d1a] add README.md
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
[root@getlab-node1 zhang]# git status -s    #无任何显示,标识已经提交到版本库

#再次修改
[root@getlab-node1 zhang]# echo >> README.md 

[root@getlab-node1 zhang]# git status -s
 M README.md                        #右M 表示文件在工作区被修改

#提交到暂存区
[root@getlab-node1 zhang]# git add README.md 
[root@getlab-node1 zhang]# git status -s
M  README.md

#提交暂存区的数据
[root@getlab-node1 zhang]# git commit -m "README.md v2"
[master 8a9949f] README.md v2
 1 file changed, 1 insertion(+)
[root@getlab-node1 zhang]# git status -s

#查看已暂存和未暂存的修改变化
git diff

再次修改

[root@getlab-node1 zhang]# vim README.md
haha

haha

[root@getlab-node1 zhang]# git status -s
 M README.md             #右M 表示文件在工作区被修改

 #撤销修改
[root@getlab-node1 zhang]# git checkout -- README.md
[root@getlab-node1 zhang]# cat README.md 
haha

#从新修改
[root@getlab-node1 zhang]# echo haha> README.md
[root@getlab-node1 zhang]# git add README.md 
[root@getlab-node1 zhang]# git status -s
M  README.md          #左M表示文件已经在版本库中并被跟踪,

#从暂存区撤销
[root@getlab-node1 zhang]# git restore --staged README.md 
[root@getlab-node1 zhang]# git status -s
 M README.md

#从新提交
[root@getlab-node1 zhang]# git add README.md
[root@getlab-node1 zhang]# git status -s
M  README.md

#更新
[root@getlab-node1 zhang]# git commit -m "update v1"
[master e51ef6c] update v1
 1 file changed, 1 deletion(-)
[root@getlab-node1 zhang]# git status -s


#更新文件
[root@getlab-node1 zhang]# echo haha >> README.md
[root@getlab-node1 zhang]# git add README.md
[root@getlab-node1 zhang]# echo haha >> README.md
[root@getlab-node1 zhang]# git status -s
MM README.md                    #MM表示有一部分在暂存区,还有一部分没有提交

#如果现在提交只能提交在暂存区中的部分
[root@getlab-node1 zhang]# git commit -m "update v2"
[master 63411dc] update v2
 1 file changed, 1 insertion(+)
[root@getlab-node1 zhang]# git status -s
 M README.md               #右M还在

#查看已暂存和未暂存的修改变化
[root@getlab-node1 zhang]# git diff
diff --git a/README.md b/README.md
index f247ec3..6b10261 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,4 @@
 haha
 haha
+haha
+haha

#跳过使用暂存区,只能在提交过的在版本库中存在的文件使用如果文件状态是“??”不能用此方法
[root@getlab-node1 zhang]# git commit -a -m "update v3"
[master b2ed96f] update v3
 1 file changed, 2 insertions(+)

#撤销工作区中删除动作
[root@getlab-node1 zhang]# touch haha.txt
[root@getlab-node1 zhang]# git add haha.txt
[root@getlab-node1 zhang]# git commit  -m "add haha.txt"
[master 33c058b] add haha.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 haha.txt
[root@getlab-node1 zhang]# git status -s
[root@getlab-node1 zhang]# git checkout -- haha.txt
[root@getlab-node1 zhang]# ls
haha.txt  README.md

#从版本库中删除文件
[root@getlab-node1 zhang]# git rm haha.txt
rm 'haha.txt'
[root@getlab-node1 zhang]# git status -s
D  haha.txt        #左D表示文件删除动作被提交到暂存区

[root@getlab-node1 zhang]# git commit -m "delete haha.txt"
位于分支 master
无文件要提交,干净的工作区
[root@getlab-node1 zhang]# git status -s


#恢复从版本库中被删除的文件
[root@getlab-node1 zhang]# git log    #查看操作日志
commit 1282fe5f0af2892ec977a646cf54a519b4e15cb1 (HEAD -> master)
Author: haha <haha@qq.com>
Date:   Thu Sep 12 19:42:39 2024 +0800

    delete lee.txt

commit 33c058b8be9c0da32e4e508330ea323899b6191f
Author: haha <haha@qq.com>
Date:   Thu Sep 12 19:35:12 2024 +0800

    add haha.txt

commit b2ed96fb7c40a4581e412c8224507fe739a973be
Author: haha <haha@qq.com>
Date:   Thu Sep 12 19:34:34 2024 +0800

    update v3

commit 63411dcad59cdfcec1aa62d746d412eb9614c934
Author: haha <haha@qq.com>
Date:   Thu Sep 12 19:33:28 2024 +0800


[root@getlab-node1 zhang]# git reflog   #查看提交动作
1282fe5 (HEAD -> master) HEAD@{0}: commit: delete lee.txt
33c058b HEAD@{1}: commit: add haha.txt
b2ed96f HEAD@{2}: commit: update v3
63411dc HEAD@{3}: commit: update v2
e51ef6c HEAD@{4}: commit: update v1
8a9949f HEAD@{5}: commit: README.md v2
1f98d1a HEAD@{6}: commit (initial): add README.md

#版本回退到删除之前
[root@getlab-node1 zhang]# git reset 33c058b

4.2 git对于文件如何忽略

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

[root@getlab-node1 zhang]# mkdir dir1/
[root@getlab-node1 zhang]# touch dir1/.file2
[root@getlab-node1 zhang]# git status -s
?? dir1/

[root@getlab-node1 zhang]# echo .file1 > .gitignore
[root@getlab-node1 zhang]# git status -s
?? .gitignore
?? dir1/

[root@getlab-node1 zhang]# echo ".*" > .gitignore
[root@getlab-node1 zhang]# git status -s

五 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@getlab-node1 ~]# yum install -y curl policycoreutils-python-utils openssh-server perl

[root@getlab-node1 ~]# dnf install gitlab-ce-17.1.6-ce.0.el9.x86_64.rpm -y

5.2.2 配置gitlab

#修改配置文件
[root@getlab-node1 ~]# cd /etc/gitlab/
[root@getlab-node1 gitlab]# ls
gitlab.rb
[root@getlab-node1 gitlab]# vim gitlab.rb
32 external_url 'http://172.25.254.80'

#修改配置文件后需利用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: jN9lq6NSP8a2V+4n57djzWlEGP7RZ43DSIse8sXJGTQ=      #密码

# NOTE: This file will be automatically deleted in the first reconfigure run after 24 hours.

登陆

设置语言

选项在下面

设置密码

5.3 在gitlab中新建项目

#生成sshd密钥
[root@getlab-node1 gitlab]# 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:biLSHPSri2ATy4Hj4bjyPNznfK6Ih3x/1bAM7YoEq+c root@getlab-node1
The key's randomart image is:
+---[RSA 3072]----+
|                 |
|                 |
|    .    .       |
|.  ...  . o      |
|o+  .o. S+ +     |
|=.=o...o  = .    |
|oX.++.o.oo       |
|o+B+==oo+        |
|o.=*E===.        |
+----[SHA256]-----+

[root@getlab-node1 gitlab]# cd
[root@getlab-node1 ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCvOH0VlHeeMR8w3g677WL6WWQE3VMsS2fETfE/2/yKWXi+0iWXzxRZJq0NFxF3js0Uu64Yfobg94eO99FQcI6K6TfJQzaiMR/G3e0No5F0ydQ08U/Te1DzFv4lOoExWCd8EZg/MfmEmvgHhVdC3QmFyiZVPw/90ljCJErrZCrWPs9v8FhWEPWc4C6ZJ2ZFwgDQrNuTD7dnKCTTAgcFUZ40CSpIV72E07LerUdX7YgVvmnoGQ7V0Gs2AzOnDh+9Zwlpb9/NHWkgwRYTiLM12IH7bgSRUcsPs32yaOXf8msHwqCYm1kEysm4fTw06nTvYvDLwB20f3qDTEvV06aRz0jiw8eKlXG1r8z4UZVf6EY/8nT/BZv/HiFSyqZxHfYSV6zh/7qahOVbN1Fnr/52PFDYCmbJYPUXn0O3IXa9vHnwyQhw3k/DK/5feJxqDDMrO+8Ujlzx1iWRfBtt9J9CVtWnS296o5gsirg/jaUf2EmCtRqCn0crYXhCs6uGnolwWR8= root@getlab-node1

上传公钥到gitlab中

下载项目

[root@getlab-node1 ~]# git clone  git@172.25.254.80:root/hahaha.git
正克隆到 'hahaha'...
The authenticity of host '172.25.254.80 (172.25.254.80)' can't be established.
ED25519 key fingerprint is SHA256:ov5ncy/2ZvbULX/pM00/gNAp6EIEv1j6jwYEnCtTeX8.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.25.254.80' (ED25519) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
接收对象中: 100% (3/3), 完成.

[root@getlab-node1 ~]# ls -R
./hahaha:
README.md

[root@getlab-node1 ~]# cd hahaha/
[root@getlab-node1 hahaha]# ls
README.md

[root@getlab-node1 hahaha]# git remote -v
origin	git@172.25.254.80:root/hahaha.git (fetch)
origin	git@172.25.254.80:root/hahaha.git (push)

#文件提交

[root@getlab-node1 ~]# cd hahaha/
[root@getlab-node1 hahaha]# ls
README.md
[root@getlab-node1 hahaha]# git remote -v
origin	git@172.25.254.80:root/hahaha.git (fetch)
origin	git@172.25.254.80:root/hahaha.git (push)
[root@getlab-node1 hahaha]# echo haha1 > haha
[root@getlab-node1 hahaha]# git add haha 
[root@getlab-node1 hahaha]# git commit -m "add haha"
[main aff2e07] add haha
 1 file changed, 1 insertion(+)
 create mode 100644 haha
[root@getlab-node1 hahaha]# git push -u origin main
枚举对象中: 4, 完成.
对象计数中: 100% (4/4), 完成.
使用 4 个线程进行压缩
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (3/3), 260 字节 | 260.00 KiB/s, 完成.
总共 3(差异 0),复用 0(差异 0),包复用 0
To 172.25.254.80:root/hahaha.git
   92afb73..aff2e07  main -> main
分支 'main' 设置为跟踪 '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

jenkins需要部署在新的虚拟机

jenkins需要部署在新的虚拟机中,建议最少4G内存,4核心cpu

#注意:两台主机做解析(jenkins和getlab)

[root@jenkins ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.25.254.90   jenkins
172.25.254.80   getlab-node1

[root@getlab-node1 ~]# /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.25.254.90   jenkins
172.25.254.80   getlab-node1

#安装依赖包
[root@jenkins ~]# yum install fontconfig java-17-openjdk git

#安装jenkins
[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
b2e1dcd091e744f88dc67f388e8bd88e
#清除文件的方法
[root@jenkins ~]# systemctl stop jenkins.service 
[root@jenkins ~]# rm -rf /var/lib/jenkins/*
[root@jenkins ~]# systemctl start jenkins.service 
#查看jenkins配置文件
[root@jenkins ~]# cd /var/lib/jenkins/
[root@jenkins jenkins]# ls
config.xml                        logs                      secrets
hudson.model.UpdateCenter.xml     nodeMonitors.xml          updates
hudson.plugins.git.GitTool.xml    plugins                   userContent
identity.key.enc                  queue.xml.bak             users
jenkins.telemetry.Correlator.xml  secret.key
jobs                              secret.key.not-so-secret

[root@jenkins jenkins]# vim hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>https://updates.jenkins.io/update-center.json</url>
  </site>
</sites>

[root@jenkins jenkins]# cd updates/
[root@jenkins updates]# vim default.json 

部署插件

#由于网络问题,直接导入插件包
[root@jenkins ~]# tar zxf plugins.tar.gz -C /var/lib/jenkins/
[root@jenkins ~]# systemctl restart jenkins.service 

建议修改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:xzD7SdNTNuwG16h2hnchlhDwiQwqj08D6bz86Z1QY50 root@jenkins
The key's randomart image is:
+---[RSA 3072]----+
|       . ..o.    |
|    . . o o o..o |
|   + .  oo o.+B..|
|  o =   .=...O...|
|   + + +SE= * * .|
|  . + + .+ + * . |
|   o o    o      |
|    . + .        |
|    .+ o         |
+----[SHA256]-----+
[root@jenkins ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7qa28BbQXEi94LUVEnSTo2O5cQbqQwi2sKErSi/UhbhMVyUIcm36ggx4x/AoaSClSWNRxEZp3g6uV+txxtk3CyL23P9WHAjOPHHOVU82PWBxRMzMdLQiXMzh70OF3VXBqRt6i0ZxpoKj03ZuW3gAo8T2mSVMiITMyHcAGKTNM9LjNrRVzNqxfYbYC5RmvGFPJ73y+JxRZVb9sAxWkDwpVm4J3ORDV2T4lR7z4itpnHymcYED9Xcu/j+P2psYMx04/1nKBVpjEMnUYAPBs2UiaYEF0u0/KDprX8Oh1VwVcImaNTQoCHwjYp0oCwLK0ThKt839Nl+Ixnmw5tzsYXy8gGgu4cS+LlnrPg8Ys2lb9Vrre3g7KRtn06UlDoV6wGXULrtUIN5B8KP3iy6DPkGbJ6MLLeulVeimzzxtQyrtacm9EHVrjZprqRE4QxO0bIO37tnmJOAxJ9GchxOSFQFrV4eL4ND9ZIRMlcGivrAtWHu832s6jtlC76RzW5XEiaCc= root@jenkins

把此密钥添加到gitlab上即可

添加密钥凭据

查看密钥

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

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

原因:没有输入这个yes

另一种解决方法

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

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

返回浏览器,刷新一下

查看结果

等一分钟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2144122.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IntelliJ IDEA 2024.1 新特性下载安装激活方法

概述 IntelliJ IDEA 2024.1 发布了一系列令人期待新特性&#xff0c;可以帮助您提高开发效率。比如&#xff1a;全行代码补全、SpringBean 补全和自动装配、多语句内联端点、新版终端、编辑器中粘性行、AI Assistant 编码助手、改进的日志工作流、重命名嵌入提示、为整行代码提…

【北京迅为】《STM32MP157开发板使用手册》- 第三十三章Cortex-M4 DMA实验

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

《锐捷AP 胖模式配置示例》

目录 WEB配置方式: 1. 登录 AP 管理界面 2. 配置无线服务 3. 配置射频参数 4. 配置 VLAN (如果需要) 5. 配置 IP 地址 6. 其他高级设置(根据需求) 命令行配置: 1. 进入特权模式 2. 进入全局配置模式 3. 配置管理 IP 地址 4. 创建无线 SSID 5. 配置 SSID 加密…

Selenium打开浏览器后闪退问题解决

笔者这两天在做一个自动化方案&#xff0c;用来优化数据统计。其中一部分数据需要通过云上堡垒机跳转访问&#xff0c;而这个堡垒机在笔者日常使用的火狐浏览器上运行不是很正常&#xff08;表现在有些复制粘贴按钮显示不太灵敏&#xff09;。 但在Edge浏览器上基本正常&#…

工行软件开发中心积极推进低代码平台建设,助力金融业务快速研发

工行软件开发中心融合现有研发体系,打造全链路可视化研发。平台整体架构建立于行内新一代前后端分离研发体系之上,引入可视化技术,构建业务研发资产,承接现有服务体系,基于数据模型驱动技术及代码扩展能力,快速实现应用开发,并整合行内研发支撑体系,实现应用的快速构建…

python定时发送邮件的功能如何实现自动化?

Python定时发送邮件教程&#xff1f;如何用Python发送电子邮件&#xff1f; Python定时发送邮件不仅能够帮助我们自动处理日常的邮件发送任务&#xff0c;还能在特定时间点触发邮件发送&#xff0c;确保信息的及时传达。AokSend将详细探讨如何利用Python实现定时发送邮件的自动…

开放式耳机好用吗?哪个开放式耳机好用?

现在市面上的开放式耳机真的越来越火了&#xff0c;所以很多小伙伴也会来问我&#xff0c;有哪些品牌值得入手&#xff0c;开放式耳机到底好不好用的这个问题&#xff0c;作为专业的开放式耳机测评博主对于这个问题当然是信手拈来啦&#xff0c;这篇文章就来告诉大家如何才能选…

算法基础-扩展欧几里得算法

扩展欧几里得 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n in.nextInt();while (n-- > 0) {int a in.nextInt();int b in.nextInt();int[] m exgcd(a, b);System.out.println(m[0] " " m[1]);}}…

【ollama 下载不下来的问题解决】

国内从官网下载ollama经常遇到下载不下来&#xff0c;或者卡住的问题&#xff0c;今天给大家分享解决这个问题的方法。 官网 官网地址&#xff1a;https://ollama.com/download 但是官网地址&#xff0c;就一直卡住&#xff0c;一直下载不下来&#xff0c;所以选用下面的方法…

【精选书籍】ChatGLM3大模型本地化部署、应用开发与微调的全面解析

前言 大模型领域既是繁星点点的未知宇宙&#xff0c;也是蕴含无数可能的广阔天地&#xff0c;正是这一独特的魅力&#xff0c;令无数的探索者为之倾倒&#xff0c;为之奋斗。随着大模型应用逐渐走入人们的日常生活&#xff0c;支撑它的深度学习技术也开始登上更为广阔和深远的…

【C++】日期类基础题

个人主页&#xff1a;CSDN_小八哥向前冲~ 所属专栏&#xff1a;C入门 一些C基础题目&#xff0c;帮你巩固一下&#xff01; 目录 关于内存问题 栈和堆基础问题 计算日期到天数的转换 日期差值 日期累加 打印日期 关于内存问题 答案&#xff1a;D B 第一题&#xff…

java重点学习-JVM类加载器+垃圾回收

12.7类加载器 JVM只会运行二进制文件&#xff0c;类加载器的作用就是将字节码文件加载到JVM中&#xff0c;从而让Java程序能够启动起来。 类加载器有哪些 启动类加载器(BootStrap ClassLoader):加载JAVA HOME/jre/lib目录下的库扩展类加载器(ExtClassLoader):主要加载JAVA HOME…

Tensorflow—第五讲卷积神经网络

本讲概述 卷积实际上就是特征提取。本讲我们先了解学习卷积神经网络基础知识&#xff0c;再一步步地学习搭建卷积神经网络&#xff0c;最后会运用卷积神经网络对cifar10 数据集分类。在本讲的最后附上几个经典卷积神经网络&#xff1a;LeNet、AlexNet、VGGNet、InceptionNet和…

开发小程序

由于之前购入的阿里云ECS放着落灰&#xff0c;碰巧又看到个有趣的项目&#xff0c;于是就做了个生成头像的小程序…由于第一次完整发布小程序&#xff0c;记录一下遇到的问题 小程序名称&#xff1a;靓仔创意头像 &#x1f602; 关于小程序 接口请求&#xff0c;在开发过程中…

少儿编程小游戏 | Scratch 射击游戏《开枪!》

在线玩&#xff1a;Scratch射击游戏 : “开枪&#xff01;” 免费下载-小虎鲸Scratch资源站 随着科技的飞速发展&#xff0c;编程已经成为孩子们未来必备的技能之一。而Scratch作为一款专为少儿设计的编程工具&#xff0c;通过可视化的编程方式&#xff0c;让孩子们在玩游戏的过…

JAVA-集合相关

HashMap如何解决哈希冲突的&#xff1f; 计算hash值&#xff0c;基于hashCode计算冲突之后&#xff0c;先是使用链式寻址法当链表长度大于8&#xff0c;且hash表的容量大于60的时候&#xff0c;再添加元素则转化成红黑树 为什么计算hash值是&#xff0c;是将hash地址的值右移1…

代码随想录训练营 Day62打卡 图论part11 Floyd 算法 A * 算法

代码随想录训练营 Day62打卡 图论part11 Floyd 算法 例题&#xff1a;卡码97. 小明逛公园 题目描述 小明喜欢去公园散步&#xff0c;公园内布置了许多的景点&#xff0c;相互之间通过小路连接&#xff0c;小明希望在观看景点的同时&#xff0c;能够节省体力&#xff0c;走最短…

C++速通LeetCode中等第3题-字母异位词分组

双指针法&#xff1a;两个指针分别指向左右边界&#xff0c;记录最大面积&#xff0c;由于面积由短板决定&#xff0c;两个指针中较短的短指针向内移动一格&#xff0c;再次记录最大面积&#xff0c; 直到两指针相遇&#xff0c;得出答案。 class Solution { public:int maxAr…

PyQt / PySide + Pywin32 + ctypes 自定义标题栏窗口 + 完全还原 Windows 原生窗口边框特效项目

项目地址&#xff1a; GitHub - github201014/PyQt-NativeWindow: A class of window include nativeEvent, use PySide or PyQt and Pywin32 and ctypesA class of window include nativeEvent, use PySide or PyQt and Pywin32 and ctypes - github201014/PyQt-NativeWindow…

切换淘宝最新npm镜像源

文章目录 一、前言二、切换淘宝最新npm镜像源2.1 查询最新镜像源2.2 两种方式切换npm镜像源2.2.1 通过npm配置2.2.1 通过cnpm配置 三、总结 一、前言 NPM&#xff08;Node Package Manager&#xff09;&#xff0c;是NodeJs的模块依赖管理工具&#xff0c;用于nodejs模块的安装…