<-

Hands on CI/CD with GitHub Actions

M:

作为一个数据工程师,我日常需要通过编写 Spark 脚本,将代码推送至 Github,并通过生成 Airflow DAG 调度执行任务,这个过程中我想实现一套 CI/CD,基于 Github 代码仓库更新自动部署;

我想在本地 Windows Subsystem for Linux,开发调试这套 CI/CD,希望你能从安装、前期准备、代码部署,等各个环节给我提供指导,并附带这么做的原因;

风格需要简洁严谨;

以一个专业的数据开发和顶级架构师给予指导;

假设我是一个刚接触编程的新手;

环节精简,具体操作以列表形式,力求信息全面、准确。

GPT-4o-mini:

安装与前期准备

1. 安装 WSL (Windows Subsystem for Linux):

打开 PowerShell 作为管理员,运行以下命令:

wsl --install

重启计算机以完成安装。

2. 选择并安装 Linux 发行版:

在 Microsoft Store 中选择并安装 Ubuntu 或其他你喜欢的发行版。

3. 更新系统:

打开 WSL 终端,运行以下命令以更新软件包:

sudo apt update && sudo apt upgrade -y

4. 安装 Git:

在 WSL 终端中运行:

sudo apt install git -y

5. 安装 Python 和 pip:

sudo apt install python3 python3-pip -y

6. 安装 Apache Spark:

wget https://downloads.apache.org/spark/spark-3.5.3/spark-3.5.3-bin-hadoop3.tgz

解压并设置环境变量:

tar -xvzf spark-3.5.3-bin-hadoop3.tgz
echo 'export SPARK_HOME=~/spark-3.5.3-bin-hadoop3' >> ~/.bashrc
echo 'export PATH=$PATH:$SPARK_HOME/bin' >> ~/.bashrc
source ~/.bashrc

代码部署与 CI/CD 设置

1. 创建 GitHub 仓库:

登录 GitHub,创建一个新的仓库用于存放你的 Spark 代码和 Airflow DAG。

2. 初始化本地 Git 仓库:

git init

3. 编写代码:

在项目中编写你的 Spark 脚本和 Airflow DAG 文件。

4. 提交代码到 GitHub:

添加远程仓库:

git remote add origin https://github.com/thekingofcool/hands_on_cicd.git

提交代码:

git add .
git commit -m "Initial commit"
git push -u origin master

5. 设置 CI/CD:

使用 GitHub Actions 创建一个工作流文件 .github/workflows/ci.yml

 name: CI/CD Pipeline

 on:
   push:
	 branches:
	   - master

 jobs:
   build:
	 runs-on: ubuntu-latest
	 steps:
	   - name: Checkout code
		 uses: actions/checkout@v2

	   - name: Set up Python
		 uses: actions/setup-python@v2
		 with:
		   python-version: '3.x'

	   - name: Install dependencies
		 run: |
		   pip install apache-airflow

	   - name: Run Spark job
		 run: |
		   spark-submit your_spark_script.py

原因与建议

  • 使用 WSL: 允许你在 Windows 上运行 Linux 工具,方便开发和调试。
  • Git 和 GitHub: 版本控制和代码托管,便于团队协作和代码管理。
  • CI/CD: 自动化测试和部署,减少手动操作,提高效率和可靠性。

进一步学习建议

  • 学习 Git 的基本命令和工作流程。
  • 深入了解 Apache Airflow 的 DAG 概念和任务调度。
  • 探索 GitHub Actions 的更多功能,了解如何自定义工作流。

M:

这两个脚本分别放在哪里才能让它们工作?我的目的是希望跑通这个流程,部署完成后能看到结果,希望你能详细告诉我该如何做。

GPT-4o-mini:

当然可以!以下是详细的步骤,告诉你如何将这两个脚本放置在合适的位置,并确保它们能够正常工作。我们将确保你能够顺利运行整个流程并查看结果。

1. 文件结构

首先,建议你创建一个项目文件夹,结构如下:

your_project/
│
├── dags/
│   └── data_processing_dag.py
│
├── scripts/
│   └── process_data.py
│
└── input_data.csv

2. 创建文件

1. 创建项目文件夹:

在 WSL 终端中,运行以下命令:

mkdir -p ~/your_project/dags ~/your_project/scripts
cd ~/your_project

2. 创建输入数据文件:

your_project 文件夹中创建一个名为 input_data.csv 的文件:

vim input_data.csv
category,value
A,10
A,20
B,30
B,40

3. 创建 Spark 脚本:

scripts 文件夹中创建 process_data.py 文件:

vim scripts/process_data.py
# process_data.py

from pyspark.sql import SparkSession

# 创建 Spark 会话
spark = SparkSession.builder \
    .appName("Data Processing") \
    .getOrCreate()

# 读取 CSV 文件
input_file = "input_data.csv"
df = spark.read.csv(input_file, header=True, inferSchema=True)

# 数据处理:计算每个类别的平均值
result_df = df.groupBy("category").agg({"value": "avg"})

# 将结果写入新的 CSV 文件
output_file = "output_data.csv"
result_df.write.csv(output_file, header=True)

# 停止 Spark 会话
spark.stop()

3. 配置 Airflow

1. 安装 Apache Airflow:

创建一个虚拟环境并激活:

python3 -m venv airflow_venv
source airflow_venv/bin/activate

安装 Airflow:

pip install apache-airflow

2. 初始化 Airflow 数据库:

在 WSL 终端中,运行以下命令以初始化 Airflow 数据库:

airflow db init

3. 创建 Airflow DAG 文件:

~/airflow/dags/ 文件夹中创建 data_processing_dag.py 文件:

vim ~/airflow/dags/data_processing_dag.py
# data_processing_dag.py

from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime
import subprocess

# 定义默认参数
default_args = {
    'owner': 'airflow',
    'start_date': datetime(2023, 1, 1),
    'retries': 1,
}

# 创建 DAG
dag = DAG(
    'data_processing_dag',
    default_args=default_args,
    description='A simple data processing DAG',
    schedule_interval='@daily',
)

# 定义执行 Spark 脚本的函数
def run_spark_job():
    subprocess.run(["spark-submit", "process_data.py"])

# 创建任务
run_spark = PythonOperator(
    task_id='run_spark_job',
    python_callable=run_spark_job,
    dag=dag,
)

# 设置任务依赖关系
run_spark

4. 启动 Airflow Web 服务器:

设置初始用户名密码:

airflow users  create --role Admin --username admin --email admin --firstname admin --lastname admin --password admin

在 WSL 终端中,运行以下命令以启动 Airflow Web 服务器:

airflow webserver --port 8080

5. 启动 Airflow 调度器:

在另一个终端窗口中,运行以下命令以启动 Airflow 调度器:

airflow scheduler

4. 运行 DAG

1. 访问 Airflow Web 界面:

打开浏览器,访问 http://localhost:8080

2. 启用 DAG:

在 Airflow Web 界面中,你应该能看到 data_processing_dag。点击开关以启用它。

3. 手动触发 DAG:

点击 DAG 名称,进入 DAG 详情页面,点击 “Trigger DAG” 按钮手动触发 DAG。

5. 查看结果

1. 检查任务状态:

在 DAG 详情页面中,你可以查看任务的执行状态。如果任务成功,状态将显示为绿色。

2. 查看输出文件:

运行完成后,检查 your_project 目录下是否生成了 output_data.csv 文件。

6. 整体流程总结

  • 你创建了一个项目文件夹,并在其中放置了输入数据、Spark 脚本和 Airflow DAG。
  • 通过 Airflow 启动 Web 服务器和调度器,手动触发 DAG 以运行数据处理任务。
  • 最后,你可以查看生成的输出文件,确认数据处理是否成功。

如果在任何步骤中遇到问题,或者有任何疑问,请随时问我!


M:

设置 GitHub Actions 的过程可以更详细一点吗?另外按照你设置的流程,这个 Spark 程序的触发机制以及运行的环境在哪里?

GPT-4o-mini:

当然可以!以下是详细的 GitHub Actions 设置过程,以及关于 Spark 程序触发机制和运行环境的解释。

GitHub Actions 设置过程

1. 创建 GitHub Actions 工作流

在项目中创建工作流文件夹:

在你的项目根目录下创建 .github/workflows 文件夹:

mkdir -p .github/workflows

创建工作流文件:

.github/workflows 文件夹中创建一个名为 ci.yml 的文件:

nano .github/workflows/ci.yml

添加工作流配置:

将以下内容粘贴到 ci.yml 文件中:

 name: CI/CD Pipeline

 on:
   push:
	 branches:
	   - master

 jobs:
   build:
	 runs-on: ubuntu-latest
	 steps:
	   - name: Checkout code
		 uses: actions/checkout@v2

	   - name: Set up Python
		 uses: actions/setup-python@v2
		 with:
		   python-version: '3.x'

	   - name: Install dependencies
		 run: |
		   pip install apache-airflow
		   pip install pyspark

	   - name: Run Spark job
		 run: |
		   spark-submit scripts/process_data.py

保存并提交工作流文件:

保存文件并退出编辑器。

在终端中,添加并提交工作流文件:

git add .github/workflows/ci.yml
git commit -m "Add GitHub Actions workflow"
git push

2. 触发 GitHub Actions

每当你将代码推送到 master 分支时,GitHub Actions 将自动触发工作流,运行 Spark 脚本。

Spark 程序的触发机制和运行环境

触发机制

在这个设置中,Spark 程序的触发机制是通过 GitHub Actions 的工作流配置实现的。每当你将代码推送到 GitHub 仓库的 master 分支时,GitHub Actions 会自动执行定义的工作流,运行 Spark 脚本。

运行环境

GitHub Actions 在 GitHub 的云环境中运行。具体来说,工作流在 GitHub 提供的虚拟机(称为 runner)上执行。在这个例子中,我们使用的是 ubuntu-latest 作为运行环境。

这意味着 Spark 程序将在 GitHub 的服务器上运行,而不是在你的本地机器上。

进一步学习建议

  • 学习 GitHub Actions 的基本概念和工作流配置。
  • 了解如何在 GitHub Actions 中使用其他工具和库。
  • 尝试修改工作流以添加更多步骤,例如测试或部署。

如果你有任何问题或需要进一步的解释,请随时问我!


M:

运行环境既然在 Github 服务器上,我在哪里去看输出的结果文件?

GPT-4o-mini:

在 GitHub Actions 的运行环境中,输出的结果文件不会直接保存在你的 GitHub 仓库中,因为它们是在 GitHub 的虚拟机上生成的。要查看输出结果,你可以采取以下几种方法:

1. 使用 GitHub Actions 的日志

访问 GitHub 仓库:

  • 打开你的 GitHub 仓库页面。

查看 Actions 选项卡:

  • 点击页面顶部的 “Actions” 选项卡。这将显示所有的工作流运行记录。

选择最近的工作流运行:

  • 找到最近的工作流运行(通常是你刚刚推送代码后触发的),点击它。

查看日志:

  • 在工作流运行页面中,你可以看到每个步骤的执行状态。点击 “Run Spark job” 步骤,可以查看该步骤的详细日志输出。
  • 如果 Spark 脚本中有打印输出(例如使用 print 函数),你可以在这里看到这些输出。

2. 将结果文件上传到 GitHub

如果你希望将生成的结果文件(如 output_data.csv)保存到 GitHub 仓库中,可以在 GitHub Actions 工作流中添加一个步骤,将文件上传到仓库。以下是如何修改工作流以实现这一点:

修改工作流文件

.github/workflows/ci.yml 文件中,添加一个步骤来将结果文件上传到 GitHub:

name: CI/CD Pipeline

on:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.x'

      - name: Install dependencies
        run: |
          pip install apache-airflow
          pip install pyspark

      - name: Run Spark job
        run: |
          spark-submit scripts/process_data.py

      - name: Upload output file
        uses: actions/upload-artifact@v3  # 更新为 v3
        with:
          name: output-data
          path: output_data.csv

3. 下载输出文件

运行完成后:

  • 在 GitHub Actions 的工作流运行页面中,找到 “Artifacts” 部分。

下载文件:

  • 点击 “output-data” 链接,下载生成的 output_data.csv 文件。

进一步学习建议

  • 学习如何使用 GitHub Actions 的 upload-artifactdownload-artifact 功能。
  • 了解如何在工作流中处理文件和数据。
  • 尝试将其他类型的输出文件(如日志文件)也上传到 GitHub。

如果你有任何问题或需要进一步的解释,请随时问我!


M:

在企业级生产环境中常用的 CI/CD 工具有哪些?给我详细介绍一下它们各自的使用场景和用法。

GPT-4o-mini:

在企业级生产环境中,CI/CD(持续集成/持续交付)工具是确保软件开发流程高效、可靠和自动化的重要组成部分。以下是一些常用的 CI/CD 工具及其使用场景和用法的详细介绍:

1. Jenkins

使用场景

  • Jenkins 是一个开源的自动化服务器,广泛用于构建、测试和部署软件。
  • 适合需要高度自定义的 CI/CD 流程的项目。

用法

  • 安装: 可以在本地服务器或云环境中安装 Jenkins。
  • 创建任务: 使用 Jenkins 的 Web 界面创建构建任务,配置源代码管理(如 Git)和构建触发器。
  • 插件: Jenkins 拥有丰富的插件生态系统,可以集成各种工具(如 Docker、Kubernetes、Slack 等)。
  • 流水线: 使用 Jenkins Pipeline DSL 定义复杂的 CI/CD 流程。

2. GitLab CI/CD

使用场景

  • GitLab CI/CD 是 GitLab 提供的内置 CI/CD 功能,适合使用 GitLab 作为代码托管平台的团队。
  • 适合需要与 GitLab 紧密集成的项目。

用法

  • 配置文件: 在项目根目录下创建 .gitlab-ci.yml 文件,定义 CI/CD 流程。
  • 阶段和作业: 可以定义多个阶段(如 build、test、deploy)和作业,GitLab 会根据配置自动执行。
  • 环境: 支持多种环境的部署,可以在不同的环境中运行作业。

3. CircleCI

使用场景

  • CircleCI 是一个云端 CI/CD 工具,适合需要快速构建和部署的项目。
  • 适合使用 Docker 的项目,支持容器化的构建和测试。

用法

  • 配置文件: 在项目根目录下创建 .circleci/config.yml 文件,定义工作流和作业。
  • 并行执行: 支持并行执行作业,提高构建速度。
  • 集成: 可以与 GitHub、Bitbucket 等代码托管平台集成。

4. Travis CI

使用场景

  • Travis CI 是一个基于云的 CI/CD 工具,适合开源项目和小型团队。
  • 适合与 GitHub 集成的项目。

用法

  • 配置文件: 在项目根目录下创建 .travis.yml 文件,定义构建和测试流程。
  • 自动构建: 每次推送代码到 GitHub 时,Travis CI 会自动触发构建。
  • 多语言支持: 支持多种编程语言和环境的构建。

5. GitHub Actions

使用场景

  • GitHub Actions 是 GitHub 提供的 CI/CD 功能,适合使用 GitHub 作为代码托管平台的项目。
  • 适合需要灵活工作流和自动化任务的项目。

用法

  • 工作流文件: 在项目中创建 .github/workflows 文件夹,定义工作流文件(如 ci.yml)。
  • 触发器: 可以根据事件(如 push、pull request)触发工作流。
  • 步骤: 定义多个步骤,支持多种操作(如构建、测试、部署)。

6. Azure DevOps

使用场景

  • Azure DevOps 是微软提供的完整 DevOps 工具链,适合大型企业和复杂项目。
  • 适合需要与 Azure 云服务集成的项目。

用法

  • 管道: 使用 Azure Pipelines 定义 CI/CD 流程,可以通过 YAML 文件或图形界面配置。
  • 集成: 与 Azure 资源(如 Azure Kubernetes Service、Azure Functions)紧密集成。
  • 多平台支持: 支持多种编程语言和平台的构建和部署。

7. Bamboo

使用场景

  • Bamboo 是 Atlassian 提供的 CI/CD 工具,适合使用 Atlassian 生态系统(如 Jira、Bitbucket)的团队。
  • 适合需要与其他 Atlassian 工具集成的项目。

用法

  • 构建计划: 在 Bamboo 中创建构建计划,配置源代码管理和构建任务。
  • 部署项目: 可以定义多个部署项目,支持多种环境的部署。
  • 集成: 与 Jira 和 Bitbucket 紧密集成,提供可视化的构建和部署状态。

总结

选择合适的 CI/CD 工具取决于团队的需求、项目的复杂性以及现有的技术栈。每种工具都有其独特的优势和适用场景,了解这些工具的特点可以帮助你做出更好的选择。

如果你有任何问题或需要进一步的解释,请随时问我!


M:

关于 Jenkins,你能带我 Hello World 一下吗?

GPT-4o-mini:

当然可以!下面是一个简单的 Jenkins “Hello World” 示例,帮助你了解如何设置 Jenkins 并创建一个基本的构建任务。

安装 Jenkins

在本地安装 Jenkins

  1. 安装 Java:
    • Jenkins 需要 Java 运行环境。你可以使用以下命令安装 OpenJDK:
      sudo apt update
      sudo apt install openjdk-11-jdk -y
      
  2. 添加 Jenkins 仓库:
    • 导入 Jenkins 的 GPG 密钥:
      wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
      
    • 添加 Jenkins 仓库:
      sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
      
  3. 安装 Jenkins:
    • 更新软件包列表并安装 Jenkins:
      sudo apt update
      sudo apt install jenkins -y
      
  4. 启动 Jenkins:
    • 启动 Jenkins 服务:
      sudo systemctl start jenkins
      
    • 设置 Jenkins 在系统启动时自动启动:
      sudo systemctl enable jenkins
      
  5. 访问 Jenkins:
    • 打开浏览器,访问 http://localhost:8080

解锁 Jenkins

  1. 获取解锁密钥:
    • 在浏览器中打开 Jenkins 页面时,会提示你输入解锁密钥。
    • 你可以在终端中运行以下命令获取密钥:
      sudo cat /var/lib/jenkins/secrets/initialAdminPassword
      
  2. 输入密钥:
    • 将密钥复制并粘贴到 Jenkins 页面中,点击 “Continue”。

安装推荐插件

  • 在插件安装页面,选择 “Install suggested plugins” 以安装推荐的插件。

创建第一个 Jenkins 任务

  1. 创建新任务:
    • 在 Jenkins 主页面,点击 “New Item”。
    • 输入任务名称(例如 HelloWorld),选择 “Freestyle project”,然后点击 “OK”。
  2. 配置任务:
    • 在任务配置页面,找到 “Build” 部分,点击 “Add build step”。
    • 选择 “Execute shell”。
  3. 输入构建命令:
    • 在 “Command” 文本框中输入以下内容:
      echo "Hello, World!"
      
  4. 保存任务:
    • 滚动到页面底部,点击 “Save”。

运行任务

  1. 构建任务:
    • 在任务页面,点击 “Build Now” 按钮。
  2. 查看构建结果:
    • 在 “Build History” 部分,点击最新的构建(通常是编号为 #1 的构建)。
    • 点击 “Console Output” 链接,查看构建日志。
  3. 查看输出:
    • 在控制台输出中,你应该能看到以下内容:
      Hello, World!
      

总结

你已经成功设置了 Jenkins,并创建了一个简单的 “Hello World” 构建任务。这个过程展示了如何安装 Jenkins、创建任务以及执行简单的 Shell 命令。

进一步学习建议

  • 学习 Jenkins 的其他构建步骤,如使用 Git 拉取代码、运行测试等。
  • 探索 Jenkins 插件,了解如何扩展 Jenkins 的功能。
  • 尝试使用 Jenkins Pipeline 定义更复杂的构建和部署流程。

如果你有任何问题或需要进一步的解释,请随时问我!