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

相关推荐
DARLING Zero two♡3 小时前
【Linux操作系统】简学深悟启示录:进程间通信
linux·运维·服务器
半梦半醒*3 小时前
gitlab部署
linux·运维·centos·ssh·gitlab·jenkins
TG_yunshuguoji3 小时前
阿里云国际代理:阿里云备份如何保障数据安全?
运维·阿里云·云计算
KKKlucifer4 小时前
自动化漏洞利用技术颠覆传统:微软生态暴露的攻防新变局
运维·microsoft·自动化
此心光明事上练4 小时前
大厂级企业后端:配置变更与缓存失效的自动化处理方案
运维·缓存·自动化
java_logo4 小时前
Docker 部署 MinIO 全指南
运维·windows·mongodb·docker·容器
拾光Ծ4 小时前
【Linux】“ 权限 “ 与相关指令
linux·运维·服务器
To_再飞行4 小时前
Linux Bash(一)
linux·运维·服务器·bash
dyj0954 小时前
【Devops-Jenkins自动将Java Maven工程编译成jar、并打成Docker镜像,并上传Harbor】
java·jenkins·devops