GitHub 自动化部署详解
GitHub 自动化部署是指将源代码从 GitHub 仓库自动部署到生产环境中的一种方法,它可以在开发人员提交代码时自动构建、测试和部署应用程序。这项技术在现代软件开发中越来越受欢迎,因为它可以减少手动操作并提高工作效率。
-
以下是一个简单的步骤,以帮助您进行自动化部署:
-
创建一个 Github 仓库,并将你的应用程序的源代码上传到该仓库中。
-
在你的本地机器上安装 Git,并将本地仓库克隆到本地。
-
创建一个 CI/CD pipeline,该 pipeline 将负责自动构建、测试和部署你的应用程序。
-
在你的项目根目录下添加一个 YAML 文件(.yml),名为.github/workflows/main.yml,这个文件定义了你的 CI/CD 流程。该文件应包含以下内容:
- main.yml
name: CI/CD Pipeline #工作流名称
on:
push: #表示 push 的时候触发工作流
branches:
- main #触发的分支
jobs: #工作流程包含的作业(jobs)列表
build-and-deploy: #作业名称
runs-on: ubuntu-latest #指定作业在哪种操作系统环境下运行。此处使用的是最新版的 Ubuntu 操作系统
steps: #作业中包含的步骤列表
- name: Checkout code #第一个步骤的名称
uses: actions/checkout@v2 #用来检出代码
- name: Set up Node.js environment #设置 Node.js 环境的步骤
uses: actions/setup-node@v2 #用来设置 Node 环境
with:
node-version: "12.x" #指定 Node 版本
- name: Install dependencies #安装依赖项的步骤
run: npm install #安装依赖项
- name: Build and test #构建和测试应用程序的步骤
run: npm run build #使用 npm 运行构建和测试命令
- name: Deploy to production #部署应用程序的步骤
uses: easingthemes/ssh-deploy@v2.2.14 #使用 SSH 部署工具来进行自动化部署
env: #设置环境变量,包括 SSH 私钥、远程服务器 IP 地址、用户名等信息
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} #SSH 私钥
ARGS: "-rltgoDzvO --delete" #传输配置参数
SOURCE: "dist/" #要上传到远程服务器的本地文件和路径
REMOTE_HOST: ${{ secrets.REMOTE_HOST }} #远程服务器的 IP 地址或域名
REMOTE_USER: ${{ secrets.REMOTE_USER }} #远程服务器的用户名
TARGET: "/var/www/html" #上传到远程服务器的目标路径
这个流程的作用是:
- 当你推送提交到 GitHub 的主分支(main)时,触发 CI/CD 流程;
- 通过 actions/checkout 步骤,将代码从 GitHub 检出到 CI/CD 流程中;
- 使用 actions/setup-node 步骤,在 CI/CD 流程中设置 Node.js 环境;
- 使用 npm install 安装所有依赖项;
- 运行 npm run build 命令来构建和测试应用程序;
- 使用 easingthemes/ssh-deploy 步骤将构建后的文件部署到生产环境。
- 将 SSH 私钥和主机名存储在你的 GitHub 仓库的 secrets 中,以便 CI/CD 流程可以访问这些敏感信息。确保添加以下 secrets:
- SSH_PRIVATE_KEY:包含用于连接到远程服务器的 SSH 私钥。
- REMOTE_HOST:远程服务器的 IP 地址或主机名。
- REMOTE_USER:远程服务器的用户名。
- 提交并推送改动到 GitHub 仓库中,此时 CI/CD 流程应该已自动运行,并将应用程序部署到生产环境中。
yml 文件解析
这个文件是一个 GitHub Actions 的工作流程(workflow)文件,它定义了自动化部署的 CI/CD 流程。下面是对每个步骤的解释:
-
name: CI/CD Pipeline
:工作流程的名称。 -
on: push: branches: - main
:触发工作流程的事件。当你向名为“main”的分支推送提交时,将触发此工作流程。 -
jobs:
:工作流程包含的作业(jobs)列表。 -
build-and-deploy:
:作业的名称。 -
runs-on: ubuntu-latest
:指定作业在哪种操作系统环境下运行。此处使用的是最新版的 Ubuntu 操作系统。 -
steps:
:作业中包含的步骤(steps)列表。 -
- name: Checkout code
:第一个步骤的名称。使用actions/checkout@v2
来检出代码。 -
- name: Set up Node.js environment
:设置 Node.js 环境的步骤。 -
node-version: '12.x'
:指定 Node.js 版本为 12.x。 -
- name: Install dependencies
:安装依赖项的步骤。 -
run: npm install
:使用 npm 安装所有依赖项。 -
- name: Build and test
:构建和测试应用程序的步骤。 -
run: npm run build
:使用 npm 运行构建和测试命令。 -
- name: Deploy to production
:部署应用程序的步骤。 -
uses: easingthemes/ssh-deploy@v2.2.14
:使用 SSH 部署工具来进行自动化部署。 -
env:
:设置环境变量,包括 SSH 私钥、远程服务器 IP 地址、用户名等信息。 -
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
:SSH 私钥。 -
ARGS: '-rltgoDzvO --delete'
:传输配置参数。 -
SOURCE: 'dist/'
:要上传到远程服务器的本地文件和路径。 -
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
:远程服务器的 IP 地址或域名。 -
REMOTE_USER: ${{ secrets.REMOTE_USER }}
:远程服务器的用户名。 -
TARGET: '/var/www/html'
:上传到远程服务器的目标路径。
这些步骤组成了一个简单的 CI/CD 流程,用于将代码构建、测试和部署到生产环境中。你可以根据自己的需求修改这个文件,并使用它来实现自动化部署。
注意:
需要购买服务器吗?
为了进行远程部署,你需要购买一个服务器来托管你的应用程序。通常有以下几种方式可以购买服务器:
-
在云服务商(如 AWS、Azure、Google Cloud 等)上租用一台虚拟机。这个选项非常灵活,可以根据需要随时增加或减少资源。但是,它可能会比其他选项更贵。
-
在托管服务商(如 DigitalOcean、Linode 等)上购买一台物理服务器。这个选项相对来说更便宜,但需要自行管理服务器。
-
在自己的网络中运行服务器。这个选项需要在家里或办公室中设置一台物理服务器,并通过路由器将其连接到互联网。
无论选择哪种方式,服务器都是进行远程部署所必需的。
GitHub 对 push 的代码的处理流程
GitHub 本身并不负责将代码发送到远程服务器上。相反,GitHub 用于存储你的源代码,并提供了一些工具和服务来帮助你协作开发和管理代码。
当你使用 GitHub 自动化部署时,你需要使用 CI/CD 流程来自动构建、测试和部署你的应用程序。在这个过程中,GitHub 只是一个触发器,负责启动 CI/CD 流程,并让它自动运行。具体来说,当你向 GitHub 仓库推送提交时,GitHub 会检测到这个事件,并根据你定义的工作流自动触发 CI/CD 流程。
在 CI/CD 流程中,你可以使用各种工具和服务来构建、测试和部署你的应用程序。最终,你需要使用 SSH 或其他协议,将构建好的应用程序包发送到远程服务器上。为此,你需要在 GitHub 仓库的 secrets 中存储远程服务器的 IP 地址、用户名和 SSH 私钥等敏感信息,并在 CI/CD 流程中使用这些信息来连接到远程服务器并将代码部署到其中。
总而言之,GitHub 自动化部署的实现依赖于 CI/CD 流程和远程部署技术,GitHub 本身并不直接参与到部署过程中去。
GitHub 构建之后,发送到远程服务器的文件有哪些?
在 CI/CD 流程中,你需要将构建好的应用程序包发送到远程服务器上。这个应用程序包通常包含以下内容:
可执行文件:如果你的应用程序是一个可执行文件(如 Node.js 应用程序或 Python 脚本),则需要将其打包为二进制文件,并将其发送到远程服务器上。
静态文件:如果你的应用程序包含静态文件(如 HTML、CSS 或 JavaScript 文件),则需要将其复制到远程服务器上的 Web 根目录下,以便可以通过浏览器访问它们。
依赖项:如果你的应用程序依赖于其他软件库或模块,则需要将这些依赖项打包并一同发送到远程服务器上。
具体来说,应用程序包的内容取决于你的应用程序类型和需求。但是,无论你的应用程序是什么类型,你都需要确保在 CI/CD 流程中正确地构建和打包应用程序,并使用 SSH 或其他协议将应用程序包发送到远程服务器上。