在当今快速迭代的软件开发环境中,云部署与持续集成/持续交付(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 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将构建产物部署到服务器:
-
生成SSH密钥对:在服务器上执行
ssh-keygen
生成密钥对 -
配置GitHub Secrets:在仓库Settings > Secrets中添加:
-
SERVER_HOST
:服务器IP -
SERVER_USER
:SSH用户名(如ubuntu/root) -
SSH_PRIVATE_KEY
:SSH私钥内容
-
-
配置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 安全最佳实践
-
最小权限原则:为CI/CD流程配置最小必要的权限
-
使用Secrets管理敏感信息:切勿在代码中硬编码凭证
-
定期轮换密钥:定期更新SSH密钥和API凭证
-
网络隔离:限制安全组只允许特定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连接到服务器
解决方案:
-
检查安全组是否开放了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 permissions
run: |
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流程也在不断演进。建议读者在实践中不断优化自己的部署流程,结合项目特点选择最适合的方案。