openSUSE:Build Service 私有实例引导
摘要
私有 OBS 实例可能需要以完全独立的方式为某些项目运行 - 即使对于协作部署,在连接失败时,它也可能是一个有用的设施。
OBS 中的正常开发项目/包需要另一个项目作为目标;该项目应包含构建根所需的所有二进制包。
本指南介绍了在本地 OBS 上设置项目作为构建目标的不同方法。
您可能还需要从源代码重新构建此项目;此引导问题也涵盖在内。
方法
仓库二进制导入
此方法从现有的仓库导入预构建的二进制包到项目中。它仍然需要获取 prjconf,但也可以在您只能访问下载仓库时使用。
这是在您不需要或不想在本地重新构建包的情况下,针对稳定基础构建包的最简单方法。
仓库二进制按需下载 (DOD)
此方法根据需要将二进制文件导入到项目的 :full 目录中。
OBS 包复制
此方法启动一个引导活动,并执行以在本地构建二进制文件。
如果您从 OpenSUSE (https://build.opensuse.org/) 或 MeeGo 社区 OBS (https://build.pub.meego.com/) 等 OBS 复制您的参考发行版,则获取登录名很容易,您应该优先选择此方法。
OBS 远程链接
如果有一个 OBS 提供到您需要的项目的远程链接,那么这种方法提供了一个简单的解决方案。
当您没有远程 OBS 的登录名时(例如 https://build.meego.com/),此方法很有用。
远程链接可以在项目配置 (osc meta prj PRJNAME) 或构建目标定义中使用。
您需要是管理员才能创建远程链接项目。
远程链接的语法是
<remoteurl>https://<Mylogin>:<Mypasswd>@api.opensuse.org/</remoteurl>
注意 公共 API 不需要登录名:密码
<remoteurl>https://api.opensuse.org/public</remoteurl>
远程链接项目“原始配置/元数据”示例
<project name="openSUSE.org">
<title>build.openSUSE.org</title>
<description>This project allows access to all resources on build.opensuse.org OBS instance. This is needed to build against other distributions.</description>
<remoteurl>https://api.opensuse.org/public</remoteurl>
<person userid="aUser" role="maintainer"/>
<person userid="aUser" role="bugowner"/>
</project>
仓库源代码导入
如果您只能访问源目标仓库,那么您的生活会变得更加困难。我的建议是,在继续这种方式之前,先检查您是否无法在公共 OBS 服务(例如 openSUSE 或 MeeGo 提供的服务)上获取登录名。
如前所述,您将无法导入项目配置,并且必须手动创建它。这太长了,无法在本 HowTo 中涵盖。
更多关于项目配置
注意:应将此方法作为最后的手段使用。
引导问题
注意:可以使用同一种方法对同一个项目。
工具链
为了重新构建一个独立的工程,您的 OBS 首先需要构建完整的参考工具链。
这个过程 - 称为引导 - 提出了与“先有鸡还是先有蛋”相同的问题!
工具链二进制文件由以下提供
源代码可以由以下提供
在下面概述的步骤中,方法是首先复制源代码包,然后将二进制包引入项目。然后依赖于 OBS 重建设施来重建和覆盖二进制包。
一种干净的引导技术
如果您想要一个完整的独立离线 OBS 引导,请使用
#Repository_Binary_Import + #OBS_Package_copy
如果您无法做到这一点,首先执行
(#OBS_Remote_Link or #Repository_Binary_Download_On_Demand_(DOD)) + (#OBS_Package_copy or #Repository_Source_Import)
然后您将能够执行
#Repository_Binary_Import + #OBS_Package_copy
分步指南
命名约定
PROJECT=Meego-test:1.2 PROJECT_SOURCE=MeeGo:1.2.0:oss REPO=standard ARCH=i586 OBSHOST=http://myprivateserver.meego.com:81 OBSHOST_SOURCE=https://api.meego.com Login="The OBS login" Pwd="The OBS passworld"
注意:我们假设您拥有 OBSHOST 和 OBSHOST_SOURCE 的帐户(登录名/密码)。
注意:“standard”是您项目定义中的构建仓库的默认名称。它可能会因创建初始构建仓库的人而异。
注意:我们假设您已在工作站上安装了“osc”包。
注意:“osc”不支持公共主机,例如 'https://api.meego.com/public'。
重要提示
注意:用作构建目标的工程必须具有“prjconf”来定义将哪些包放入构建根目录。如果您不使用 OBS 构建的仓库,则必须生成一个合适的仓库(可能基于现有的 openSUSE OBS 项目)。这是一个复杂的主题 - (更多关于项目配置)
如何初始化项目配置
简单的方法是从现有项目初始化。
osc -A $OBSHOST_SOURCE meta prjconf $PROJECT_SOURCE > my_project.conf
如果您无法访问 $OBSHOST_SOURCE,您也可以使用“curl”。
curl $OBSHOST_SOURCE/public/source/$PROJECT_SOURCE/_config > my_project.conf
现在您可以导入您的“项目配置”。
osc -A $OBSHOST meta prjconf -F my_project.conf $PROJECT
当然,您也可以使用 Web UI 复制/粘贴项目配置。
“$PROJECT>高级>项目配置>项目配置”
设置您的 OBS
登录到 Web API 参见启动您的 OBS Appliance
默认用户 Admin,密码为 opensuse 可用。创建您自己的登录名和密码并将自己设置为管理员。
以管理员身份登录到 Web UI,然后单击“设置 OBS”图标。接受默认设置。它应该可以工作。
创建您的第一个仓库项目
通过 Web UI 创建
OBS 根目录下的项目。
从“位置” -> “项目”下选择。在左上角单击“创建新项目”。为其命名(例如 Meego-test)
输入“ProjectName”(Meego-test:1.2)、“Title”(Meego-test 1.2)、“Description”。
您需要是“管理员”才能在 OBS 根目录下创建项目。
子项目。
选择一个项目。单击“操作->创建子项目”
将项目作为子项目创建可以简化用户和项目管理。
输入“ProjectName”(1.2)、“Title”(Meego-test 1.2)、“Description”。
这里 1.2 是 Meego-test 的子项目
您需要是项目的“维护者”才能创建子项目。
配置项目。
您现在有一个项目 Meego-test:1.2。
进入 Web UI 的“高级” -> “原始配置/元数据”,并添加一个包含架构的部分(通常在 <project> 中,是最后一个条目)。
<project name="Meego-test:1.2"> <title>Meego-test 1.2</title> <description>A Description</description> <person role="maintainer" userid="obsuser"/> <person role="bugowner" userid="obsuser"/> <repository name="standard"> <arch>i586</arch> <arch>armv8el</arch> </repository> </project>
注意:您可以拥有多个架构 <arch>armv8el</arch>
通过命令行创建
osc -A $OBSHOST meta prj -F - $PROJECT << OTHEREOF <project name="$PROJECT"> <title>A Title</title> <description>A Description</description> <person role="maintainer" userid="$Login"/> <person role="bugowner" userid="$Login"/> <repository name="$REPO"> <arch>$ARCH</arch> </repository> </project> OTHEREOF
导入您的基础 Linux 项目
现在我们将导入基础项目。我们将描述上面概述的五种方法。
使用仓库二进制导入
准备 OBS 服务器
在我们要将二进制文件导入到具有源代码的项目的特殊情况下,您必须停止调度程序,因为它会在二进制文件在它下方更改时创建混乱。(注意,在 OBS 的 2.3 版本之前,使用“shutdown”而不是“stop”,因为它执行干净的关闭)。
rcobsscheduler shutdown
通过 Web 进行二进制导入
稳定的仓库(或快照)被导入到后端仓库服务器 (bs_repserver) 机器。
- 二进制文件被复制到暂存区域(不是直接复制到 /srv/obs)。
mkdir -p /data/imports cd /data/imports
使用 rsync 命令:
rsync -a --progress rsync://mirrors.kernel.org/meego/builds/1.2.90/1.2.90.0.0.20110824.2/repos/ meego_1.2.90.0.0.20110824.2
使用 wget 命令:
wget --directory-prefix=/data/imports --reject index.html* --mirror --no-parent --no-host-directories --cut-dirs=8 http://repo.meego.com/MeeGo/releases/1.2.0/repos/oss/ia32/packages/
- 现在创建“:full”目录。
mkdir -p /srv/obs/build/$PROJECT/$REPO/$ARCH/:full cd /srv/obs/build/$PROJECT/$REPO/$ARCH/:full
- 将二进制文件添加到项目的 :full 目录
警告:以下片段错误地删除了包的某些部分。例如,不同的 yast rpm 被重命名为 yast2.rpm。
# sorted, so that later versions overwrite earlier versions, if any for i in `find /data/imports/ -name \*.rpm | sort`; do j=`basename $i` k=`echo $j |sed -rn 's/(.*)-.*-.*.rpm/\1.rpm/p'` mv $i /srv/obs/build/$PROJECT/$REPO/$ARCH/:full/$k done
代替上面的片段,可以使用以下内容来执行重命名。如果要将此命令修改为更通用的命令,请在此处贡献它并删除原始命令。
find . -type f -name "*-*.*.rpm" | perl -pe 'print $_; s/-[\w\.\+\~]*-[\d\.]+\..\w+\.rpm$/.rpm/' | xargs -n2 mv
记住更改文件的所有者
chown -R obsrun:obsrun /srv/obs/build/$PROJECT
传输完包后,可以删除临时目录。
rm -r /data/imports
注意:这些 RPM 应该删除发布号和版本号。例如,alsa-utils-1.0.22-2.7.i586.rpm -- 应该为 – alsa-utils.rpm
从另一个项目进行二进制导入
mkdir -p /srv/obs/build/$PROJECT/$REPO/$ARCH/:full cp /srv/obs/build/$PROJECT_old/$REPO_old/$ARCH_old/\:full/* /srv/obs/build/$PROJECT/$REPO/$ARCH/\:full/ chown -R obsrun:obsrun /srv/obs/build/$PROJECT
- 将二进制文件添加到项目的 :full 目录。将 /srv/obs/build/ 下的所有用户/组权限更改为“obsrun”。如果您将 root 作为 :full 的所有者,它仍然可以构建,但调度器将无法(几乎静默地)使用最新的构建包升级 :full。在非常特殊的情况下,您不太可能这样做。
chown -R obsrun:obsrun /srv/obs/build/$PROJECT
初始化 OBS
- 如果调度器未运行,请立即启动它。
rcobsscheduler start
注意:不要执行“restart”,因为这会将关闭事件放入调度器队列;然后,当调度器启动时,它会看到该事件并立即停止。请使用 shutdown/start 代替。
- 后端会收到有关导入的软件包的信息。这将向调度器发送一个事件,该事件将重新索引您的新 ':full' 目录并创建一个名为 :full.solv 的文件。
/usr/lib/obs/server/bs_admin --rescan-repository $PROJECT $REPO $ARCH
现在该项目已准备就绪,您可以开始针对它进行构建。
注意:当项目准备好后,您可以“正式”将其添加到 OBS 服务器。 openSUSE:Build_Service_private_installation#Add_Repositories_targets
使用仓库二进制文件按需下载 (DOD)
修改项目的 'Raw config/Meta'
<project name="$PROJECT"> <title>A Title</title> <description>A Description</description> <person userid="obsuser" role="maintainer"/> <person userid="obsuser" role="bugowner"/> <download arch="$ARCH" metafile="primary.xml" mtype="rpmmd" baseurl="http://repo.meego.com/MeeGo/releases/1.2.0/repos/oss/$ARCH/packages/"/> <download arch="armv8el" metafile="primary.xml" mtype="rpmmd" baseurl="http://repo.meego.com/MeeGo/releases/1.2.0/repos/oss/armv7hl/packages/"/> <useforbuild> <disable/> </useforbuild> <build> <disable/> </build> <publish> <disable/> </publish> <repository name="$REPO"> <arch>$ARCH</arch> <arch>armv8el</arch> </repository> </project>
注意:由于您可以拥有多个架构 <arch>armv8el</arch>,因此您可以拥有多个下载链接。
下载 primary.xml 文件
创建目录
mkdir -p /srv/obs/build/$PROJECT/$REPO/$ARCH/:full cd /srv/obs/build/$PROJECT/$REPO/$ARCH/:full
如果存在,则删除旧文件。
rm -f *primary.xml*
下载 primary.xml 文件并更改所有者。
wget -q -c http://[REPO_URL]/repodata/c843450ac61964516fa1f83477573da3d61596f243884c9f40b0dcef5f5403f5-primary.xml.gz mv *-primary.xml.gz primary.xml.gz gunzip primary.xml.gz chown -R obsrun:obsrun /srv/obs/build/$PROJECT
注意:如果服务器上的 primary.xml 文件发生更改,则必须更新您自己的文件。
cd /srv/obs/build/$PROJECT/$REPO/$ARCH/ rm \:full.solv cd \:full wget -q -c http://[REPO_URL]/repodata/c843450ac61964516fa1f83477573da3d61596f243884c9f40b0dcef5f5403f5-primary.xml.gz mv *-primary.xml.gz primary.xml.gz gunzip primary.xml.gz chown -R obsrun:obsrun /srv/obs/build/$PROJECT obs_admin --rescan-repository $PROJECT $REPO $ARCH
初始化项目配置 (DOD)
初始化 OBS 包复制的项目配置
请参阅 #How_to_initialize_a_project_config
加载 prjconf,这将导致调度器生成 :full.solv 文件
现在该项目已准备就绪,您可以开始针对它进行构建。
注意:当项目准备好后,您可以“正式”将其添加到 OBS 服务器。 openSUSE:Build_Service_private_installation#Add_Repositories_targets
使用 OBS 包复制
如何使用 "osc copypac"
osc copypac 具有一个 -t 选项,该选项可启用向远程目标 OBS 实例进行复制。
#osc copypac --help copypac: Copy a package A way to copy package to somewhere else. It can be done across buildservice instances, if the -t option is used. In that case, a client-side copy and link expansion are implied. Using --client-side-copy always involves downloading all files, and uploading them to the target. The DESTPAC name is optional; the source packages' name will be used if DESTPAC is omitted. usage: osc copypac SOURCEPRJ SOURCEPAC DESTPRJ [DESTPAC] Options: -h, --help show this help message and exit -e, --expand if the source package is a link then copy the expanded version of the link -m TEXT, --message=TEXT specify message TEXT -t URL, --to-apiurl=URL URL of destination api server. Default is the source api server. -r rev, --revision=rev link the specified revision. -d, --keep-develproject keep develproject tag in the package metadata -k, --keep-maintainers keep original maintainers. Default is remove all and replace with the one calling the script. -c, --client-side-copy do a (slower) client-side copy
初始化 OBS 包复制的项目配置
首先,您需要导入项目配置。
请参阅 #How_to_initialize_a_project_config
复制源
然后导入项目。
注意:您必须可以访问 $OBSHOST_SOURCE。如果不能,并且您的源 $OBSHOST_SOURCE 支持公共匿名 API,则可以使用 obstag/obs2obscopy 或考虑以下方法 #OBS_Remote_Link,据报道该方法速度更快。
PRJ=ProjectToCopy for i in `osc -A $OBSHOST_SOURCE ls $PROJECT_SOURCE` do osc -A $OBSHOST_SOURCE copypac -t $OBSHOST $PROJECT_SOURCE $i $PROJECT done
注意:由于您可能在导入的项目中包含一些链接,因此最好保持源项目和目标项目名称相同。
注意:如果您想复制包含大量软件包的完整项目,obstag/obs2obscopy 是一个不错的选择。
现在该项目已准备好针对仓库进行构建。
使用 OBS 远程链接
某些 $OBSHOST_SOURCE(例如 build.meego.com)将允许您匿名浏览项目,但不会轻易提供登录信息。要从这些 $OBSHOST_SOURCE 复制,您可以在本地 $OBSHOST 中创建一个链接项目,然后像复制本地副本一样进行复制。
您需要是“管理员”才能创建远程链接。
您有两种方法可以创建远程链接的 OBS。
通过 Web UI 创建
在构建服务的“欢迎”页面上,您可以使用 Web UI 中的“设置 OBS”按钮
Local Project Name: meego.com Remote OBS api url: https://api.meego.com/public Title: build.MeeGo.com Description: This project allows access to all resources on build.meego.com instance.
通过命令行创建
手动在项目元数据中创建一个配置。下面的示例表示一个名为“meego.com”的本地项目,它是指向官方 MeeGo OBS 的公共 API 的链接。
osc -A $OBSHOST meta prj -F - meego.com << OTHEREOF <project name="meego.com"> <title>build.MeeGo.com</title> <description>This project allows access to all resources on build.meego.com instance.</description> <remoteurl>https://api.meego.com/public</remoteurl> <person role="maintainer" userid="Admin"/> <person role="bugowner" userid="Admin"/> </project> OTHEREOF
副作用
- 您无法使用“osc ls”命令发现远程 OBS 上有什么可用内容。该项目将被报告为空,您需要使用 Web UI 直接浏览远程 OBS。
- 如果 $OBSHOST_SOURCE 的服务器关闭或无法访问(例如 build.meego.com),您的项目将无法使用。
如何使用远程链接
要访问远程项目(复制或构建),您只需在远程项目名称之前加上本地链接的名称即可。
例如,如果您的链接名为 meego.com,要访问官方 MeeGo OBS 上的 MeeGo:1.2:oss,您将使用 meego.com:MeeGo:1.2:oss
通过 'osc'
osc -A $OBSHOST ls meego.com:MeeGo:1.2:oss
通过 'curl'
curl $OBSHOST/source/meego.com:MeeGo:1.2:oss
一个项目可以针对远程仓库进行构建。
例如
<repository name="MeeGo_1.2"> <path repository="standard" project="meego.com:MeeGo:1.2:oss"/> <arch>armv8el</arch> <arch>i586</arch> </repository>
注意:当项目准备好后,您可以“正式”将其添加到 OBS 服务器。 openSUSE:Build_Service_private_installation#Add_Repositories_targets
使用仓库源导入
如何使用 "osc importsrcpkg"
您需要将所有源 RPM 下载到本地机器,并使用以下命令将其导入到您的项目中
#osc importsrcpkg --help importsrcpkg: Import a new package from a src.rpm A new package dir will be created inside the project dir (if no project is specified and the current working dir is a project dir the package will be created in this project). If the package does not exist on the server it will be created too otherwise the meta data of the existing package will be updated (<title /> and <description />). The src.rpm will be extracted into the package dir. The files won't be committed unless you explicitly pass the --commit switch. SRPM is the path of the src.rpm in the local filesystem,or an URL. Usage: osc importsrcpkg SRPM Options: -h, --help show this help message and exit -c, --commit commit the new files --delete-old-files delete existing files from the server -d description, --description=description set the description of the package -t title, --title=title set a title -n name, --name=name specify a package name -p project, --project=project specify the path to a project
初始化仓库源导入的项目配置
初始化 OBS 包复制的项目配置
请参阅 #How_to_initialize_a_project_config
上传软件包
在您的本地机器上
osc -A $OBSHOST checkout $PROJECT cd $PROJECT
提交到 OBS 服务器
osc ci -m "Commit the src"
现在导入您的源 RPM
osc importsrcpkg ~/tzdata-2010b-2.8.src.rpm osc add tzdata/*
现在该项目已准备好针对仓库进行构建。
故障排除
此时,您应该看到您的项目重新启动以进行构建。如果不是
- 检查目标 :full 目录中的所有文件都由 obsrun 用户拥有。以下命令不应返回任何文件名
find /obs/build ! -user obsrun
- 检查您的引导项目是否具有定义的元数据。您必须从用于创建 :full 的项目导入元数据。osc meta prj 命令也可以在链接的项目上工作。
osc meta prj link:REMOTE_REFERENCE_PROJECT > prj-meta-to-be-copied.meta osc meta prj -F prj-meta-to-be-copied.meta YOUR_LOCAL_BOOTSTRAP_PROJECT
如果您找到任何文件或目录,请使用
chown -R obsrun:obsrun /obs/build (will correct any ownership issue)
- 强制 OBS 重新索引您的新 :full 目录。它将创建一个名为 :full.solv 的文件
obs_admin --rescan-repository $PROJECT $REPO $ARCH
- 检查您的 RPM 是否有效(即在传输过程中未损坏)
cd /obs/build/$PROJECT/$REPO/$ARCH/:full for I in `ls *.rpm` ; do rpm -qlp $I >/dev/null; if [ $? -ne 0 ] ;then echo $I >>../error.lst ; fi ; done cat ../error.lst (must be empty, all rpm in error needs re-installation)
- 仍然无法工作,请查看目录中的日志文件/obs/log.
您可以从 /obs/log/scheduler_$ARCH.log 开始,并从末尾搜索字符串“expanding dependencies”。您将从那里找到调度器失败的原因。
tail -f /obs/log/scheduler_$ARCH.log
创建一个用于测试引导的第一个项目
- 通过 Web API 创建一个专用用户 (testUser) 后,使用您的新登录名重新登录 Web UI。
- 打开您的主项目,并创建一个名为“MyTest”的子项目,“home:testUser>Actions>Create subproject”。
- 在您的新主项目中添加一个软件包。
- 只需创建一个分支“Packages>Create new package based on existing package”,使用您最近复制到新 OBS 实例中的一个软件包。选择一个较小的软件包以加快编译时间(例如 tzdata)。
- 从头开始创建一个软件包“Packages>Add”(您需要手动添加源)。
- 添加一个仓库。
- 通过 OBS 仓库 UI:单击“home:obsuser:testProject>Repositories>Add”。
- 通过 OBS 仓库 UI 上的本地项目:“home:obsuser:testProject>Repositories>Add>通过高级界面选择一个”。
- 项目:从列表中选择您刚刚导入和重建的项目/仓库。
- 仓库:从列表中选择仓库。
- 新名称:为您的仓库指定一个名称(例如 my-repository-test、standard 等)。
这将请求 OBS 使用该仓库构建您的新项目“MyTest”。
您现在可以
- 使用 osc 命令签出您的项目“MyTest”。
- 修改一两个文件。
- 签入软件包/项目。
OBS 将重建您的项目“MyTest”。
如果参考项目发生更改,OBS 也会重建您的项目“MyTest”。