跳转至

开发LHCb软件

学习目标

  • 学习如何使用和修改 LHCb 软件项目及包
  • 学习如何查找和搜索源代码及其文档

先决条件

开始之前,你应该对 git的基本使用有一定了解,类似于入门套件(Starterkit)中教授的内容。

在本节课中,我们将向你展示使用git版本控制系统开发 LHCb软件的完整工作流程。在 LHCb,我们使用 GitLab 来管理 git仓库。除其他功能外,GitLab允许你浏览每个项目的源代码,并通过便捷的网页界面审查新的更改(称为合并请求)。你可以在https://gitlab.cern.ch找到CERN 的 GitLab 实例。

原则上,与 LHCb 软件仓库交互有多种方式:

  1. 仅使用标准 git 命令的常规 git 工作流程。这要求你每次克隆并编译整个 LHCb项目。

  2. 使用一组lb-*子命令的 LHCb特定工作流程。这允许你在项目中检出单个包,并简化了同时修改少数包的流程(这与之前使用的getpack命令更接近)。

在这里,我们将重点介绍第二种工作流程。第一种工作流程将在本页底部简要讨论。请注意,尽管lb-git命令对于对现有包的小改动(此时重新编译整个项目会很繁琐)来说更为简便,但对于任何重要的开发,使用常规git 会更加稳定。如果你的时间允许编译,请考虑使用它。

初始设置

在 GitLab 中创建项目之前,你需要确保本地 git 配置和 GitLab上的设置已充分配置。

  • 你的姓名和电子邮件地址应在本地 git 配置中设置。为确保这一点,请运行:

    git config --global user.name "Your Name"
    git config --global user.email "Your Name <your.name@cern.ch>"
    
    并填入你的信息。

  • 接下来,连接到 https://gitlab.cern.ch 并使用你的 CERN凭据登录。访问https://gitlab.cern.ch/-/user_settings/ssh_keys 并添加SSH 密钥。

  • 最后,运行这个 LHCb 特定的配置命令:

    git config --global lb-use.protocol ssh
    
    这确保 LHCb 命令使用 ssh 协议而不是 https。

本节课将介绍以下命令:

  • lb-dev:用于设置新的开发环境
  • git lb-usegit lb-checkout:用于下载 LHCb 软件包

如果要修改软件包,你需要设置开发环境。lb-dev可以帮你:

lb-dev --name DaVinciDev DaVinci/v65r0

输出应类似于:

Successfully created the local project DaVinciDev in .

To start working:

  > cd ./DaVinciDev
  > git lb-use DaVinci
  > git lb-checkout DaVinci/vXrY MyPackage

then

  > make
  > make test

and optionally (CMake only)

  > make install

You can customize the configuration by editing the files 'build.conf' and
'CMakeLists.txt' (see https://cern.ch/gaudi/CMake for details).

lb-dev创建的本地项目是 Git 仓库

当lb-dev创建本地项目目录并在其中创建初始文件时,它还会调用git init并将文件的第一个版本提交到本地 Git 仓库(可以在其中尝试git log查看)。

然后,你可以使用 git 跟踪你的开发,并与他人共享代码(例如,通过gitlab.cern.ch 中的新项目)。

按照这些说明编译软件:

```bash cd DaVinciDev git lb-use DaVinci make

完成后,你可以在目录中执行

```bash
./run bash -l

这将(类似于lb-run)为你提供一个新的 bash会话,其中设置了正确的环境变量,你可以从该会话中运行特定于项目的命令,如gaudirun.py

如果没有可修改和构建的软件,你的新开发环境就不会很有用。因此,让我们检出一个现有的LHCb 包!这些包存储在LHCb Git 仓库中。

为了获取你要处理的包的源代码,我们将使用Git4LHCb脚本。这些是一组以git lb-开头的别名,旨在简化 LHCb 软件的开发。例如,如果你想编写新的 HLT2行,请在DaVinciDev目录中执行以下命令:

git lb-use Moore
git lb-checkout Moore/master Hlt/Hlt2Conf
make configure

在后台,git lb-use会将Moore仓库添加为 git中的远程仓库,可以用git remote -v查看!git lb-checkout随后会对 Moore仓库的master分支执行 部分 检出,只添加Hlt/Hlt2Conf下的文件。

git lb-use中应使用哪个项目?

传递给git lb-use的项目名称取决于你要检出和处理的目录,而不是你传递给lb-dev的项目名称。此外,你可以在同一个本地项目中为不同的远程项目多次调用git lb-use

lb-dev --name DaVinciDev DaVinci/v65r0
cd DaVinciDev
git lb-use Rec
git lb-use Moore
git lb-use DaVinci

请注意,为了使其工作,你在lb-use中指定的项目可能不依赖于你在lb-dev中指定的项目。换句话说,顶级项目应该位于依赖链的顶端。

现在,你可以修改Hlt2Conf包,并运行make purge && make来使用你的更改构建它。你可以使用./run脚本测试你的更改。它的工作方式类似于lb-run,无需指定包和版本:

./run gaudirun.py options.py

如果 git 要求输入密码怎么办?

确保你已成功完成初始设置下的说明。

如果你做出了想要集成到官方 LHCb 仓库中的更改,可以使用git lb-push将其推送到中央 git仓库中的新分支。但请先阅读说明页面

根据项目的不同,你可能需要在发布说明(位于doc/release.notes)中记录你的更改。

请注意,没有人有权限直接推送到任何项目的master分支。为了将你的更改从你lb-push到的分支合并到master分支,你需要创建一个合并请求,以便项目维护者可以检查你的代码。例如,这可以在项目仓库的网页上完成。

创建合并请求的快速链接

当推送到 GitLab 中项目的分支时,你会看到类似以下的消息:

remote:
remote: Create merge request for my-branch:
remote:   https://gitlab.cern.ch/lhcb/Moore/merge_requests/new?merge_request%5Bsource_branch%5D=my-branch
remote:

你可以使用消息中的 URL 快速为你刚刚推送的更改创建合并请求。

当你的合并请求获得批准(可能在你进行一些额外提交之后),你的更改将成为相应项目master分支的一部分,你的贡献正式成为LHCb 软件栈的一部分。祝贺!

夜间构建

建议在夜间构建上测试新的开发。每个项目在夜间构建(因此得名),所有待处理的合并请求都会被应用。你可以使用项目的夜间构建版本:

lb-dev --nightly lhcb-head DaVinci/HEAD
该命令的更详细描述可在此处找到:

有时会出现错误,提交的代码可能无法编译或无法按预期工作。因此,会执行夜间测试。它们首先尝试构建完整的软件栈。

如果构建成功,它们会运行一些参考作业,并将新构建的输出与参考文件进行比较。夜间构建的结果可在此处找到:

如果提交的目的是更改输出(例如,因为你将轨迹重建效率提高了两倍),请在合并请求描述中提及,以便受影响项目的管理员可以更新参考文件。

如果你想查看源代码而不检出它,可以通过 GitLab网页界面轻松访问仓库。该网站还提供搜索功能,但输出并不总是易于阅读,特别是如果它返回很多结果的话。要更快地搜索项目,你可以使用lb-glimpse。它允许你在特定LHCb 项目的源代码中搜索给定的字符串。

lb-glimpse "PVRefitter" DaVinci/v65r0
这适用于每个 LHCb 项目和已发布的版本。由于它是一个 shell命令,你可以使用lessgrep和其他工具轻松处理输出。

要了解 LHCb 软件的某个组件如何工作,你还可以访问 doxygen 文档。一组doxygen网页是为几个相关项目生成的,并链接在所有项目的网站中,如DaVinci的网站。另请参见LHCb Computing网页以获取项目列表。

使用完整的项目检出

lb-git命令并非绝对必要,但如果你只想快速编辑一个包,它们非常方便。否则,你将不得不构建包所在的整个项目,而不是使用预编译版本。但是,如果你跨多个包进行开发,或者想使用更复杂的git 命令,没有什么能阻止你检出整个项目 ,只是不要惊讶于编译可能需要几个小时!

要检出一个项目,请运行以下命令:

git clone https://:@gitlab.cern.ch:8443/lhcb/DaVinci.git

DaVinci替换为你选择的项目名称。接下来,初始化并编译它:

lb-project-init
make
可选地,随后运行make test来运行测试和/或 make install将其安装到InstallArea目录。就这样!你现在有了一个包含项目所有源文件的常规git 仓库。