云部署实战:基于AWS EC2/Aliyun ECS与GitHub Actions的CI/CD全流程指南

news2025/6/7 3:30:46

在当今快速迭代的软件开发环境中,云部署与持续集成/持续交付(CI/CD)已成为现代开发团队的标配。本文将详细介绍如何利用AWS EC2或阿里云ECS结合GitHub Actions构建高效的CI/CD流水线,从零开始实现自动化部署的全过程。

最近挖到一个宝藏级人工智能学习网站,内容通俗到爆,讲解风趣幽默,连我这种零基础都能轻松上手!学AI居然能这么爽,必须安利给你们!点击去了解。

一、云服务器基础配置

1.1 AWS EC2实例创建与配置

AWS EC2是亚马逊提供的弹性计算服务,创建实例的第一步是选择合适的AMI(Amazon Machine Image):

  1. 登录AWS控制台,进入EC2服务

  2. 点击"启动实例",选择适合的AMI(如Ubuntu 20.04 LTS)

  3. 根据项目需求选择实例类型(测试环境可选t2.micro,生产环境建议t2.medium及以上)

  4. 配置安全组,开放必要端口(如SSH的22端口,HTTP的80端口等)

  5. 创建或选择现有密钥对,用于SSH连接

1.2 阿里云ECS实例创建与配置

阿里云ECS的创建流程与AWS EC2类似:

  1. 登录阿里云控制台,进入ECS服务

  2. 选择"创建实例",选择地域和可用区

  3. 选择镜像(如CentOS 7.9或Ubuntu 20.04)

  4. 选择实例规格(1核2G适合测试,生产环境建议2核4G以上)

  5. 配置安全组规则,开放必要端口

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 Deploy

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v2
    
    - name: Setup Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '14'
        
    - name: Install dependencies
      run: npm install
      
    - name: Build project
      run: npm run build
      
    - name: Run tests
      run: npm test

三、自动化部署到云服务器

3.1 使用SSH直接部署到EC2/ECS

对于简单项目,可以直接通过SSH将构建产物部署到服务器:

  1. 生成SSH密钥对:在服务器上执行ssh-keygen生成密钥对

  2. 配置GitHub Secrets:在仓库Settings > Secrets中添加:

    • SERVER_HOST:服务器IP

    • SERVER_USER:SSH用户名(如ubuntu/root)

    • SSH_PRIVATE_KEY:SSH私钥内容

  3. 配置Workflow

- name: Deploy to server
  uses: appleboy/scp-action@master
  with:
    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-alpine

WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

EXPOSE 3000
CMD ["npm", "start"]

配置Workflow构建并推送镜像

- name: Login to Docker Hub
  uses: docker/login-action@v1
  with:
    username: ${{ secrets.DOCKER_USERNAME }}
    password: ${{ secrets.DOCKER_PASSWORD }}
    
- name: Build and push
  uses: docker/build-push-action@v2
  with:
    push: true
    tags: ${{ 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 credentials
  uses: aws-actions/configure-aws-credentials@v1
  with:
    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 Deployment
  run: |
    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 oss
  uses: manyuanrong/setup-ossutil@master
  with:
    endpoint: oss-cn-beijing.aliyuncs.com
    access-key-id: ${{ secrets.OSS_KEY_ID }}
    access-key-secret: ${{ secrets.OSS_KEY_SECRET }}
    
- name: cp aliyun oss
  run: ossutil cp -rf public oss://my-bucket

五、最佳实践与优化建议

5.1 安全最佳实践

  1. 最小权限原则:为CI/CD流程配置最小必要的权限

  2. 使用Secrets管理敏感信息:切勿在代码中硬编码凭证

  3. 定期轮换密钥:定期更新SSH密钥和API凭证

  4. 网络隔离:限制安全组只允许特定IP访问管理端口

5.2 性能优化

缓存依赖:利用GitHub Actions缓存机制加速构建

- name: Cache node modules
  uses: actions/cache@v2
  with:
    path: ~/.npm
    key: ${{ 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 check
  run: |
    curl -sSf http://${{ secrets.SERVER_HOST }} > /dev/null || exit 1

六、常见问题与解决方案

6.1 SSH连接失败

问题:GitHub Actions无法通过SSH连接到服务器

解决方案

  1. 检查安全组是否开放了SSH端口(默认22)

  2. 验证SSH密钥是否正确配置

  3. 检查服务器sshd配置是否允许root登录

# 在服务器上检查sshd配置
sudo vi /etc/ssh/sshd_config
# 确保有 PermitRootLogin yes
sudo service sshd restart

6.2 部署后文件权限问题

问题:部署后Web服务器无法访问文件

解决方案

确保Web服务器用户有文件读取权限

在部署步骤中设置正确权限

- name: Set correct permissions
  run: |
    ssh ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} "chown -R www-data:www-data /var/www/html"

6.3 多仓库协同部署

问题:多个仓库需要同时部署到同一服务器时冲突

解决方案

  1. 为每个项目使用独立目录

  2. 使用不同的端口或子域名

  3. 考虑使用容器隔离不同项目

七、总结

本文详细介绍了如何利用AWS EC2或阿里云ECS结合GitHub Actions构建完整的CI/CD流水线。从基础的SSH部署到容器化高级方案,再到阿里云OSS集成,提供了多种场景下的解决方案。通过自动化部署,团队可以:

  1. 提高发布频率,加速迭代速度

  2. 减少人为错误,提高部署可靠性

  3. 实现快速回滚,降低故障影响

  4. 解放开发人员生产力,专注于代码开发

随着云原生技术的发展,CI/CD流程也在不断演进。建议读者在实践中不断优化自己的部署流程,结合项目特点选择最适合的方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402412.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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 文件:通…

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 时间事件处理部分)

揭秘高效存储模型与数据结构底层实现 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 时间事件:serverCron函数更新服务器时间缓存更新LRU时钟-lruclock更新服务器每秒执行命令次…

【DAY40】训练和测试的规范写法

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点: 彩色和灰度图片测试和训练的规范写法:封装在函数中展平操作:除第一个维度batchsize外全部展平dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭drop…

el-select 实现分页加载,切换也数滚回到顶部,自定义高度

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

Langchaine4j 流式输出 (6)

Langchaine4j 流式输出 大模型的流式输出是指大模型在生成文本或其他类型的数据时&#xff0c;不是等到整个生成过程完成后再一次性 返回所有内容&#xff0c;而是生成一部分就立即发送一部分给用户或下游系统&#xff0c;以逐步、逐块的方式返回结果。 这样&#xff0c;用户…

学习经验分享【40】目标检测热力图制作

目标检测热力图在学术论文&#xff08;尤其是计算机视觉、深度学习领域&#xff09;中是重要的可视化分析工具和论证辅助手段&#xff0c;可以给论文加分不少。主要作用一是增强论文的可解释性与说服力&#xff1a;论文中常需解释模型 “如何” 或 “为何” 检测到目标&#xf…

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&#xff0c;想在windows平台&#xff0c;和linux rk3588 &#xff08;香橙派&#xff0c;ubuntu2404,debian)上获取深度信息&#xff0c;之前的驱动下载已经不好用了,参考如下 Astra 3D相机选型建议 - 知乎https://zhuanlan.zhihu.com/p/594485674 …

Unity VR/MR开发-VR设备与适用场景分析

视频讲解链接&#xff1a;【XR马斯维】VR/MR设备与适用场景分析&#xff1f;【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一共有两套&#xff1a;一套是UDP协议使用的API&#xff1b;另一套是TCP协议使用的API。这篇文章我们先来介绍UDP版本的API&#xff0c;并尝试来写一个回显服务器&#xff08;接收到的请求是什么&#xff0c;返回的响应就是什么&#xff09;。 UDP数据报套…

兰亭妙微 | 医疗软件的界面设计能有多专业?

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

前端原生构建交互式进度步骤组件(Progress Steps)

在现代网页设计中&#xff0c;进度步骤&#xff08;Progress Steps&#xff09; 是一种常见的 UI 模式&#xff0c;常用于引导用户完成注册流程、多步表单、教程或任何需要分步骤操作的场景。本文将带你从零开始构建一个美观且功能完整的 “进度步骤”组件&#xff0c;并详细讲…

【基于阿里云搭建数据仓库(离线)】Data Studio创建资源与函数

Data Studio支持在您的数据分析代码中引用自定义的资源和函数&#xff08;支持MaxCompute、EMR、CDH、Flink&#xff09;&#xff0c;您需要先创建或上传资源、函数至目标工作空间&#xff0c;上传后才可在该工作空间的任务中使用。您可参考本文了解如何使用DataWorks可视化方式…

web3-以太坊智能合约基础(理解智能合约Solidity)

以太坊智能合约基础&#xff08;理解智能合约/Solidity&#xff09; 无需编程经验&#xff0c;也可以帮助你了解Solidity独特的部分&#xff1b;如果本身就有相应的编程经验如java&#xff0c;python等那么学起来也会非常的轻松 一、Solidity和EVM字节码 实际上以太坊链上储存…

【C++项目】负载均衡在线OJ系统-2

文章目录 oj_server模块编写oj_server框架的搭建-oj_server/oj_server.cpp 路由框架 oj_model模块编写题目信息设置v1.文件版本-common/util.hpp boost库spilt函数的使用-oj_server/oj_model_file.hpp 文件版本model编写v2.mysql数据库版本1.mysql创建授权用户、建库建表录入操…

GC1809:高性能24bit/192kHz音频接收芯片解析

1. 芯片概述 GC1809 是数字音频接收芯片&#xff0c;支持IEC60958、S/PDIF、AES3等协议&#xff0c;集成8选1输入切换、低抖动时钟恢复和24bit DAC&#xff0c;适用于家庭影院、汽车音响等高保真场景。 核心特性 高精度&#xff1a;24bit分辨率&#xff0c;动态范围105dB&…

2025年06月05日Github流行趋势

项目名称&#xff1a;onlook 项目地址url&#xff1a;https://github.com/onlook-dev/onlook项目语言&#xff1a;TypeScript历史star数&#xff1a;16165今日star数&#xff1a;1757项目维护者&#xff1a;Kitenite, drfarrell, spartan-vutrannguyen, apps/devin-ai-integrat…

基于BI PaaS架构的衡石HENGSHI SENSE平台技术解析:重塑企业级数据分析基座

在数据驱动决策的时代&#xff0c;传统BI工具日益显露出扩展性弱、灵活性差、资源利用率低等痛点。衡石科技推出的HENGSHI SENSE平台&#xff0c;创新性地采用BI PaaS&#xff08;平台即服务&#xff09;架构&#xff0c;为企业构建了一个强大、开放、可扩展的数据分析基础设施…