DevOps 与 部署入门:加速软件交付与运维的实践指南
DevOps 与 部署入门:加速软件交付与运维的实践指南
今天我们来深入探讨 DevOps 及其部署实践。DevOps 是一种文化和方法论,通过自动化、协作和持续改进,连接开发(Development)与运维(Operations),以实现快速、可靠的软件交付。本文将带你从零开始实现一个 DevOps 流水线,部署一个简单的 Web 应用,适合初学者快速上手,同时为有经验的开发者提供进阶建议和优化思路。
本文基于 Docker、Jenkins 和 GitHub Actions,部署一个 Python Flask 应用到 AWS EC2,结合 CI/CD 流水线和监控。让我们开始吧!
前置准备
在开始之前,确保开发环境已就绪:
- 操作系统:Linux(Ubuntu 22.04 推荐)、Windows 或 macOS。
- 工具:
- Git:版本控制工具。
- Docker:容器化平台。
- Jenkins:CI/CD 服务器。
- AWS CLI:用于 EC2 部署。
- GitHub 账户:用于托管代码和 Actions。
- 云服务:AWS EC2 实例(或阿里云、Azure 等)。
- 项目结构:一个简单的 Flask 应用,目录如下:
flask-devops-demo ├── app.py ├── requirements.txt ├── Dockerfile ├── .github/workflows/ci.yml ├── Jenkinsfile └── .gitignore
安装环境:
- 安装 Git:
sudo apt install git
(Ubuntu)或brew install git
(macOS)。 - 安装 Docker:
sudo apt install docker.io
或从 docker.com 下载。 - 安装 AWS CLI:
pip install awscli
. - 配置 AWS 凭证:
aws configure
. - 验证:
git --version
,docker --version
,aws --version
.
步骤 1: 创建 Flask 应用
在 flask-devops-demo/app.py
中创建简单的 Flask 应用:
from flask import Flask
app = Flask(__name__)@app.route('/')
def hello():return 'Hello, DevOps!'if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
创建 flask-devops-demo/requirements.txt
:
Flask==2.3.3
gunicorn==23.0.0
创建 .gitignore
:
venv/
*.pyc
__pycache__/
步骤 2: 容器化应用
创建 flask-devops-demo/Dockerfile
:
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
构建并测试 Docker 镜像:
docker build -t flask-devops-demo .
docker run -p 5000:5000 flask-devops-demo
访问 http://localhost:5000
,验证输出“Hello, DevOps!”。
步骤 3: 配置 GitHub Actions CI/CD
将代码推送到 GitHub 仓库:
git init
git add .
git commit -m "Initial commit"
git remote add origin git@github.com:your-username/flask-devops-demo.git
git push -u origin main
创建 GitHub Actions 工作流 flask-devops-demo/.github/workflows/ci.yml
:
name: CI/CD Pipeline
on:push:branches: [ main ]
jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v4- name: Set up Pythonuses: actions/setup-python@v5with:python-version: '3.10'- name: Install dependenciesrun: pip install -r requirements.txt- name: Run testsrun: python -m unittest discover- name: Build Docker imagerun: docker build -t flask-devops-demo .- name: Login to Docker Hubuses: docker/login-action@v3with:username: ${{ secrets.DOCKER_USERNAME }}password: ${{ secrets.DOCKER_PASSWORD }}- name: Push Docker imagerun: |docker tag flask-devops-demo ${DOCKER_USERNAME}/flask-devops-demo:latestdocker push ${DOCKER_USERNAME}/flask-devops-demo:latest
配置 Docker Hub 密钥:
- 在 GitHub 仓库的 Settings > Secrets and variables > Actions 中添加
DOCKER_USERNAME
和DOCKER_PASSWORD
。
说明:
- 工作流在代码推送时运行,构建、测试并推送 Docker 镜像到 Docker Hub。
步骤 4: 配置 Jenkins CI/CD(替代方案)
在本地或 EC2 上安装 Jenkins:
sudo apt update
sudo apt install openjdk-17-jre -y
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt update
sudo apt install jenkins -y
sudo systemctl start jenkins
访问 http://server-ip:8080
,完成 Jenkins 初始化。
创建 flask-devops-demo/Jenkinsfile
:
pipeline {agent anystages {stage('Checkout') {steps {git 'https://github.com/your-username/flask-devops-demo.git'}}stage('Build') {steps {sh 'pip install -r requirements.txt'}}stage('Test') {steps {sh 'python -m unittest discover'}}stage('Build Docker Image') {steps {sh 'docker build -t flask-devops-demo .'}}stage('Push Docker Image') {steps {withCredentials([usernamePassword(credentialsId: 'docker-hub', usernameVariable: 'DOCKER_USERNAME', passwordVariable: 'DOCKER_PASSWORD')]) {sh 'echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin'sh 'docker tag flask-devops-demo $DOCKER_USERNAME/flask-devops-demo:latest'sh 'docker push $DOCKER_USERNAME/flask-devops-demo:latest'}}}}
}
在 Jenkins 中配置:
- 新建 Pipeline 项目,指向 GitHub 仓库和
Jenkinsfile
。 - 添加 Docker Hub 凭证(ID:
docker-hub
)。
步骤 5: 部署到 AWS EC2
-
启动 EC2 实例:
- 在 AWS 控制台创建 Ubuntu 22.04 实例,开放 80 和 22 端口。
- SSH 登录:
ssh -i key.pem ubuntu@ec2-ip
.
-
安装 Docker:
sudo apt update sudo apt install docker.io -y sudo usermod -aG docker ubuntu
-
部署应用:
docker pull your-docker-username/flask-devops-demo:latest docker run -d -p 80:5000 your-docker-username/flask-devops-demo:latest
-
验证:
- 访问
http://ec2-ip
,确认显示“Hello, DevOps!”。
- 访问
步骤 6: 运行和测试
-
测试 CI/CD:
- 提交代码更改到 GitHub,验证 Actions 自动运行。
- 检查 Jenkins 构建日志,确认测试和镜像推送成功。
-
测试部署:
- 访问 EC2 公网 IP,验证应用运行。
- 检查 Docker 容器状态:
docker ps
.
-
调试技巧:
- 查看 Actions 日志:GitHub 仓库 Actions 页面。
- 检查 Jenkins 失败原因:Console Output。
- 服务器日志:
docker logs container-id
.
进阶与最佳实践
-
监控与日志:
- 集成 Prometheus 和 Grafana:
docker run -d -p 9090:9090 prom/prometheus docker run -d -p 3000:3000 grafana/grafana
- 配置 Flask 应用日志:
import logging logging.basicConfig(level=logging.INFO) app.logger.info('Application started')
- 集成 Prometheus 和 Grafana:
-
自动化部署:
- 使用 Terraform 自动化 EC2 配置:
provider "aws" {region = "us-east-1" } resource "aws_instance" "app" {ami = "ami-0c55b159cbfafe1f0"instance_type = "t2.micro" }
- 使用 Terraform 自动化 EC2 配置:
-
安全性:
- 配置 AWS 安全组,仅允许 80、22 和 443 端口。
- 使用 HTTPS:通过 Let’s Encrypt 配置 Nginx(参考上一教程)。
-
蓝绿部署:
- 使用 Docker Compose 实现零停机部署:
version: '3' services:app:image: your-docker-username/flask-devops-demo:latestports:- "80:5000"
- 使用 Docker Compose 实现零停机部署:
-
资源推荐:
- 书籍《The DevOps Handbook》、《Site Reliability Engineering》。
- Docker 官网(docker.com)、AWS 文档(aws.amazon.com)。
- 多实践 Kubernetes 和 ArgoCD。
总结
通过这个 DevOps 示例,你学会了使用 GitHub Actions 和 Jenkins 构建 CI/CD 流水线,容器化 Flask 应用,并部署到 AWS EC2。DevOps 实践通过自动化和协作加速软件交付,适用于现代开发流程。