Vivado Synthesis挂在詹金斯产生的Docker容器中

时间:2019-04-17 17:27:04

标签: docker jenkins xilinx vivado

我正在尝试将大型FPGA构建移至Jenkins CI环境中,但是当在Jenkins产生的Docker容器中运行时,构建会在综合结束时挂起。

我试图复制Jenkins正在创建的环境,但是当我自己生成Docker容器时,构建没有问题。

我尝试过:

    减少思考,减少Vivado使用的作业(又名线程)数量 编写时可能发生了一些线程冲突 退出日志文件
  • 同样,在vivado上使用了-nolog -nojournal选项 命令删除任何日志文件冲突
  • 控制克隆/签出的项目并运行命令 作为Docker容器中的本地用户

我还有一个非常小的构建,可以毫无问题地贯穿Jenkins的整个构建过程,因此,我认为我的Docker容器没有根本的缺陷。

agent {
  docker {
    image "vivado:2017.4"
    args """
      -v <MOUNT XILINX LICENSE FILE>
      --dns <DNS_ADDRESS>
      --mac-address <MAC_ADDRESS>
    """
  }
}
steps {

  sh "chmod -R 777 ."

  dir(path: "${params.root_dir}") {
    timeout(time: 15, unit: 'MINUTES')  {
      // Create HLS IP for use in Vivado project
      sh './run_hls.sh'
    }
    timeout(time: 20, unit: 'MINUTES')  {
      // Create vivado project, add sources, constraints, HLS IP, generated IP
      sh 'source source_vivado.sh && vivado -mode batch -source tcl/setup_proj.tcl'
    }
    timeout(time: 20,   unit: 'MINUTES')    {
      // Create block designs from TCL scripts
      sh 'source source_vivado.sh && vivado -mode batch -source tcl/run_bd.tcl'
    }
    timeout(time: 1,  unit: 'HOURS')      {
      // Synthesize complete project
      sh 'source source_vivado.sh && vivado -mode batch -source tcl/run_synth.tcl'
    }
  }
}

下面的代码块正在运行1个作业,超时时间为12小时。您可以看到综合完成,然后8小时后发生了超时。

[2019-04-17T00:30:06.131Z] Finished Writing Synthesis Report : Time (s): cpu = 00:01:53 ; elapsed = 00:03:03 . Memory (MB): peak = 3288.852 ; gain = 1750.379 ; free physical = 332 ; free virtual = 28594
[2019-04-17T00:30:06.131Z] ---------------------------------------------------------------------------------
[2019-04-17T00:30:06.131Z] Synthesis finished with 0 errors, 0 critical warnings and 671 warnings.
[2019-04-17T08:38:37.742Z] Sending interrupt signal to process
[2019-04-17T08:38:43.013Z] Terminated
[2019-04-17T08:38:43.013Z] 
[2019-04-17T08:38:43.013Z] Session terminated, killing shell... ...killed.
[2019-04-17T08:38:43.013Z] script returned exit code 143

在本地生成的Docker容器中运行相同的命令没有任何问题。不幸的是,timeout Jenkins步骤似乎没有刷新打开的缓冲区,因为我的打印所有日志文件的post:unsuccesful步骤找不到synth_1,尽管我不希望在那里不同于詹金斯的捕获。

Jenkins / Vivado集成是否存在任何已知问题?有没有一种方法可以进入Jenkins衍生的容器,以便我可以尝试复制期望值和体验值?

编辑:此后,我在实际的tcl脚本中添加了一个超时,以移过wait_on_runs中使用的run_synth.tcl命令,但是现在我在实现过程中遇到了相同的挂起行为。

1 个答案:

答案 0 :(得分:5)

问题在于vivado处理(或不处理...)其分叉过程的方式。具体来说,我认为这适用于并行综合。这也许就是为什么只在某些项目中看到它的原因。在上述状态下(“合成完成”后卡住),我注意到了一些废弃的vivado僵尸进程。据我了解,这些是结束的子进程,但是父进程在结束自身之前没有收集状态。使用strace进行跟踪甚至表明vivado试图杀死这些进程:

restart_syscall(<... resuming interrupted nanosleep ...>) = 0
kill(319, SIG_0)                     = 0
kill(370, SIG_0)                     = 0
kill(422, SIG_0)                     = 0
kill(474, SIG_0)                     = 0
nanosleep({tv_sec=5, tv_nsec=0}, 0x7f86edcf4dd0) = 0
kill(319, SIG_0)                     = 0
kill(370, SIG_0)                     = 0
kill(422, SIG_0)                     = 0
kill(474, SIG_0)                     = 0
nanosleep({tv_sec=5, tv_nsec=0}, <detached ...>

但是(众所周知)您无法杀死僵尸,它们已经死了...

通常,这些过程将由init进程采用并在那里处理。但是对于Docker中的Jenkins Pipeline,默认情况下没有init。管道产生了该容器并运行cat且没有任何输入来使其保持活动状态。这样cat变成pid 1,并接收vivado的遗弃子代。猫当然不知道该怎么办,而忽略了它们(真是悲剧)。

cat,1
  |-(sh,16)
  |-sh,30 -c ...
  |   |-sh,31 -c ...
  |   |   `-sleep,5913 3
  |   `-sh,32 -xe /home/user/.jenkins/workspace...
  |       `-sh,35 -xe /home/user/.jenkins/workspace...
  |           `-vivado,36 /opt/Xilinx/Vivado/2019.2/bin/vivado -mode tcl ...
  |               `-loader,60 /opt/Xilinx/Vivado/2019.2/bin/loader -exec vivado -mode tcl ...
  |                   `-vivado,82 -mode tcl ...
  |                       |-{vivado},84
  |                       |-{vivado},85
  |                       |-{vivado},111
  |                       |-{vivado},118
  |                       `-{vivado},564
  |-(vivado,319)
  |-(vivado,370)
  |-(vivado,422)
  `-(vivado,474)

幸运的是,有一种方法可以在docker容器中进行初始化。将--init参数和docker run一起使用可以为我解决问题。

agent {
    docker {
        image 'vivado:2019.2'
        args '--init'
    }
}

这将创建vivado似乎依赖的初始化过程,并且构建运行不会出现问题。

希望这对您有帮助!

干杯!