如何用GitHub Actions搭建CI/CD流水線實(shí)現(xiàn)自動(dòng)化部署?
这篇文章将教你如何利用GitHub Actions在你的代码库中实现持续集成和持续部署,以自动化你的开发流程。
为了演示这一点,我将用一个简单的Node.js应用作为示例应用,并部署到我自己的VPS(虚拟专用服务器)上。
但是说真的,什么是CI/CD流水线,我们为什么需要它呢?
非常好的问题!让我们用简单的话来说一下。
什么是CI/CD流程?
CI/CD流程自动完成构建、测试和部署代码的流程,每当代码仓库发生变化时,。
• 持续集成(CI) 是一种确保新代码自动测试并合并的技术。
• 持续交付(CD) 是一种自动化部署技术,确保软件的最新版本始终处于可发布的状态。
为什么我们需要它?
没有CI/CD,开发人员必须手动测试和部署代码,这既耗时耗力
,容易犯错
,又效率低下
。CI/CD流水线加快开发周期,减少错误,并确保平稳部署过程。
想象你在你的 VPS 上有一个托管的项目。
• 使用 CI(持续集成,Continuous Integration) ,每次你推送代码到 GitHub 时,它会自动运行测试来查找错误。
• 使用 CD(持续部署,Continuous Deployment) ,如果所有测试都通过了,你的应用程序会自动部署到你的 VPS(虚拟私人服务器),自动保持最新状态,无需手动操作。
它是怎么运作的?
这就轮到GitHub Actions上场了!作为一款流行的CI/CD工具,GitHub Actions让开发人员可以直接在GitHub仓库中自动化构建、测试和部署应用。
GitHub Actions 的核心在于这些自动化流程,它们会执行一个或多个预先定义好的任务。
工作流可以定制以满足特定需求,例如,可以:
• 对每个拉取请求 (pull requests) 运行测试。
• 自动将合并后的代码部署到生产环境。
这些工作流定义在存储于你仓库中的 YAML 文件中,确保自动化可以无缝地融入你的开发过程中。
让我们来点实际的吧!🚀
现在,我们一步步来搭建使用GitHub Actions的CI/CD管道。
第一步:创建你的Node.js项目
在这个指南里,我已经为你创建了一个Node.js应用。你可以自己新建一个,或者用现有的项目。
步骤2:创建一个GitHub仓库
• 初始化你的项目的Git仓库。
• 如果你还没有这么做过,将你的项目推送到GitHub。
步骤 3:在 GitHub 上设置秘密变量
请按照以下步骤:
- 前往你的 GitHub 仓库。
- 点击设置选项卡。
- 在左侧边栏中,导航到密钥和变量 → 操作设置。
- 点击新建仓库密钥项。
- 输入密钥名称(例如 DEPLOY_SSH_KEY,SERVER_IP,DOCKER_USERNAME)。
- 在框中粘贴密钥值(例如 SSH 私钥,API 令牌)。
- 点击添加密钥项。
这些秘密现在可以直接通过 ${{ secrets.SECRET_NAME }} 在你的 GitHub Actions 中访问和使用。
步骤4:创建GitHub Actions工作流文件
如果项目根目录下还没有.github/workflows
目录,请创建一个。请在该目录中创建一个名为'deploy.yml'
的文件。
.github/workflows/
注:.github/workflows/
是 GitHub 仓库中的一个标准目录路径。
进入全屏,退出全屏
现在,在你的 deploy.yml
文件中定义你的 CI/CD 流水线:
deploy.yml
name:部署流水线
on:
push:
branches:
- main
tags:
- '*'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 拉取代码
uses: actions/checkout@v3
- name: 安装 Node.js
uses: actions/setup-node@v3
with:
node-version: '20.8.1'
- name: 安装依赖
run: npm install
- name: 构建项目
run: npm run build
切换到全屏
退出全屏
如果你想向构建过程中添加一个步骤,将构建推送到Docker Hub,你可以创建一个类似的单独作业。该作业会处理构建Docker镜像并将镜像推送到你的Docker Hub存储库。
docker:
name: 构建并推送 Docker 镜像
runs-on: ubuntu-latest
needs: build
steps:
- name: 获取代码
uses: actions/checkout@v3
- name: 登录 Docker
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: 构建 Docker 镜像
run: |
docker build -t ${{ secrets.DOCKER_USERNAME }}/github-action-test:latest .
- name: 上传 Docker 镜像
run: |
docker push ${{ secrets.DOCKER_USERNAME }}/github-action-test:latest
进入全屏 退出全屏
要设置持续交付(CD)
流程,你可以使用一个名为appleboy/ssh-action的GitHub Actions插件。此插件允许你通过SSH凭据在远程服务器上执行命令。通过使用此插件,你可以停止并删除现有的Docker容器实例,从Docker Hub拉取最新的镜像,并启动更新后的容器实例,这一切都可以自动完成,无需人工干预。
deploy:
name: 部署到远程虚拟私有服务器
runs-on: ubuntu-latest
needs: docker
steps:
- name: 部署到远程服务器
uses: appleboy/ssh-action@v1.2.0
with:
host: ${{ secrets.REMOTE_HOST }}
username: ${{ secrets.REMOTE_USER }}
password: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
echo "进入 Docker Compose 文件目录"
cd /path to your repo/
echo "停止并移除任何正在运行的容器"
docker stop <container name>
docker rm <container name>
echo "删除旧的 Docker 镜像"
docker rmi -f <latest image> || true
echo "在远程服务器上登录到 Docker Hub"
echo "${secrets.DOCKER_PASSWORD}" | docker login -u "${secrets.DOCKER_USERNAME}" --password-stdin
echo "拉取最新版本的镜像"
docker compose up --build -d
进入全屏模式, 退出全屏
最终的示例代码如下:
name: 构建并部署到测试环境
on:
push:
branches:
- main
tags:
- '*'
jobs:
build:
name: 构建 Node.js 项目
运行在: ubuntu-latest
steps:
- name: 检出代码
uses: actions/checkout@v3
- name: 设置 Node.js 环境
uses: actions/setup-node@v3
with:
node-version: '20.8.1'
- name: 安装依赖
run: npm install
- name: 构建 React 应用
run: npm run build
docker:
name: 构建和推送 Docker 镜像
运行在: ubuntu-latest
需要: build
steps:
- name: 检出代码
uses: actions/checkout@v3
- name: 登录 Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: 构建 Docker 镜像
run: |
docker build -t ${{ secrets.DOCKER_USERNAME }}/github-action-test:latest .
- name: 推送 Docker 镜像
run: |
docker push ${{ secrets.DOCKER_USERNAME }}/github-action-test:latest
deploy:
name: 部署到远程 VPS
运行在: ubuntu-latest
需要: docker
steps:
- name: 通过 SSH 部署
uses: appleboy/ssh-action@v1.2.0
with:
host: ${{ secrets.REMOTE_HOST }}
username: ${{ secrets.REMOTE_USER }}
password: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
echo "切换到 Docker Compose 文件目录"
cd /path/to/your/repo/
echo "停止并移除运行中的容器"
docker stop <container name>
docker rm <container name>
echo "删除旧的 Docker 镜像"
docker rmi -f <latest image>|| true
echo "远程登录 Docker Hub"
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
echo "拉取最新 Docker 镜像"
docker compose up --build -d
全屏 全退
第五步:设置跑步者
在使用 GitHub Actions 时,运行程序是用于执行工作流的环境。这里有两类运行程序可供选择。
- 托管在GitHub上的执行器
- 自行托管的执行器
GitHub托管的运行器
GitHub托管的运行器是由GitHub提供和管理的虚拟机。您无需进行任何设置或维护,GitHub会为工作流程中的每个作业自动创建一个全新、安全且隔离的执行环境。这些运行器非常适合大多数CI/CD应用场景,并且使用起来几乎无需任何设置。
你可以选择以下环境中的任意一个,例如:
• ubuntu-latest
• windows-latest
• macos-latest
因为所有事情都是为你管理的,它们非常适合快速配置和标准工作流程。不过,它们的自定义选项比较有限,处理资源密集型构建时可能较慢。此外,还有使用限制,特别是私有仓库方面。
自托管运行器
自托管运行器是指你自行管理的机器,比如个人VPS、本地服务器或云服务器,并将它们注册到你的GitHub仓库或组织下。配置完成后,GitHub可以将工作流程任务分配到你自己的基础设施上。
这给你提供了对环境的完全控制,意味着你可以提前安装所需的依赖项,增加内存分配,并根据你的具体需求进行细致调整。在私人或受限制的环境中,这些设置特别有用,在这些情况下,使用公共的GitHub托管运行器不合适。
它们不仅为重复构建提供更快的执行速度,因为环境是持久的,不像 GitHub 主办的运行器每次都会重新启动新的虚拟机。但是请注意,你还需要负责运行器的安全性、维护、可用性和可扩展性,这些都需要更多的设置和持续管理。
现在,我们将要看看如何来设置自托管运行器。
按以下步骤来,
选择运行时图片
- 将GitHub提供的配置命令复制并粘贴到你的服务器终端中,以将工作程序注册到你的仓库或组织的。
步骤 6:测试一下您的 CI/CD 持续集成和持续交付流水线
现在一切都准备好了啦:
- 在你的 Node.js 项目中做一些修改。
- 将其推送到你的 GitHub 仓库的主分支上。
- 在你的 GitHub 仓库中打开 Actions 标签页,观察工作流。
- 如果所有设置都正确无误,GitHub Actions 会通过 SSH 连接到你的 VPS 并自动部署最新代码。
就这样,搞定!你刚刚创建了一个功能完整的CI/CD工作流程!从写代码、测试到构建Docker镜像并部署到你的VPS,一切都变得自动化且更加高效了。
通过设置此工作流,你已经向现代DevOps实践迈出了重要一步。你将减少手动部署所需的时间,降低错误率,同时自信地加快交付速度。此外,借助自定义运行器的灵活性,你的流水线可以随着项目基础设施需求的增长而灵活扩展。
CI/CD 不再只是大公司的专享 —— 有了像 GitHub Actions 这样的工具,现在任何人都可以使用了。不妨一试,把你的自动化提升到下一个层次。
谢谢阅读!如果你有任何反馈、问题或改进意见,欢迎在下面留言,我很想听听你的想法。
祝你编程愉快,别忘了无论走到哪里都记得绽放你的微笑!😄
如果你希望联系或支持我的事业:
📧 欢迎通过电子邮件与我联系:getintouchwithvishnu@gmail.com
☕ 如果你觉得这有帮助,想支持我,可以在这里买我一杯咖啡:买我一杯咖啡
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章