type
status
date
slug
summary
category
tags
password
Created time
Aug 29, 2024 05:38 PM
Last edited time
Sep 10, 2024 03:45 AM
UUID
icon
🗒️发表的笔记
URL CK
ErrorCheck
ErrorCheck
Description
什么是CI/CD?
- 持续集成(CI)是一种实践,涉及开发人员对其代码进行小的更改和检查。由于需求的规模和所涉及的步骤的数量,这个过程是自动化的,以确保团队可以以可靠和可重复的方式构建,测试和打包他们的应用程序。CI有助于简化代码更改,从而增加开发人员进行更改并为改进软件做出贡献的时间。
- 持续交付(CD)是将完成的代码自动交付到测试和开发等环境。CD为代码提供了一种自动化和一致的方式来交付到这些环境中。
持续部署是持续交付的下一步。通过自动化测试的每个更改都会自动放入生产环境中,从而导致许多生产z自动完成部署部署。
CI/CD允许组织快速有效地发布软件。CI/CD促进了一个有效的流程,使产品比以往任何时候都更快地推向市场,不断地将代码交付到生产中,并通过最有效的交付方法确保新功能和错误修复的持续流动。
配置新Linux远程服务器SSH允许秘钥登录
要配置 SSH 以允许使用密钥进行登录,需要在服务器上进行一些配置。以下是具体步骤:
1. 生成 SSH 密钥对(如果还没有)
在本地计算机上生成一对 SSH 密钥(如果还没有),使用以下命令:
t rsa
:t —type,指定使用 RSA 算法类型。
b 4096
:指定密钥长度为 4096 位。
C "your_email@example.com"
:为密钥添加注释(可选)。
默认情况下,密钥会生成在
~/.ssh
目录中,文件名为 id_rsa
(私钥)和 id_rsa.pub
(公钥)。2. 将公钥复制到服务器
将生成的公钥 (
id_rsa.pub
) 复制到远程服务器的 ~/.ssh/authorized_keys
文件中。可以使用 ssh-copy-id
命令来简化这一过程:此命令会将本地的公钥添加到服务器用户的
~/.ssh/authorized_keys
文件中。如果
ssh-copy-id
不可用,可以手动将公钥内容复制到服务器上的 authorized_keys
文件中:3. 配置 SSH 服务以启用密钥登录
在服务器上,编辑 SSH 配置文件
/etc/ssh/sshd_config
:确保以下设置存在并取消注释:
PubkeyAuthentication yes
:启用公钥认证。
AuthorizedKeysFile .ssh/authorized_keys
:指定公钥文件路径。
PasswordAuthentication no
:如果想强制只使用密钥登录,可以禁用密码登录。
4. 重启 SSH 服务
在更改配置后,重新启动 SSH 服务以应用更改:
5. 测试 SSH 密钥登录
尝试从本地计算机使用 SSH 密钥登录服务器:
如果配置正确,应该能够使用 SSH 密钥登录到服务器,而无需输入密码。
6. 确保正确的权限设置
确保
.ssh
目录和 authorized_keys
文件具有正确的权限设置,以避免安全问题:配置.ssh/authorized_keys
当设置PubkeyAuthentication yes时,不一定还要设置AuthorizedKeysFile .ssh/authorized_keys。
设置
PubkeyAuthentication yes
是启用公钥认证的必要条件,而 AuthorizedKeysFile .ssh/authorized_keys
是用来指定存储公钥的位置。默认情况下,SSH 服务器会使用 ~/.ssh/authorized_keys
作为默认文件路径,所以不设置 AuthorizedKeysFile
也是可以的,只要使用的是默认路径。默认行为
PubkeyAuthentication yes
:启用公钥认证。当设置这一选项时,SSH 服务器将允许使用公钥进行身份验证。
AuthorizedKeysFile
:指定用户公钥的存放位置。默认情况下,它的值是~/.ssh/authorized_keys
。如果没有显式设置AuthorizedKeysFile
,SSH 会使用默认值~/.ssh/authorized_keys
。
示例
假设已经启用了公钥认证:
在这种情况下,如果没有在
sshd_config
文件中指定 AuthorizedKeysFile
,SSH 将默认使用 ~/.ssh/authorized_keys
进行公钥验证。如果希望改变默认的公钥文件路径(例如,有一个不同的文件名或位置),可以通过设置
AuthorizedKeysFile
来指定,例如:验证SSH或者Git是否能正常与本地内往穿透的本地服务器正常通信
验证 SSH 连接
通过 SSH 直接连接到内网穿透暴露出来的本地服务器:
<port>
:内网穿透使用的外部端口号。
<username>
:本地服务器上的用户名。
<public_ip_or_hostname>
:内网穿透服务分配的公共 IP 地址或主机名。
如果使用的是 SSH 默认端口(22)并且用户名是
user
,主机名是 example.com
,命令看起来像这样:常见问题
- 连接超时或拒绝:检查内网穿透工具的配置是否正确。确认防火墙设置允许该端口的流量,并且服务器的 SSH 服务在运行。
- 身份验证失败:确认使用的 SSH 密钥对是正确的,并且在服务器上已经正确配置了公钥(通常放在
~/.ssh/authorized_keys
中)。
使用 ssh -v
查看详细输出
如果连接失败,可以使用
-v
标志查看详细的调试信息:这种模式下会输出连接过程中的详细日志信息,有助于诊断问题所在。
测试 Git SSH 连接
使用以下命令测试 Git SSH 连接:
- 该命令不会启动一个交互式 shell,而是测试连接的可用性。
- 如果连接成功,可能会看到类似 “
Hi <username>! You've successfully authenticated, but GitHub does not provide shell access.
” 的信息(这取决于服务器配置)。
验证 Git 推送和拉取
在一个 Git 仓库中,使用以下命令检查远程仓库是否设置为使用 SSH:
输出可能类似于:
尝试从远程仓库拉取或推送代码:
- 如果这些操作成功,那么说明 SSH 和 Git 配置是正确的。
检查 SSH 配置
检查本地服务器的 SSH 配置文件(通常是
/etc/ssh/sshd_config
)是否允许通过公钥认证和正确配置了监听端口。重启 SSH 服务使配置生效:
验证 SSH 连接
在验证 SSH 连接时,可以使用
ssh -T -p <port> <username>@<public_ip_or_hostname>
命令来测试连接的可用性和身份验证。让我们详细解释一下这条命令的各个部分及其用途。命令格式解释
ssh
: 这是用于启动 SSH 客户端的命令行工具。
T
: 这个选项表示不分配伪终端(pseudo-tty)。使用T
可以防止启动交互式 shell。这在仅仅想要测试连接而不进入交互式终端时非常有用。例如,当连接到 Git 服务器时,这样做会更快,因为不需要打开一个 shell 会话。
p <port>
: 指定 SSH 连接使用的端口号。默认情况下,SSH 使用端口 22。如果的内网穿透或 SSH 服务配置使用了非标准端口,例如 30576,需要使用p
来指定。
<username>
: 这是在目标主机上的用户名。在许多 Git 服务(如 GitHub、GitLab)中,这个用户名通常是git
。
<public_ip_or_hostname>
: 目标主机的公共 IP 地址或域名。在使用内网穿透时,这个可以是内网穿透服务提供的公共 IP 或域名。
示例
假设有一个通过内网穿透工具暴露出来的本地服务器,其公共地址是
example.com
,使用端口 30576
,在服务器上用 user
作为 SSH 用户名,的测试命令如下:常见场景和用途
- 测试 SSH 连接是否可用:使用这个命令可以快速验证 SSH 服务是否正常工作,以及是否能够正确进行身份验证。
- 测试 Git SSH 连接:如果在使用 Git 通过 SSH 协议与远程仓库通信,可以使用
T
来测试 SSH 是否能正常连接到 Git 服务。例如,GitHub 提供的 SSH 访问可以通过以下命令测试:
成功连接时,可能会看到类似 "Hi username! You've successfully authenticated, but GitHub does not provide shell access." 的信息,表明 SSH 连接已成功验证的身份。
- 调试 SSH 连接问题:如果连接失败,可以使用
v
标志来查看详细的调试信息。这将显示连接建立过程中的所有步骤,有助于诊断问题所在:
使用
ssh -T -p <port> <username>@<public_ip_or_hostname>
命令可以帮助快速测试和验证 SSH 连接的可用性,而不会启动一个交互式 shell。这在测试 Git SSH 连接或检查 SSH 服务的可用性时非常有用。确保公钥配置、端口设置、防火墙规则和内网穿透配置正确,以避免连接问题。我输入这个命令后让我输入密码
如果在执行以下命令时被提示输入密码:
这意味着 SSH 正在使用密码认证,而不是基于 SSH 密钥对的公钥认证。以下是一些可能的原因以及如何解决这个问题的建议:
1. SSH 公钥认证未配置或配置不正确
SSH 密钥对(公钥和私钥)认证是一种更安全的认证方式,它避免了每次连接时输入密码的需要。如果 SSH 连接要求输入密码,可能是由于以下原因:
- 的本地机器没有正确配置 SSH 私钥,或者私钥的路径不对。
- 服务器端没有设置公钥认证,或者公钥文件没有正确放在服务器上的
~/.ssh/authorized_keys
中。
- 服务器 SSH 配置文件中未启用公钥认证。
解决方法
- 生成 SSH 密钥对(如果尚未生成):
在本地机器上生成 SSH 密钥对:
这将在
~/.ssh/
目录中生成一个公钥(id_rsa.pub
)和一个私钥(id_rsa
)。- 将公钥添加到服务器:
将生成的公钥内容(
~/.ssh/id_rsa.pub
)复制到服务器的 ~/.ssh/authorized_keys
文件中。可以使用以下命令复制公钥到服务器:或者手动将
id_rsa.pub
的内容添加到服务器上的 ~/.ssh/authorized_keys
文件中。- 检查服务器 SSH 配置:
确保服务器的 SSH 配置文件(通常是
/etc/ssh/sshd_config
)启用了公钥认证:确保
AuthorizedKeysFile
设置指向正确的文件路径(通常是 .ssh/authorized_keys
)。- 重启 SSH 服务:
如果修改了 SSH 配置文件,需要重启 SSH 服务以使更改生效:
检查本地 SSH 配置
在
~/.ssh/config
文件中添加以下配置以便使用特定的私钥文件:3. 密钥权限问题
如果
~/.ssh
目录或密钥文件的权限不正确,SSH 可能会忽略公钥认证并要求密码。确认权限设置
~/.ssh
目录权限应为700
:
- 私钥文件(
id_rsa
)权限应为600
:
- 公钥文件(
authorized_keys
)权限应为600
:
当 SSH 提示输入密码时,通常是因为公钥认证没有正确配置。请确保在本地和服务器端都正确设置了 SSH 公钥认证,包括生成和使用 SSH 密钥对、配置 SSH 配置文件、检查权限设置以及配置防火墙和 SELinux。如果设置正确,SSH 应该会自动使用公钥认证而不提示输入密码。
Actions→Host key verification failed.
action中出现此类错误
在 GitHub Actions 中遇到
Host key verification failed
错误通常是由于缺少对 GitHub 主机的信任或 SSH 密钥配置不正确引起的。检测secret.名称
Actions secret引用名错误引用了不存在的key或者内容复制粘贴错了key内容导致引用了错误的key→error in libcrypto.
当secret数量多时,很容易出现这个问题,特别是SSH keys和token很容易复制粘贴错位置。
对比该名称内存的是不是配置的SSH私钥,然后再对比其名称与workflow中引用的secret名称是不是一致。
检查内容
在Windows下,Git是使用MSYS2兼容的POSIX标准编译的。而POSIX标准的换行符为\n,因此Git无法识别Windows的换行符\r\n。使用VS Code打开密钥文件,在右下角检查选择CRLF,然后弹出窗口选择LF保存即可。
一般这个内容是复制粘贴的不会错,而且现在的编辑器都能正确识别CRLF(\r\n)和LF(\n)。
Action版本问题不兼容rsa秘钥类型几乎不会导致此问题发生,因为Action的版本迭代很快,一般不会允许这种情况发生。
git仓库通过SSH通信方式使用前提之known_hosts
使用 ssh-keyscan
查询主机密钥
ssh-keyscan
是一个专门用来从 SSH 服务器获取公钥的工具,可以使用它来查询指定服务器的主机密钥,并将其添加到 ~/.ssh/known_hosts
中。使用
ssh-keyscan
更加直接和方便,它可以自动将主机密钥抓取并存储到 known_hosts
文件中。而直接使用 ssh
命令连接只会显示指纹并提示确认,适合手动操作。如果需要在 GitHub Actions 中自动化这个步骤,建议使用 ssh-keyscan
,并将它纳入工作流步骤中,如:这样,的 GitHub Actions 工作流就能够在运行时自动获取并添加主机密钥了。
- 运行
ssh-keyscan
命令:使用以下命令来获取的服务器s15.zzip.top
在端口30576
上的 SSH 主机密钥:
运行此命令后,它会输出类似以下格式的主机密钥:
这条输出包括主机名、端口号、密钥类型(如
ssh-rsa
)以及密钥内容。- 将主机密钥添加到
~/.ssh/known_hosts
文件:将输出直接追加到known_hosts
文件中,可以使用以下命令:
这样,主机密钥将被追加到的本地
known_hosts
文件中。下一次尝试连接时,SSH 会自动使用该文件中的密钥来验证服务器的身份。手动查看并复制主机密钥
如果想手动查看密钥内容并复制它,可以先运行
ssh-keyscan
命令获取输出,然后将输出的内容复制到 ~/.ssh/known_hosts
中:将输出的那一行复制并手动粘贴到
~/.ssh/known_hosts
文件中。使用 SSH 首次连接获取密钥指纹
如果不想使用
ssh-keyscan
,也可以尝试直接 SSH 连接服务器来获取密钥指纹:在首次连接时,如果主机密钥未被识别,SSH 客户端会显示密钥指纹并提示是否继续连接(输入
yes
即可将密钥添加到 known_hosts
)。不过,这种方法不适合自动化环境,如 GitHub Actions。在 GitHub Actions 中自动添加密钥
如果的目标是在 GitHub Actions 中自动添加密钥,请在的 Actions 工作流程文件中加入以下步骤:
这样可以确保的 GitHub Actions 工作流在每次运行时自动更新和验证主机密钥。
通过这些方法,可以有效地将远程服务器的主机密钥添加到
known_hosts
,避免 Host key verification failed
错误。4o
ssh-keyscan -p 和 -t参数的含义
ssh-keyscan
是一个命令行工具,用于从远程主机获取 SSH 主机密钥。它常用于生成 SSH 主机密钥的列表,以便将这些密钥添加到 ~/.ssh/known_hosts
文件中,以便后续连接时进行主机验证。1. p
选项:指定端口号
- 语法:
p port
- 功能:指定要连接到的远程主机的端口号。默认情况下,SSH 使用端口号
22
进行连接。但如果的 SSH 服务运行在一个非标准端口上(如30576
),需要用p
选项来明确指定端口号。
- 示例用法:在这个示例中,
ssh-keyscan
将连接到s15.zzip.top
主机的30576
端口来获取 SSH 主机密钥。
2. t
选项:指定密钥类型
- 语法:
t keytype
- 功能:指定要扫描的 SSH 密钥类型。SSH 协议支持多种密钥类型,如
rsa
、ecdsa
、ed25519
等。使用t
选项可以限定ssh-keyscan
只获取特定类型的密钥。
- 示例用法:在这个示例中,
ssh-keyscan
将只获取s15.zzip.top
主机上的rsa
类型的 SSH 主机密钥。
组合使用
可以将
-p
和 -t
选项结合使用,从指定端口获取特定类型的 SSH 主机密钥。例如:在这个命令中,
ssh-keyscan
将连接到 s15.zzip.top
的端口 30576
,并且只获取 rsa
类型的 SSH 主机密钥。实现自动化部署一个被 fork 的 GitHub 仓库到个人服务器,同时保持与原始仓库的同步。
1. 设置 Fork 仓库与原始仓库的同步
要确保 fork 的仓库能够定期与原始仓库同步,可以通过 GitHub Actions 来实现自动同步。以下是步骤:
1.1. 添加上游(原始)仓库的远程链接
首先,将原始仓库设置为的 fork 仓库的上游,以便从原始仓库拉取更新。
- 克隆 fork 的仓库到本地(或在服务器上):
- 添加原始仓库为上游:
- 验证远程链接:
应该看到类似的输出:
1.2. 配置 GitHub Actions 自动同步
可以设置 GitHub Actions 在定期或在代码推送时同步 fork 仓库与上游仓库。
在 fork 仓库的
.github/workflows
目录中创建一个新的工作流文件(例如 sync.yml
):cron: '0 0 * * 0'
:每周自动同步一次(在周日的午夜),可以根据需求修改为不同频率。
workflow_dispatch
:允许手动触发同步工作流。
GITHUB_TOKEN
:GitHub 提供的内置 token,用于自动推送更改。
2. 自动化部署到个人服务器
在实现与上游同步后,接下来设置自动部署。可以通过 GitHub Actions 在每次代码更新时自动将内容部署到的个人服务器。
2.1. 在 GitHub 中添加服务器的 SSH 部署密钥
- 生成 SSH 密钥对(在的个人电脑或服务器上):
将生成的公钥添加到的服务器的
~/.ssh/authorized_keys
中,并将私钥存储为 GitHub 仓库的一个 secret。- 将私钥添加为 GitHub Secret:
- 在 GitHub 仓库中,导航到
Settings
->Secrets
->Actions
。 - 创建一个新的 secret,命名为
DEPLOY_KEY
,并粘贴私钥内容。
2.2. 配置 GitHub Actions 自动部署
在同一个
.github/workflows
目录中创建一个新的工作流文件(例如 deploy.yml
):uses: webfactory/ssh-agent@v0.5.3
:这个 GitHub Action 用来设置 SSH 代理和密钥。
rsync
:将文件同步到的服务器,-delete
选项会删除目标目录中不存在于源目录的文件,以确保源和目标完全同步。
3. 流程总结
- fork 的仓库通过 GitHub Actions 设置自动与原始仓库同步。
- 一旦 fork 仓库有新的更新(通过同步或直接 push),GitHub Actions 会自动将代码部署到的个人服务器。
通过这种方式,可以保持 fork 的仓库与上游同步,并确保的服务器上总是运行最新的代码。整个流程是自动化的,只需要设置一次,之后所有更新都会自动完成。
在同步时排除上游仓库原.github文件,保留我自定义的.github文件
要在同步时排除上游仓库的
.github
文件夹,同时保留自己自定义的 .github
文件夹,可以采取一些特定的 Git 操作来实现这一目标。通常,Git 本身没有排除特定目录的内建机制,但我们可以通过一些步骤来手动控制同步过程。方法:通过 Git 合并时排除 .github
文件夹
- 使用分支来隔离上游更新:首先,使用一个专门的分支来从上游仓库拉取更新,然后将这些更新合并到主分支(
master
)时,排除掉.github
目录。
- 创建专门用于同步的分支:例如,创建一个名为
upstream-sync
的分支,用于拉取上游更新。
- 从上游仓库拉取更新:
- 添加上游仓库(如果还没有添加的话):
- 从上游仓库获取更新:
- 合并更新时排除
.github
文件夹: - 使用
git merge
的-no-commit
和-no-ff
选项进行合并。这些选项允许在合并时暂停,以便进行手动调整: - 合并暂停后,可以删除或排除
.github
目录中的更改: - 提交合并更改:
这会将
.github
目录从暂存区移除,并恢复到合并前的状态。- 将合并后的更改应用到的主分支:
切换回
master
分支并合并 upstream-sync
分支:自动化同步过程
为了使这一过程更加自动化,可以考虑创建一个脚本或 GitHub Actions 工作流来自动执行这些步骤。下面是一个简单的 Bash 脚本示例,用于自动化上述操作:
将此脚本保存为
sync.sh
,并在需要同步时运行它。确保该脚本在正确的 Git 环境中执行,并且有权限进行合并和推送操作。只对上游某一两个文件夹同步其他全部不处理,也不删除仓库本来有的文件方式
如果只想同步上游仓库中的某一个或两个特定文件夹,而忽略其他文件夹,同时保留自己的仓库中已有的文件,可以使用以下几种方法来实现这种部分同步:
方法一:使用 Git Sparse Checkout(稀疏检出)
Git 提供了一个功能叫稀疏检出(Sparse Checkout),允许在工作树中只检出某些特定的文件或文件夹。可以使用稀疏检出来实现仅同步某些文件夹的功能。
步骤:
- 设置稀疏检出:
假设想从上游仓库中只同步
folder1
和 folder2
。使用稀疏检出设置后,只有
folder1
和 folder2
目录会被同步到的工作树中,其他目录将被忽略。可以随时在需要时添加更多目录。- 合并更改到主分支:
切换回
master
分支,并合并从 upstream-sync
分支中的特定文件夹更改。这样,的
master
分支将包含从 upstream-sync
分支同步的 folder1
和 folder2
中的更新,而不会影响其他文件。方法二:手动拷贝和合并
如果不需要经常同步,或者上游仓库更新不频繁,可以通过手动方式来同步特定文件夹。
- 克隆上游仓库到一个临时目录:
- 进入临时目录并复制需要的文件夹:
- 在的 fork 仓库中提交这些更改:
方法三:Git 过滤器分支策略
可以使用 Git 的过滤器分支命令将只需要的文件夹从上游同步到的 fork 仓库。尽管这个过程更复杂,但它非常有效。
- 创建过滤器分支:
在本地创建一个基于上游仓库的临时分支,并过滤掉不需要的文件夹。
- 合并过滤分支:
切换回的主分支,将过滤后的分支合并:
方法四:GitHub Actions 和脚本
可以创建一个 GitHub Actions 工作流来自动执行特定文件夹同步的脚本。
- 创建一个 GitHub Actions 工作流(例如
sync-specific.yml
):
这种方式使用 GitHub Actions 来自动同步指定的文件夹,并将更改推送到的 fork 仓库中。
总结
- 稀疏检出 是在同步时排除特定文件夹的一种强大工具。
- 手动拷贝和合并 适用于不频繁的同步情况。
- 过滤器分支策略 是处理复杂仓库的高级方法。
- GitHub Actions 可以自动化同步特定文件夹的过程。
根据的需求和使用频率选择适合的方法。以上这些步骤可以有效地帮助只同步所需的特定文件夹,同时保留自己仓库中已有的文件不受影响。
git连接到没有公网IP进行穿透代理的远程服务器
- 测试 SSH 连接:通过
ssh -p 6000 user@[FRP_SERVER_IP/Domian]
连接到的服务器,确保 SSH 代理工作正常。
- 配置 Git:在的本地 Git 仓库中,配置远程仓库为通过 FRP 暴露的 SSH 地址:
然后可以使用
git push
推送代码到服务器。部署远程仓库使用 Git 钩子自动化更新文件目录为最新推送文件状态
当像GIthub一样需要在每次将本地更改推送到远程非裸仓库时,远程仓库中的所有旧文件都被删除并更新为最新的推送文件,可以在远程非裸仓库中使用
post-receive
钩子来自动执行清理操作,使其在每次 push
操作后将远程工作目录更新为最新的内容。这可以确保每次推送时,远程目录都会被替换为最新的代码。post-update钩子与post-receive钩子都可以达到此目的
post-receive钩子
- 每次当有人
git push
到blog.git
裸仓库时,post-receive
钩子会被触发。
- 钩子脚本中的命令会自动将最新的代码检出到
/path/blog
目录中。
- 这样,
/path/xxxx
将始终保持最新的推送内容,类似于一个实际的工作目录。
如果在
xxxx.git/hooks/
目录下没有看到 post-receive
模板,而只有 post-update
模板,那是正常的。Git 默认提供了一些钩子的模板文件,例如 post-update.sample
,但不一定提供 post-receive.sample
。不过,可以手动创建一个 post-receive
钩子文件,并编写需要的钩子逻辑。以下是详细步骤来配置
post-receive
钩子,使其在每次推送时清空并更新工作目录:- 进入远程仓库的
hooks
目录:
- 创建或编辑
post-receive
文件:
- 编写
post-receive
钩子的内容: GIT_WORK_TREE
:设置为希望更新的工作目录路径。rm -rf $GIT_WORK_TREE/*
:删除工作目录中的所有文件。请小心使用这条命令,确保在正确的目录上执行,以免丢失重要数据。git --work-tree=$GIT_WORK_TREE checkout -f
:强制将最新的提交检出到工作目录。
添加以下内容到
post-receive
文件中:- 赋予
post-receive
文件执行权限:
保存文件后,确保这个脚本具有执行权限:
post-update钩子
post-update
post-update
是 Git 中的一种钩子(hook),它在 Git 仓库中的引用(refs)被更新后执行。这个钩子在裸仓库和非裸仓库中都可以使用,但在实践中,它更多用于裸仓库,尤其是在远程服务器上。post-update
钩子主要用于通知系统或用户某些分支或标签已更新。它的作用与 post-receive
钩子有一些相似之处,但一般用于不同的场景。它可以用来执行类似 post-receive
的操作,但一般情况下,我们使用 post-receive
钩子来处理接收推送后立即执行的任务,例如自动部署。post-update
钩子的作用和用途
- 引用更新后执行:
post-update
钩子在每次成功更新一个或多个引用(例如分支、标签)后被触发。引用更新意味着新的提交已经被添加到这些引用中。
- 常用于通知系统:该钩子经常用于触发通知机制,比如更新缓存、发送邮件通知、触发其他系统的更新(如持续集成服务器通知)。它可以用来通知其他系统或服务某些分支或标签发生了变化。
- 权限管理:在一些场景下,
post-update
钩子可以用于控制权限。例如,阻止某些用户在特定分支上执行推送操作或进行特定的合并。
- 缓存更新:
post-update
可以用于更新仓库浏览器的缓存,尤其是在 Web 接口上显示 Git 仓库的内容时,例如使用 GitWeb 或类似工具。
- 执行自定义脚本:像其他 Git 钩子一样,
post-update
可以执行任何自定义脚本,例如运行测试、生成报告、触发其他自动化工作流。
post-update
的典型使用场景
- Web 仓库服务通知:例如,在 GitWeb 或 cgit 这样的系统中,
post-update
可以用来更新网页上的显示,使得最新的推送内容立即可见。
- 触发钩子通知:在团队开发环境中,
post-update
钩子可以触发通知邮件或发送消息到团队的聊天应用(如 Slack、Microsoft Teams),告知团队成员某些分支已被更新。
- 系统管理:系统管理员可以使用
post-update
钩子来执行一些管理操作,如备份更新后的分支或触发其他服务器上的脚本。
post-update
钩子文件示例
默认情况下,
post-update
钩子通常是一个模板文件,并以 .sample
为后缀名。可以根据需要编辑这个钩子文件并去掉 .sample
后缀,使其生效。在上面的例子中,
$@
是一个参数,它包含了所有被更新的引用。可以在脚本中添加更多逻辑,比如发送通知或刷新 Web 接口上的缓存。如何启用和使用 post-update
钩子
- 找到钩子文件:进入 Git 裸仓库的
hooks
目录(如/path/to/blog.git/hooks/
)。
- 编辑或创建钩子:如果没有
post-update
文件,可以创建一个,并确保去掉.sample
后缀。
- 赋予执行权限:
- 编写钩子逻辑:根据的需求,编写钩子的执行脚本,例如通知系统、刷新缓存、更新日志等。
总结
post-update
钩子用于在 Git 引用更新后执行操作,常用于通知、缓存刷新、权限管理等场景。
- 可以自定义钩子的行为,例如通知团队、触发自动化工作流、管理服务器端操作等。
- 需要手动创建或修改钩子文件 并确保其具有执行权限。
虽然
post-update
和 post-receive
都是在推送操作后执行,但 post-receive
更常用于自动部署到工作目录,而 post-update
更多用于通知和更新缓存等管理任务。通过SSH-SFTP方式利用 Github Actions 定时任务来完成自动更新
wlixcc/SFTP-Deploy-Action@v1.0
是一个 GitHub Actions 插件,用于将文件通过 SFTP 协议部署到远程服务器上。具体来说,这个插件使用的是 SFTP(Secure File Transfer Protocol) 协议,它基于 SSH 协议进行安全的数据传输。这种方式完全不同于ssh、git和https方式基于git仓库管理系统的推送。工作原理
- SFTP 协议:
- SFTP 是一种通过 SSH 协议进行的安全文件传输协议,提供加密的文件传输能力。它在传输文件时使用 SSH 通道进行加密,以确保数据的安全性。
- 与 FTP 不同,SFTP 使用加密连接来传输数据,这增加了安全性。
- GitHub Actions 插件:
wlixcc/SFTP-Deploy-Action@v1.0
插件通过使用 SFTP 协议将文件从 GitHub 仓库部署到远程服务器。- 插件的配置需要指定远程服务器的 SFTP 连接信息,如主机名、端口、用户名和密钥或密码。
配置示例
一个典型的 GitHub Actions 工作流配置示例如下:
配置选项
host
:远程 SFTP 服务器的主机名或 IP 地址。
port
:SFTP 服务器的端口(默认是 22)。
username
和password
:用于身份验证的凭据。也可以使用 SSH 密钥进行身份验证(通过private-key
配置项)。
local-dir
:要上传的本地目录路径。
remote-dir
:要将文件上传到的远程目录路径。
在仓库添加
.github/workflows/update.yml
文件 Github Actions 配置。与git推送部署代码的对比
使用 Git
当使用 Git 来推送代码到远程仓库时,需要以下信息:
- SSH 私钥(如果使用 SSH 协议):
- 用于通过 SSH 协议进行身份验证。如果使用 SSH URL(如
git@github.com:user/repo.git
),需要在本地配置 SSH 密钥对,并将公钥添加到远程 Git 服务器上。
- Git 用户名和邮箱:
- 这些信息用于提交代码时标识提交者。可以在本地 Git 配置中设置这些信息:
- 远程仓库地址:
- 这是推送代码的目标地址,可以是 SSH URL 或 HTTPS URL。例如:
- SSH URL:
git@github.com:user/repo.git
- HTTPS URL:
https://github.com/user/repo.git
使用 wlixcc/SFTP-Deploy-Action@v1.0
当使用
wlixcc/SFTP-Deploy-Action
插件来部署文件到远程服务器时,需要以下信息:- SFTP 主机名:
- 远程 SFTP 服务器的主机名或 IP 地址。
- SFTP 端口:
- 通常为 22,但可以根据实际配置进行更改。
- SFTP 用户名:
- 用于进行身份验证的用户名。
- SFTP 密码或私钥:
- 如果使用密码进行身份验证,需要提供密码。如果使用私钥进行身份验证,需要提供私钥文件或内容。
- 本地目录和远程目录:
local-dir
:要上传的本地目录路径。remote-dir
:上传文件到远程服务器上的目录路径。
配置示例
对于 Git,常见的操作是在本地配置并使用 Git 命令:
对于
wlixcc/SFTP-Deploy-Action
,在 GitHub Actions 工作流文件中配置 SFTP 连接信息: