返回

在 Linux 服务器上利用 Git 仓库和钩子实现生产代码同步更新

见解分享

技术博文:巧用 Git 仓库和钩子,助力 Linux 服务器上的生产代码同步更新

引言

在当今快节奏的 DevOps 环境中,自动化和持续部署是确保代码质量和应用程序可靠性的关键。对于部署在 Linux 服务器上的生产代码,利用 Git 仓库和钩子可以简化代码更新流程,从而提高效率和安全性。

在 Linux 服务器上建立 Git 仓库

第一步,在服务器上初始化一个 Git 仓库:

git init

接下来,创建一个名为“deploy”的新分支,用于存储生产代码:

git checkout -b deploy

创建 Git 钩子

钩子是特殊的脚本,当某些 Git 事件发生时自动运行。它们允许我们自动化与 Git 仓库交互的任务。我们将创建两个钩子:

post-receive 钩子: 此钩子在代码推送到远程仓库后触发,负责更新生产代码。

[编辑 /home/git/.git/hooks/post-receive 文件]

#!/bin/sh

# 获取推送的分支名称
branch=$(git symbolic-ref -q --short HEAD)

# 仅在部署分支上推送时执行
if [ "$branch" = "deploy" ]; then
    # 更新生产代码
    cd /path/to/production_code_directory
    git checkout deploy
    git pull origin deploy
    
    # 重启相关服务(例如 Apache、Nginx)
    service apache2 restart
fi

pre-receive 钩子: 此钩子在代码推送到远程仓库前触发,负责检查推送者的权限和对代码的修改。

[编辑 /home/git/.git/hooks/pre-receive 文件]

#!/bin/sh

# 限制推送来源
if [ "$GIT_PUSHER_NAME" != "trusted_user" ]; then
    exit 1
fi

# 检查代码修改
git diff --exit-code HEAD $1

# 如果检查失败,则退出并拒绝推送
if [ $? -ne 0 ]; then
    exit 1
fi

配置 SSH 访问

为了安全地使用 Git,我们需要配置 SSH 访问:

  1. 创建一个专门用于 Git 的非 root 用户。
  2. 生成 SSH 密钥并将其添加到服务器的 authorized_keys 文件中。
  3. 配置 Git 以使用 SSH URL 访问远程仓库。

在 Git 用户中禁用 Shell 访问

出于安全考虑,我们建议禁用 Git 用户的 Shell 访问:

[编辑 /etc/passwd 文件]

git:x:1001:1001:git user:/home/git:/bin/nologin

示例代码

以下示例代码展示了如何在生产环境中更新代码:

# 在本地环境中
git add .
git commit -m "Fix: 修复了一个错误"
git push origin deploy

# 在服务器上(post-receive 钩子)
# 检出部署分支
git checkout deploy
# 拉取最新代码
git pull origin deploy
# 重启相关服务
service apache2 restart

结论

通过利用 Git 仓库和钩子,我们可以简化 Linux 服务器上的生产代码同步更新。这种方法提高了自动化水平、安全性,并确保了代码的可靠和及时更新。这对于 DevOps 团队来说是一个必不可少的工具,可以缩短部署时间并提高整体应用程序质量。