温馨提示×

Debian中Fortran项目如何持续集成

小樊
40
2025-12-05 00:56:54
栏目: 智能运维

Debian 上 Fortran 项目的持续集成实践

一、环境与工具选型

  • 编译器与基础工具:安装 gfortran、构建工具(makefpm)、版本控制 git。示例:sudo apt update && sudo apt install -y gfortran make git。
  • 常用依赖库:数值计算用 libblas-devliblapack-dev;并行计算用 libopenmpi-dev(Fortran 2008 接口常用 -lmpi_f08);FFT 用 libfftw3-dev;HDF5 用 hdf5-dev
  • 单元测试框架:选择 FRUITpFUnit,便于在 CI 中自动化运行测试并判定结果。
  • CI 引擎:自建可用 Jenkins(Debian 上 apt 安装、配合 Webhook 触发);也可用 GitLab CI/CDTravis CI 等托管服务,编写 Jenkinsfile.gitlab-ci.yml 即可。

二、本地可复现的构建与测试

  • 使用 gfortran 与 Make 的最小示例
    • 编译:gfortran -O2 -c utils.f90 main.f90 -o app
    • 运行:./app
  • 使用 fpm 的最小示例
    • 构建:fpm build
    • 运行:fpm run
  • 使用 FRUIT 的单元测试示例
    • 安装:sudo apt install -y fruit
    • 编译:gfortran -c my_module.f90 test_my_module.f90 -lfruit -o test_app
    • 运行:./test_app(观察断言结果)
  • 使用 pFUnit 的单元测试示例
    • 安装:从源码构建并安装 pFUnit(遵循其官方构建流程)
    • 编译与运行:使用 pFUnit 提供的构建/运行方式执行测试并输出结果
  • 建议做法:在仓库根目录提供 Makefilefpm.toml,并配套 run_tests.sh,保证“本地一键构建+测试”与 CI 脚本保持一致。

三、Jenkins 自建 CI 流水线

  • 安装与插件
    • 安装:sudo apt update && sudo apt install -y jenkins
    • 启动:sudo systemctl enable --now jenkins
    • 必要插件:PipelineGitGeneric Webhook Trigger(用于代码推送触发)
  • 代码源与触发器
    • 在 Jenkins 任务中配置 Git 仓库 URL 与凭证
    • 在“构建触发器”选择 Generic Webhook Trigger,可设置 Token;在代码托管侧(如 GitLab/Codeup)添加 Webhook:http://JENKINS_URL/generic-webhook-trigger/invoke?token=YOUR_TOKEN
  • 示例 Jenkinsfile(多矩阵构建 + 测试)
    • 说明:并行在不同 gfortran 版本与 OpenMPI 开关下构建与测试;测试阶段执行测试程序并根据退出码判定成功/失败
    • 关键要点:使用 matrix 做编译器与特性的组合覆盖;测试阶段以脚本退出码作为质量门禁
    • 参考片段:
      pipeline {
        agent any
        tools { tool 'Default' } // 确保已配置好 gfortran 工具
        stages {
          stage('Build and Test') {
            matrix {
              axes {
                axis { name 'GFORTRAN'; values '10', '11', '12' }
                axis { name 'MPI';     values 'no', 'yes' }
              }
              stages {
                stage('Install deps') {
                  steps { sh 'sudo apt-get update && sudo apt-get install -y gfortran-$GFORTRAN libblas-dev liblapack-dev' }
                  when { expression { env.MPI == 'yes' } }
                  steps { sh 'sudo apt-get install -y libopenmpi-dev' }
                }
                stage('Build') {
                  steps {
                    sh '''
                      if [ "$MPI" = "yes" ]; then
                        FC=mpif90 FFLAGS="-O2 -fopenmp" make -f Makefile.mpi
                      else
                        FC=gfortran FFLAGS="-O2" make
                      fi
                    '''
                  }
                }
                stage('Test') {
                  steps {
                    sh './run_tests.sh'
                  }
                }
              }
            }
          }
        }
        post {
          always { echo 'CI finished.' }
          failure { echo 'Build or tests failed.' }
        }
      }
      

四、GitLab CI 示例

  • 在仓库根目录创建 .gitlab-ci.yml,利用官方 fortran 镜像或 Debian 镜像安装 gfortran 与依赖,执行构建与测试
  • 示例:
    image: fortran:latest   # 或 debian:stable-slim
    
    before_script:
      - apt-get update -qq && apt-get install -y -qq gfortran libblas-dev liblapack-dev make
    
    build:
      script:
        - make
      artifacts:
        paths:
          - app
        expire_in: 1 week
    
    test:
      script:
        - ./run_tests.sh
    
  • 说明:将 run_tests.sh 设计为以退出码表示测试结果;如需 MPI,在 before_script 中增加 libopenmpi-dev 并在构建阶段使用 mpif90

五、质量门禁与交付建议

  • 编译器矩阵:至少覆盖 gfortran 10/11/12,确保对现代语言特性与优化选项的兼容
  • 依赖覆盖:同时跑 串行OpenMPI 场景(链接 -lmpi_f08),验证并行接口与构建链路
  • 测试规范:使用 FRUIT/pFUnit 编写可自动判定的单元测试;测试程序以 0 退出码表示通过,非 0 即失败
  • 产物归档:保存可执行文件、测试日志与覆盖率报告(若有),便于回溯与发布
  • 触发策略:代码 push/merge request 即触发;必要时对 master/main 分支增加额外门禁(如更严格的静态检查或性能基准)
  • 渐进增强:在 CI 中加入 Valgrind(检查内存错误)、gprof/perf(性能回归基线)等步骤,提升稳定性与性能可观测性

0