👨‍💻代码自动化推送部署实战全能打
00 分钟
发布于: 2024-8-29
最后更新: 2024-9-10
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
notion image

什么是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 用户名,的测试命令如下:

常见场景和用途

  1. 测试 SSH 连接是否可用:使用这个命令可以快速验证 SSH 服务是否正常工作,以及是否能够正确进行身份验证。
  1. 测试 Git SSH 连接:如果在使用 Git 通过 SSH 协议与远程仓库通信,可以使用 T 来测试 SSH 是否能正常连接到 Git 服务。例如,GitHub 提供的 SSH 访问可以通过以下命令测试:
    1. 成功连接时,可能会看到类似 "Hi username! You've successfully authenticated, but GitHub does not provide shell access." 的信息,表明 SSH 连接已成功验证的身份。
  1. 调试 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 配置文件中未启用公钥认证。

    解决方法

    1. 生成 SSH 密钥对(如果尚未生成):
      1. 在本地机器上生成 SSH 密钥对:
        这将在 ~/.ssh/ 目录中生成一个公钥(id_rsa.pub)和一个私钥(id_rsa)。
    1. 将公钥添加到服务器
      1. 将生成的公钥内容(~/.ssh/id_rsa.pub)复制到服务器的 ~/.ssh/authorized_keys 文件中。可以使用以下命令复制公钥到服务器:
        或者手动将 id_rsa.pub 的内容添加到服务器上的 ~/.ssh/authorized_keys 文件中。
    1. 检查服务器 SSH 配置
      1. 确保服务器的 SSH 配置文件(通常是 /etc/ssh/sshd_config)启用了公钥认证:
        确保 AuthorizedKeysFile 设置指向正确的文件路径(通常是 .ssh/authorized_keys)。
    1. 重启 SSH 服务
      1. 如果修改了 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 工作流就能够在运行时自动获取并添加主机密钥了。
          1. 运行 ssh-keyscan 命令:使用以下命令来获取的服务器 s15.zzip.top 在端口 30576 上的 SSH 主机密钥:
            1. 运行此命令后,它会输出类似以下格式的主机密钥:
              这条输出包括主机名、端口号、密钥类型(如 ssh-rsa)以及密钥内容。
          1. 将主机密钥添加到 ~/.ssh/known_hosts 文件:将输出直接追加到 known_hosts 文件中,可以使用以下命令:
            1. 这样,主机密钥将被追加到的本地 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 协议支持多种密钥类型,如 rsaecdsaed25519 等。使用 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 仓库的上游,以便从原始仓库拉取更新。
              1. 克隆 fork 的仓库到本地(或在服务器上)
                1. 添加原始仓库为上游
                  1. 验证远程链接
                    1. 应该看到类似的输出:

                  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 部署密钥

                  1. 生成 SSH 密钥对(在的个人电脑或服务器上):
                    1. 将生成的公钥添加到的服务器的 ~/.ssh/authorized_keys 中,并将私钥存储为 GitHub 仓库的一个 secret。
                  1. 将私钥添加为 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. 流程总结

                  1. fork 的仓库通过 GitHub Actions 设置自动与原始仓库同步。
                  1. 一旦 fork 仓库有新的更新(通过同步或直接 push),GitHub Actions 会自动将代码部署到的个人服务器。
                  通过这种方式,可以保持 fork 的仓库与上游同步,并确保的服务器上总是运行最新的代码。整个流程是自动化的,只需要设置一次,之后所有更新都会自动完成。

                  在同步时排除上游仓库原.github文件,保留我自定义的.github文件

                  要在同步时排除上游仓库的 .github 文件夹,同时保留自己自定义的 .github 文件夹,可以采取一些特定的 Git 操作来实现这一目标。通常,Git 本身没有排除特定目录的内建机制,但我们可以通过一些步骤来手动控制同步过程。

                  方法:通过 Git 合并时排除 .github 文件夹

                  1. 使用分支来隔离上游更新:首先,使用一个专门的分支来从上游仓库拉取更新,然后将这些更新合并到主分支(master)时,排除掉 .github 目录。
                  1. 创建专门用于同步的分支:例如,创建一个名为 upstream-sync 的分支,用于拉取上游更新。
                    1. 从上游仓库拉取更新
                        • 添加上游仓库(如果还没有添加的话):
                          • 从上游仓库获取更新:
                        1. 合并更新时排除 .github 文件夹
                            • 使用 git merge-no-commit-no-ff 选项进行合并。这些选项允许在合并时暂停,以便进行手动调整:
                              • 合并暂停后,可以删除或排除 .github 目录中的更改:
                                • 这会将 .github 目录从暂存区移除,并恢复到合并前的状态。
                              • 提交合并更改:
                            1. 将合并后的更改应用到的主分支
                              1. 切换回 master 分支并合并 upstream-sync 分支:

                            自动化同步过程

                            为了使这一过程更加自动化,可以考虑创建一个脚本或 GitHub Actions 工作流来自动执行这些步骤。下面是一个简单的 Bash 脚本示例,用于自动化上述操作:
                            将此脚本保存为 sync.sh,并在需要同步时运行它。确保该脚本在正确的 Git 环境中执行,并且有权限进行合并和推送操作。

                            只对上游某一两个文件夹同步其他全部不处理,也不删除仓库本来有的文件方式

                            如果只想同步上游仓库中的某一个或两个特定文件夹,而忽略其他文件夹,同时保留自己的仓库中已有的文件,可以使用以下几种方法来实现这种部分同步:

                            方法一:使用 Git Sparse Checkout(稀疏检出)

                            Git 提供了一个功能叫稀疏检出(Sparse Checkout),允许在工作树中只检出某些特定的文件或文件夹。可以使用稀疏检出来实现仅同步某些文件夹的功能。

                            步骤:

                            1. 设置稀疏检出
                              1. 假设想从上游仓库中只同步 folder1folder2
                                使用稀疏检出设置后,只有 folder1folder2 目录会被同步到的工作树中,其他目录将被忽略。可以随时在需要时添加更多目录。
                            1. 合并更改到主分支
                              1. 切换回 master 分支,并合并从 upstream-sync 分支中的特定文件夹更改。
                                这样,的 master 分支将包含从 upstream-sync 分支同步的 folder1folder2 中的更新,而不会影响其他文件。

                            方法二:手动拷贝和合并

                            如果不需要经常同步,或者上游仓库更新不频繁,可以通过手动方式来同步特定文件夹。
                            1. 克隆上游仓库到一个临时目录
                              1. 进入临时目录并复制需要的文件夹
                                1. 在的 fork 仓库中提交这些更改

                                  方法三:Git 过滤器分支策略

                                  可以使用 Git 的过滤器分支命令将只需要的文件夹从上游同步到的 fork 仓库。尽管这个过程更复杂,但它非常有效。
                                  1. 创建过滤器分支
                                    1. 在本地创建一个基于上游仓库的临时分支,并过滤掉不需要的文件夹。
                                  1. 合并过滤分支
                                    1. 切换回的主分支,将过滤后的分支合并:

                                  方法四:GitHub Actions 和脚本

                                  可以创建一个 GitHub Actions 工作流来自动执行特定文件夹同步的脚本。
                                  1. 创建一个 GitHub Actions 工作流(例如 sync-specific.yml
                                    1. 这种方式使用 GitHub Actions 来自动同步指定的文件夹,并将更改推送到的 fork 仓库中。

                                  总结

                                  • 稀疏检出 是在同步时排除特定文件夹的一种强大工具。
                                  • 手动拷贝和合并 适用于不频繁的同步情况。
                                  • 过滤器分支策略 是处理复杂仓库的高级方法。
                                  • GitHub Actions 可以自动化同步特定文件夹的过程。
                                  根据的需求和使用频率选择适合的方法。以上这些步骤可以有效地帮助只同步所需的特定文件夹,同时保留自己仓库中已有的文件不受影响。
                                   

                                  git连接到没有公网IP进行穿透代理的远程服务器

                                  1. 测试 SSH 连接:通过 ssh -p 6000 user@[FRP_SERVER_IP/Domian] 连接到的服务器,确保 SSH 代理工作正常。
                                  1. 配置 Git:在的本地 Git 仓库中,配置远程仓库为通过 FRP 暴露的 SSH 地址:
                                    1. 然后可以使用 git push 推送代码到服务器。

                                  部署远程仓库使用 Git 钩子自动化更新文件目录为最新推送文件状态

                                  当像GIthub一样需要在每次将本地更改推送到远程非裸仓库时,远程仓库中的所有旧文件都被删除并更新为最新的推送文件,可以在远程非裸仓库中使用 post-receive 钩子来自动执行清理操作,使其在每次 push 操作后将远程工作目录更新为最新的内容。这可以确保每次推送时,远程目录都会被替换为最新的代码。
                                  post-update钩子与post-receive钩子都可以达到此目的

                                  post-receive钩子

                                  • 每次当有人 git pushblog.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 钩子,使其在每次推送时清空并更新工作目录:
                                  1. 进入远程仓库的 hooks 目录
                                    1. 创建或编辑 post-receive 文件
                                      1. 编写 post-receive 钩子的内容
                                        1. 添加以下内容到 post-receive 文件中:
                                          • GIT_WORK_TREE:设置为希望更新的工作目录路径。
                                          • rm -rf $GIT_WORK_TREE/*:删除工作目录中的所有文件。请小心使用这条命令,确保在正确的目录上执行,以免丢失重要数据。
                                          • git --work-tree=$GIT_WORK_TREE checkout -f:强制将最新的提交检出到工作目录。
                                      1. 赋予 post-receive 文件执行权限
                                        1. 保存文件后,确保这个脚本具有执行权限:

                                      post-update钩子

                                      post-update

                                      post-update 是 Git 中的一种钩子(hook),它在 Git 仓库中的引用(refs)被更新后执行。这个钩子在裸仓库和非裸仓库中都可以使用,但在实践中,它更多用于裸仓库,尤其是在远程服务器上。post-update 钩子主要用于通知系统或用户某些分支或标签已更新。它的作用与 post-receive 钩子有一些相似之处,但一般用于不同的场景。它可以用来执行类似 post-receive 的操作,但一般情况下,我们使用 post-receive 钩子来处理接收推送后立即执行的任务,例如自动部署。

                                      post-update 钩子的作用和用途

                                      1. 引用更新后执行post-update 钩子在每次成功更新一个或多个引用(例如分支、标签)后被触发。引用更新意味着新的提交已经被添加到这些引用中。
                                      1. 常用于通知系统:该钩子经常用于触发通知机制,比如更新缓存、发送邮件通知、触发其他系统的更新(如持续集成服务器通知)。它可以用来通知其他系统或服务某些分支或标签发生了变化。
                                      1. 权限管理:在一些场景下,post-update 钩子可以用于控制权限。例如,阻止某些用户在特定分支上执行推送操作或进行特定的合并。
                                      1. 缓存更新post-update 可以用于更新仓库浏览器的缓存,尤其是在 Web 接口上显示 Git 仓库的内容时,例如使用 GitWeb 或类似工具。
                                      1. 执行自定义脚本:像其他 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 钩子

                                      1. 找到钩子文件:进入 Git 裸仓库的 hooks 目录(如 /path/to/blog.git/hooks/)。
                                      1. 编辑或创建钩子:如果没有 post-update 文件,可以创建一个,并确保去掉 .sample 后缀。
                                      1. 赋予执行权限
                                        1. 编写钩子逻辑:根据的需求,编写钩子的执行脚本,例如通知系统、刷新缓存、更新日志等。

                                        总结

                                        • post-update 钩子用于在 Git 引用更新后执行操作,常用于通知、缓存刷新、权限管理等场景。
                                        • 可以自定义钩子的行为,例如通知团队、触发自动化工作流、管理服务器端操作等。
                                        • 需要手动创建或修改钩子文件 并确保其具有执行权限。
                                        虽然 post-updatepost-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仓库管理系统的推送。

                                        工作原理

                                        1. SFTP 协议
                                            • SFTP 是一种通过 SSH 协议进行的安全文件传输协议,提供加密的文件传输能力。它在传输文件时使用 SSH 通道进行加密,以确保数据的安全性。
                                            • 与 FTP 不同,SFTP 使用加密连接来传输数据,这增加了安全性。
                                        1. GitHub Actions 插件
                                            • wlixcc/SFTP-Deploy-Action@v1.0 插件通过使用 SFTP 协议将文件从 GitHub 仓库部署到远程服务器。
                                            • 插件的配置需要指定远程服务器的 SFTP 连接信息,如主机名、端口、用户名和密钥或密码。

                                        配置示例

                                        一个典型的 GitHub Actions 工作流配置示例如下:

                                        配置选项

                                        • host:远程 SFTP 服务器的主机名或 IP 地址。
                                        • port:SFTP 服务器的端口(默认是 22)。
                                        • usernamepassword:用于身份验证的凭据。也可以使用 SSH 密钥进行身份验证(通过 private-key 配置项)。
                                        • local-dir:要上传的本地目录路径。
                                        • remote-dir:要将文件上传到的远程目录路径。
                                         
                                        在仓库添加 .github/workflows/update.yml 文件 Github Actions 配置。

                                        与git推送部署代码的对比

                                        使用 Git

                                        当使用 Git 来推送代码到远程仓库时,需要以下信息:
                                        1. SSH 私钥(如果使用 SSH 协议)
                                            • 用于通过 SSH 协议进行身份验证。如果使用 SSH URL(如 git@github.com:user/repo.git),需要在本地配置 SSH 密钥对,并将公钥添加到远程 Git 服务器上。
                                        1. Git 用户名和邮箱
                                            • 这些信息用于提交代码时标识提交者。可以在本地 Git 配置中设置这些信息:
                                          1. 远程仓库地址
                                              • 这是推送代码的目标地址,可以是 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 插件来部署文件到远程服务器时,需要以下信息:
                                          1. SFTP 主机名
                                              • 远程 SFTP 服务器的主机名或 IP 地址。
                                          1. SFTP 端口
                                              • 通常为 22,但可以根据实际配置进行更改。
                                          1. SFTP 用户名
                                              • 用于进行身份验证的用户名。
                                          1. SFTP 密码或私钥
                                              • 如果使用密码进行身份验证,需要提供密码。如果使用私钥进行身份验证,需要提供私钥文件或内容。
                                          1. 本地目录和远程目录
                                              • local-dir:要上传的本地目录路径。
                                              • remote-dir:上传文件到远程服务器上的目录路径。

                                          配置示例

                                          对于 Git,常见的操作是在本地配置并使用 Git 命令:
                                          对于 wlixcc/SFTP-Deploy-Action,在 GitHub Actions 工作流文件中配置 SFTP 连接信息:
                                          上一篇
                                          管理定时任务调度程序cron和crontab命令
                                          下一篇
                                          Git应用之概念理解

                                          评论
                                          Loading...