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 应用:

python 复制代码
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

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 镜像:

bash 复制代码
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 仓库:

bash 复制代码
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

yaml 复制代码
name: CI/CD Pipeline
on:
  push:
    branches: [ main ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.10'
      - name: Install dependencies
        run: pip install -r requirements.txt
      - name: Run tests
        run: python -m unittest discover
      - name: Build Docker image
        run: docker build -t flask-devops-demo .
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Push Docker image
        run: |
          docker tag flask-devops-demo ${DOCKER_USERNAME}/flask-devops-demo:latest
          docker push ${DOCKER_USERNAME}/flask-devops-demo:latest

配置 Docker Hub 密钥:

  • 在 GitHub 仓库的 Settings > Secrets and variables > Actions 中添加 DOCKER_USERNAMEDOCKER_PASSWORD

说明

  • 工作流在代码推送时运行,构建、测试并推送 Docker 镜像到 Docker Hub。

步骤 4: 配置 Jenkins CI/CD(替代方案)

在本地或 EC2 上安装 Jenkins:

bash 复制代码
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

groovy 复制代码
pipeline {
    agent any
    stages {
        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

  1. 启动 EC2 实例

    • 在 AWS 控制台创建 Ubuntu 22.04 实例,开放 80 和 22 端口。
    • SSH 登录:ssh -i key.pem ubuntu@ec2-ip.
  2. 安装 Docker

    bash 复制代码
    sudo apt update
    sudo apt install docker.io -y
    sudo usermod -aG docker ubuntu
  3. 部署应用

    bash 复制代码
    docker pull your-docker-username/flask-devops-demo:latest
    docker run -d -p 80:5000 your-docker-username/flask-devops-demo:latest
  4. 验证

    • 访问 http://ec2-ip,确认显示"Hello, DevOps!"。

步骤 6: 运行和测试

  1. 测试 CI/CD

    • 提交代码更改到 GitHub,验证 Actions 自动运行。
    • 检查 Jenkins 构建日志,确认测试和镜像推送成功。
  2. 测试部署

    • 访问 EC2 公网 IP,验证应用运行。
    • 检查 Docker 容器状态:docker ps.
  3. 调试技巧

    • 查看 Actions 日志:GitHub 仓库 Actions 页面。
    • 检查 Jenkins 失败原因:Console Output。
    • 服务器日志:docker logs container-id.

进阶与最佳实践

  • 监控与日志

    • 集成 Prometheus 和 Grafana:

      bash 复制代码
      docker run -d -p 9090:9090 prom/prometheus
      docker run -d -p 3000:3000 grafana/grafana
    • 配置 Flask 应用日志:

      python 复制代码
      import logging
      logging.basicConfig(level=logging.INFO)
      app.logger.info('Application started')
  • 自动化部署

    • 使用 Terraform 自动化 EC2 配置:

      hcl 复制代码
      provider "aws" {
        region = "us-east-1"
      }
      resource "aws_instance" "app" {
        ami           = "ami-0c55b159cbfafe1f0"
        instance_type = "t2.micro"
      }
  • 安全性

    • 配置 AWS 安全组,仅允许 80、22 和 443 端口。
    • 使用 HTTPS:通过 Let's Encrypt 配置 Nginx(参考上一教程)。
  • 蓝绿部署

    • 使用 Docker Compose 实现零停机部署:

      yaml 复制代码
      version: '3'
      services:
        app:
          image: your-docker-username/flask-devops-demo:latest
          ports:
            - "80:5000"
  • 资源推荐

    • 书籍《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 实践通过自动化和协作加速软件交付,适用于现代开发流程。

相关推荐
七夜zippoe15 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy64816 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满16 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠17 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey90317 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技18 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀18 小时前
Linux环境变量
linux·运维·服务器
zzzsde18 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º20 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~20 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化