如何使用 GitHub Actions 创建 CI 测试

持续集成测试#

如果你的项目依赖于 SUMO,那么保持与较新 SUMO 版本的兼容性可能会成为一个问题。 虽然我们努力保持向后兼容性,但仍可能会为你的项目引入破坏性更改。 由于我们不可能测试所有依赖于 SUMO 的项目的集成,因此本文档将协助你为你的项目设置 CI 测试。

使用 GitHub Actions#

执行 CI 测试的一种流行方法是创建 GitHub Actions 工作流。 GitHub Actions 工作流由 GitHub master/main 分支中 .github/workflows 目录下的 YAML 文件定义。 下面,我们将通过一个示例工作流(来自 Veins 项目)进行讲解,并对代码进行注释(有关完整的 GitHub Actions 指南,请参阅官方文档):

name: linux-build  # 工作流名称,显示在项目 GitHub 的 'Actions' 标签页下

on:  # 定义触发此工作流运行的事件
  push:
  pull_request:
  schedule:
    - cron:  '42 0 * * *'

jobs:  # 定义要运行的独立作业
  build:  # 此作业的 ID
    runs-on: ubuntu-latest  # 运行此作业的 VM 类型
    env:  # 为此作业定义环境变量
      OMNET_VERSION: 5.6.2
    strategy:  # 定义作业变体
      fail-fast: false  # 如果任何作业变体失败,不要取消所有正在进行的作业
      matrix:  # 定义变体参数及其值
        sumo_build: [ubuntu, ppa, nightly]

    steps:  # 定义此作业的独立步骤
    - name: Cloning Veins  # 此步骤的名称
      uses: actions/checkout@v2  # 此步骤使用的预定义且可重用的操作(参见 https://github.com/actions/checkout)
      with:  # 为预定义操作的参数设置值
        path: src/veins

    - name: Cloning OMNeT++
      uses: actions/checkout@v2
      with:
        repository: omnetpp/omnetpp
        ref: omnetpp-${{ env.OMNET_VERSION }}  # 计算上面定义的环境变量 OMNET_VERSION
        path: src/omnetpp

    - name: Preparing Build System
      run: |  # 为此步骤定义一个自定义的多行命令(而不是可重用的操作)
        if [[ "${{ matrix.sumo_build }}" == "ppa" ]]; then sudo add-apt-repository ppa:sumo/stable; fi
        sudo apt-get update
        sudo apt-get install build-essential gcc g++ bison flex perl python3 libxml2-dev zlib1g-dev default-jre doxygen graphviz

    - name: Installing SUMO from repo
      if: matrix.sumo_build != 'nightly'  # 仅当条件为真时才运行此步骤
      run: |
        sudo apt-get install sumo sumo-tools
        echo "SUMO_HOME=/usr/share/sumo" >> $GITHUB_ENV

    - name: Installing SUMO from PyPI
      if: matrix.sumo_build == 'nightly'
      run: |
        python -m pip install --index-url https://test.pypi.org/simple/ eclipse-sumo
        python -c "import sumo; print('SUMO_HOME=' + sumo.SUMO_HOME)" >> $GITHUB_ENV

    - name: Adapting PATH
      run: |
        echo "PATH=$PWD/src/omnetpp/bin:$SUMO_HOME/bin:$PATH" >> $GITHUB_ENV
        cat $GITHUB_ENV

    - name: Building OMNeT
      run: |
        cd src/omnetpp
        cp configure.user.dist configure.user
        ./configure WITH_TKENV=no WITH_QTENV=no WITH_OSG=no WITH_OSGEARTH=no
        make -j4

    - name: Building Veins
      run: |
        cd src/veins
        ./configure
        make -j4

    - name: Running Veins Test
      run: |
        cd src/veins/examples/veins
        echo $SUMO_HOME; sumo
        ../../bin/veins_launchd -vv --daemon -L veins_launchd.log
        ./run -u Cmdenv

    - name: Upload Test log
      if: ${{ always() }}
      uses: actions/upload-artifact@v2  # 参见 https://github.com/actions/upload-artifact
      with:
          name: veins-${{ matrix.sumo_build }}.log
          path: |
            src/veins/examples/veins/veins_launchd.log

总而言之,工作流的基本结构由顶级代码块 nameonjobs 组成,分别定义了工作流的名称、触发器和作业。 然后,你的项目的 CI 测试作业通常应遵循以下步骤:

1. 克隆所需的 git 仓库
2. 设置构建环境
3. 构建/安装
4. 运行测试脚本

虽然上面的示例中包含了一些对大多数(如果不是全部)项目的 CI 测试工作流都有用的通用步骤,但请注意它包含了一些特定于 Veins 的步骤,这些步骤需要根据你的项目需求进行调整。