温馨提示×

Fortran在Debian上如何进行版本控制

小樊
45
2026-01-05 10:31:10
栏目: 智能运维

Debian上Fortran的版本控制实践

一 语义化版本与Git分支策略

  • 采用语义化版本号(如:v1.2.3),在 Git 标签中打版本,便于回溯与发布。
  • 分支策略建议:
    • main:稳定发布线,仅通过合并请求(Merge Request)更新。
    • develop:日常开发线,集成特性分支。
    • feature/xbugfix/y:短生命周期分支,完成后合并回 develop。
  • 打标签与生成变更日志的常用流程:
    • 打标签:git tag -a v1.2.3 -m "Release 1.2.3"
    • 推送标签:git push origin v1.2.3
    • 生成简要变更:git log --oneline v1.2.2..v1.2.3

二 编译器与依赖的版本固定

  • 使用 APT 安装与更新 gfortran,并固定版本以避免构建漂移:
    • 更新索引:sudo apt update
    • 安装/升级:sudo apt install gfortransudo apt install --only-upgrade gfortran
    • 安装特定版本:sudo apt install gfortran-<版本号>(如:gfortran-12
    • 验证版本:gfortran --version
  • 固定编译器版本(示例思路,写入构建脚本或 CI 环境):
    • 在 Debian 12 上可用 update-alternatives 管理默认 gfortran
      sudo update-alternatives --install /usr/bin/gfortran gfortran /usr/bin/gfortran-12 100
      sudo update-alternatives --config gfortran   # 交互选择
      
    • 在 CI 中显式设置环境变量:FC=gfortran-12
  • 依赖库建议固定版本或在 CI 中显式安装,例如:
    • 数值库:libblas-devliblapack-dev
    • MPI:libopenmpi-dev(并行构建时使用 mpif90
    • 其他:libfftw3-devhdf5-dev
  • 在仓库根目录提供可复现脚本(如 Makefilefpm.toml),并在 CI 中使用相同的脚本,确保本地与 CI 一致。

三 构建与测试的矩阵化验证

  • 使用 Make + gfortran 的最小示例:
    # Makefile
    FC      = gfortran
    FFLAGS  = -O2 -Wall -Wextra
    OBJS    = utils.o main.o
    
    app: $(OBJS)
    	$(FC) $(FFLAGS) -o $@ $^
    
    %.o: %.f90
    	$(FC) $(FFLAGS) -c $< -o $@
    
    clean:
    	rm -f *.o app
    
    .PHONY: clean
    
    构建与运行:
    make
    ./app
    
  • 使用 fpm(Fortran Package Manager)的最小示例:
    # fpm.toml
    name = "mylib"
    version = "0.1.0"
    license = "MIT"
    author = "Your Name"
    [build]
    auto-executables = false
    [library]
    source-dir = "src"
    [test]
    source-dir = "test"
    
    构建与运行:
    fpm build
    fpm test
    fpm run
    
  • 单元测试可选 FRUITpFUnit,在 CI 中以脚本退出码作为质量门禁(测试失败即阻断合并)。

四 持续集成中的版本控制与矩阵构建

  • 自建 Jenkins 流水线示例(矩阵覆盖多版本 gfortran 与 MPI 开关):
    pipeline {
      agent any
      tools { tool 'Default' }
      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 示例(使用官方 fortran 镜像或 Debian 镜像):
    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
    
  • 要点:在 CI 中显式指定 FCFFLAGS,对 MPI 场景使用 mpif90;测试脚本以退出码判定成功/失败,形成可重复的质量门禁。

0