云部署实战:基于AWS EC2/Aliyun ECS与GitHub Actions的CI/CD全流程指南
在当今快速迭代的软件开发环境中,云部署与持续集成/持续交付(CI/CD)已成为现代开发团队的标配。本文将详细介绍如何利用AWS EC2或阿里云ECS结合GitHub Actions构建高效的CI/CD流水线,从零开始实现自动化部署的全过程。
最近挖到一个宝藏级人工智能学习网站,内容通俗到爆,讲解风趣幽默,连我这种零基础都能轻松上手!学AI居然能这么爽,必须安利给你们!点击去了解。
一、云服务器基础配置
1.1 AWS EC2实例创建与配置
AWS EC2是亚马逊提供的弹性计算服务,创建实例的第一步是选择合适的AMI(Amazon Machine Image):
-
登录AWS控制台,进入EC2服务
-
点击"启动实例",选择适合的AMI(如Ubuntu 20.04 LTS)
-
根据项目需求选择实例类型(测试环境可选t2.micro,生产环境建议t2.medium及以上)
-
配置安全组,开放必要端口(如SSH的22端口,HTTP的80端口等)
-
创建或选择现有密钥对,用于SSH连接
1.2 阿里云ECS实例创建与配置
阿里云ECS的创建流程与AWS EC2类似:
-
登录阿里云控制台,进入ECS服务
-
选择"创建实例",选择地域和可用区
-
选择镜像(如CentOS 7.9或Ubuntu 20.04)
-
选择实例规格(1核2G适合测试,生产环境建议2核4G以上)
-
配置安全组规则,开放必要端口
1.3 服务器基础环境准备
无论使用AWS EC2还是阿里云ECS,都需要进行一些基础配置:
# 更新系统包
sudo apt update && sudo apt upgrade -y # Ubuntu/Debian
sudo yum update -y # CentOS/RHEL# 安装常用工具
sudo apt install -y git curl wget unzip # Ubuntu/Debian
sudo yum install -y git curl wget unzip # CentOS/RHEL# 安装Docker(如需容器化部署)
curl -fsSL https://get.docker.com | sudo sh
sudo systemctl enable docker
sudo systemctl start docker# 将当前用户加入docker组(避免每次使用sudo)
sudo usermod -aG docker $USER
newgrp docker
二、GitHub Actions CI/CD基础
2.1 GitHub Actions核心概念
GitHub Actions是GitHub提供的CI/CD服务,主要概念包括:
-
Workflow(工作流程):自动化流程,存储在仓库的
.github/workflows
目录中 -
Job(任务):工作流程中的一组步骤,可并行或顺序执行
-
Step(步骤):任务中的单个操作,可以是命令或Action
-
Action(动作):可复用的代码单元,简化复杂操作
2.2 创建基础Workflow文件
在GitHub仓库中创建.github/workflows/deploy.yml
文件:
name: Build and Deployon:push:branches: [ main ]pull_request:branches: [ main ]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Setup Node.jsuses: actions/setup-node@v2with:node-version: '14'- name: Install dependenciesrun: npm install- name: Build projectrun: npm run build- name: Run testsrun: npm test
三、自动化部署到云服务器
3.1 使用SSH直接部署到EC2/ECS
对于简单项目,可以直接通过SSH将构建产物部署到服务器:
-
生成SSH密钥对:在服务器上执行
ssh-keygen
生成密钥对 -
配置GitHub Secrets:在仓库Settings > Secrets中添加:
-
SERVER_HOST
:服务器IP -
SERVER_USER
:SSH用户名(如ubuntu/root) -
SSH_PRIVATE_KEY
:SSH私钥内容
-
-
配置Workflow:
- name: Deploy to serveruses: appleboy/scp-action@masterwith:host: ${{ secrets.HOST }}username: ${{ secrets.USERNAME }}port: ${{ secrets.PORT }}key: ${{ secrets.KEY }}source: "dist/"target: "/var/www/html"
3.2 容器化部署方案
对于更复杂的应用,推荐使用Docker容器化部署:
编写Dockerfile:
FROM node:14-alpineWORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run buildEXPOSE 3000
CMD ["npm", "start"]
配置Workflow构建并推送镜像:
- name: Login to Docker Hubuses: docker/login-action@v1with:username: ${{ secrets.DOCKER_USERNAME }}password: ${{ secrets.DOCKER_PASSWORD }}- name: Build and pushuses: docker/build-push-action@v2with:push: truetags: ${{ secrets.DOCKER_USERNAME }}/myapp:latest
服务器端部署脚本:
#!/bin/bash
docker pull username/myapp:latest
docker stop myapp || true
docker rm myapp || true
docker run -d --name myapp -p 3000:3000 username/myapp:latest
3.3 使用AWS CodeDeploy(高级方案)
对于AWS环境,可以使用CodeDeploy实现更专业的部署:
- name: Configure AWS credentialsuses: aws-actions/configure-aws-credentials@v1with:aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}aws-region: us-east-1- name: Create CodeDeploy Deploymentrun: |aws deploy create-deployment \--application-name myapp \--deployment-group-name production \--deployment-config-name CodeDeployDefault.OneAtATime \--github-location repository=${{ github.repository }},commitId=${{ github.sha }}
注意:AWS CodeDeploy应用程序组不能同时进行两个部署,需要合理安排部署顺序
四、阿里云OSS+ECS部署方案
对于静态网站,可以使用阿里云OSS作为存储,ECS作为后端:
配置OSS Bucket:
-
创建Bucket并设置公共读权限
-
设置默认首页为index.html
-
配置CDN加速
Workflow配置:
- name: setup aliyun ossuses: manyuanrong/setup-ossutil@masterwith:endpoint: oss-cn-beijing.aliyuncs.comaccess-key-id: ${{ secrets.OSS_KEY_ID }}access-key-secret: ${{ secrets.OSS_KEY_SECRET }}- name: cp aliyun ossrun: ossutil cp -rf public oss://my-bucket
五、最佳实践与优化建议
5.1 安全最佳实践
-
最小权限原则:为CI/CD流程配置最小必要的权限
-
使用Secrets管理敏感信息:切勿在代码中硬编码凭证
-
定期轮换密钥:定期更新SSH密钥和API凭证
-
网络隔离:限制安全组只允许特定IP访问管理端口
5.2 性能优化
缓存依赖:利用GitHub Actions缓存机制加速构建
- name: Cache node modulesuses: actions/cache@v2with:path: ~/.npmkey: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}restore-keys: |${{ runner.os }}-node-
矩阵构建:并行测试不同环境
strategy:matrix:node-version: [12.x, 14.x, 16.x]
自托管Runner:对于大型项目,考虑使用自托管Runner提高性能
5.3 监控与日志
配置通知:在Workflow中添加成功/失败通知
集中日志:将部署日志发送到云日志服务
健康检查:部署后自动运行健康检查
- name: Health checkrun: |curl -sSf http://${{ secrets.SERVER_HOST }} > /dev/null || exit 1
六、常见问题与解决方案
6.1 SSH连接失败
问题:GitHub Actions无法通过SSH连接到服务器
解决方案:
-
检查安全组是否开放了SSH端口(默认22)
-
验证SSH密钥是否正确配置
-
检查服务器sshd配置是否允许root登录
# 在服务器上检查sshd配置
sudo vi /etc/ssh/sshd_config
# 确保有 PermitRootLogin yes
sudo service sshd restart
6.2 部署后文件权限问题
问题:部署后Web服务器无法访问文件
解决方案:
确保Web服务器用户有文件读取权限
在部署步骤中设置正确权限
- name: Set correct permissionsrun: |ssh ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} "chown -R www-data:www-data /var/www/html"
6.3 多仓库协同部署
问题:多个仓库需要同时部署到同一服务器时冲突
解决方案:
-
为每个项目使用独立目录
-
使用不同的端口或子域名
-
考虑使用容器隔离不同项目
七、总结
本文详细介绍了如何利用AWS EC2或阿里云ECS结合GitHub Actions构建完整的CI/CD流水线。从基础的SSH部署到容器化高级方案,再到阿里云OSS集成,提供了多种场景下的解决方案。通过自动化部署,团队可以:
-
提高发布频率,加速迭代速度
-
减少人为错误,提高部署可靠性
-
实现快速回滚,降低故障影响
-
解放开发人员生产力,专注于代码开发
随着云原生技术的发展,CI/CD流程也在不断演进。建议读者在实践中不断优化自己的部署流程,结合项目特点选择最适合的方案。
相关文章:
云部署实战:基于AWS EC2/Aliyun ECS与GitHub Actions的CI/CD全流程指南
在当今快速迭代的软件开发环境中,云部署与持续集成/持续交付(CI/CD)已成为现代开发团队的标配。本文将详细介绍如何利用AWS EC2或阿里云ECS结合GitHub Actions构建高效的CI/CD流水线,从零开始实现自动化部署的全过程。 最近挖到一个宝藏级人工智能学习网…...
golang 如何定义一种能够与自身类型值进行比较的Interface
定义一种具有比较能力的类型是一种常见需求,比如对一组相同类型的值进行排序,就需要进行两两比较,那么在Go语言中有没有办法定义一种具有比较能力的Interface,实现该接口的类型都具备比较能力呢,最常见最容易的办法是定…...

Web前端之原生表格动态复杂合并行、Vue
MENU 效果公共数据纯原生StyleJavaScript vue原生table 效果 原生的JavaScript原生table null 公共数据 const list [{id: "a1",title: "第一列",list: [{id: "a11",parentId: "a1",title: "第二列",list: [{ id: "…...

『uniapp』把接口的内容下载为txt本地保存 / 读取本地保存的txt文件内容(详细图文注释)
目录 预览效果思路分析downloadTxt 方法readTxt 方法 完整代码总结 欢迎关注 『uniapp』 专栏,持续更新中 欢迎关注 『uniapp』 专栏,持续更新中 预览效果 思路分析 downloadTxt 方法 该方法主要完成两个任务: 下载 txt 文件:通…...
C/C++ 面试复习笔记(2)
C语言如何实现快速排序算法? 答案:快排是一种分治算法,选择一个基准元素,将数据划分成两部分,然后递归排序 补充: void quick_sort(int arr[], int start, int end) {//判断是否需要排序if (start > …...
宝马集团推进数字化转型:强化生产物流与财务流程,全面引入SAP现代架构
2025年6月,宝马集团宣布在生产物流与财务流程领域取得重大数字化成果。这些进展标志着集团全球范围内采用基于云的新型SAP架构进入关键阶段,旨在提升运营效率、透明度和AI能力,为未来工业发展奠定技术基础。 一、生产物流全球数字化部署 宝…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 时间事件处理部分)
揭秘高效存储模型与数据结构底层实现 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 时间事件:serverCron函数更新服务器时间缓存更新LRU时钟-lruclock更新服务器每秒执行命令次…...

【DAY40】训练和测试的规范写法
内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点: 彩色和灰度图片测试和训练的规范写法:封装在函数中展平操作:除第一个维度batchsize外全部展平dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭drop…...
C语言 标准I/O函数全面指南
C标准I/O函数全面指南 本指南详细介绍了C语言中用于文件操作的标准输入/输出函数,包括单字符I/O、字符串I/O、格式化I/O、块I/O以及文件光标操作。每个部分包含函数定义、使用说明和实用示例,适合学习、复习以及博客发布。内容采用清晰的Markdown格式&a…...

el-select 实现分页加载,切换也数滚回到顶部,自定义高度
el-select 实现分页加载,切换也数滚回到顶部,自定义高度 1.html <el-form-item label"俱乐部:" prop"club_id" label-width"120px"><el-select :disabled"Boolean(match_id)" style"w…...

Langchaine4j 流式输出 (6)
Langchaine4j 流式输出 大模型的流式输出是指大模型在生成文本或其他类型的数据时,不是等到整个生成过程完成后再一次性 返回所有内容,而是生成一部分就立即发送一部分给用户或下游系统,以逐步、逐块的方式返回结果。 这样,用户…...
Jenkins:自动化流水线的基石,开启 DevOps 新时代
从持续集成到持续交付的全流程自动化工具 一、什么是 Jenkins? Jenkins 是一款开源的 自动化服务器,专注于持续集成(CI)和持续交付(CD)。它通过插件化的架构支持几乎所有的开发、运维和测试工具ÿ…...

学习经验分享【40】目标检测热力图制作
目标检测热力图在学术论文(尤其是计算机视觉、深度学习领域)中是重要的可视化分析工具和论证辅助手段,可以给论文加分不少。主要作用一是增强论文的可解释性与说服力:论文中常需解释模型 “如何” 或 “为何” 检测到目标…...

C#里与嵌入式系统W5500网络通讯(3)
有与W5500通讯时,需要使用下面的寄存器: PHYCFGR (W5500 PHY Configuration Register) [R/W] [0x002E] [0b10111XXX] PHYCFGR configures PHY operation mode and resets PHY. In addition, PHYCFGR indicates the status of PHY such as duplex, Speed, Link. 这张表格详细…...

用OpenNI2获取奥比中光Astra Pro输出的深度图(win,linux arm64 x64平台)
搞了一个奥比中光Astra Pro,想在windows平台,和linux rk3588 (香橙派,ubuntu2404,debian)上获取深度信息,之前的驱动下载已经不好用了,参考如下 Astra 3D相机选型建议 - 知乎https://zhuanlan.zhihu.com/p/594485674 …...

Unity VR/MR开发-VR设备与适用场景分析
视频讲解链接:【XR马斯维】VR/MR设备与适用场景分析?【UnityVR/MR开发教程--入门】_游戏热门视频...

Linux: network: switch:arp cache更新规则 [chatGPT]
文章目录 介绍概念普通包带有不同的mac,是否更新arp cache?普通包带有相同的mac,是否刷新 aging timeswitch是否会主动学习介绍 关于arp cache在switch侧的行为。有很多问题需要理解。 概念 HP L3 - IP Services Configuration Guide 文档里有写:dynamic arp entry的解说…...

Java网络编程API 1
Java中的网络编程API一共有两套:一套是UDP协议使用的API;另一套是TCP协议使用的API。这篇文章我们先来介绍UDP版本的API,并尝试来写一个回显服务器(接收到的请求是什么,返回的响应就是什么)。 UDP数据报套…...
Android协程学习
目录 Android上的Kotlin协程介绍基本概念与简单使用示例协程的高级用法 结构化并发线程调度器(Dispatchers)自定义调度器并发:同步 vs 异步 异步并发(async 并行执行)同步顺序执行协程取消与超时 取消机制超时控制异步数据流 Flow协程间通信 使用 Channel使用 StateFlow /…...
Angular报错:cann‘t bind to ngClass since it is‘t a known property of div
遇到的错误: Cant bind to ngClass since it isnt a known property of div这个错误是 Angular 中 最常见的模板编译错误之一,通常出现在你试图使用 ngClass 指令,但 Angular 没有识别它的情况下。 ✅ 错误的根本原因 Angular 不知道 ngCla…...
uniapp+vue3实现CK通信协议(基于jjc-tcpTools)
1. TCP 服务封装 (tcpService.js) export class TcpService {constructor() {this.connections uni.requireNativePlugin(jjc-tcpTools)this.clients new Map() // 存储客户端连接this.servers new Map() // 存储服务端实例}// 创建 TCP 服务端 (字符串模式)createStringSe…...
Python爬虫实战:研究urlparse库相关技术
1 引言 1.1 研究背景与意义 网络爬虫作为互联网数据采集的核心技术,在信息检索、舆情分析、数据挖掘等领域具有广泛应用。随着 Web 技术的发展,现代网站 URL 结构日益复杂,包含路径参数、查询参数、锚点等多种组件,且存在相对路径、URL 编码等问题,给爬虫开发带来了挑战…...
解锁FastAPI与MongoDB聚合管道的性能奥秘
title: 解锁FastAPI与MongoDB聚合管道的性能奥秘 date: 2025/05/20 20:24:47 updated: 2025/05/20 20:24:47 author: cmdragon excerpt: MongoDB聚合管道是一种分阶段处理数据的流水线,通过$match、$group等阶段对文档进行特定操作,具有内存优化和原生操…...
软件工程方法论:在确定性与不确定性的永恒之舞中寻找平衡
更多精彩请访问:通义灵码2.5——基于编程智能体开发Wiki多功能搜索引擎-CSDN博客 当我们谈论“软件工程”时,“工程”二字总暗示着某种如桥梁建造般的精确与可控。然而,软件的本质却根植于人类思维的复杂性与需求的流变之中。软件工程方法论的…...
Unity中的MonoSingleton<T>与Singleton<T>
1.MonoSingleton 代码部分 using UnityEngine;/// <summary> /// MonoBehaviour单例基类 /// 需要挂载到GameObject上使用 /// </summary> public class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T> {private static T _instance;…...
怎么通过 jvmti 去 hook java 层函数
使用 JVMTI 手动实现 Android Java 函数 Hook 要通过 JVMTI 手动实现 Android Java 函数 Hook,需要编写 Native 层代码并注入到目标进程中。以下是详细步骤和示例: 一、核心实现原理 JVMTI 提供两种主要 Hook 方式: Method Entry/Exit 事…...

兰亭妙微 | 医疗软件的界面设计能有多专业?
从医疗影像系统到手术机器人控制界面,从便携式病原体检测设备到多平台协同操作系统,兰亭妙微为众多医疗设备研发企业,打造了兼具专业性与可用性的交互界面方案。 我们不仅做设计,更深入理解医疗场景的实际需求: 对精…...

前端原生构建交互式进度步骤组件(Progress Steps)
在现代网页设计中,进度步骤(Progress Steps) 是一种常见的 UI 模式,常用于引导用户完成注册流程、多步表单、教程或任何需要分步骤操作的场景。本文将带你从零开始构建一个美观且功能完整的 “进度步骤”组件,并详细讲…...
如何给windos11 扩大C盘容量
动不动C盘就慢了,苹果逼着用户换手机,三天两头更新系统,微软也是毫不手软。c盘 从10个G就够用,到100G 也不够,看来通货膨胀是部分行业的。 在 Windows 11 中扩大 C 盘容量,主要取决于磁盘分区布局和可用空…...

【基于阿里云搭建数据仓库(离线)】Data Studio创建资源与函数
Data Studio支持在您的数据分析代码中引用自定义的资源和函数(支持MaxCompute、EMR、CDH、Flink),您需要先创建或上传资源、函数至目标工作空间,上传后才可在该工作空间的任务中使用。您可参考本文了解如何使用DataWorks可视化方式…...