<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Ci/Cd on Tsic&#39;s Blog</title>
    <link>https://tsic.top/tags/ci/cd/</link>
    <description>Recent content in Ci/Cd on Tsic&#39;s Blog</description>
    <generator>Hugo -- 0.154.0</generator>
    <language>zh-CN</language>
    <lastBuildDate>Wed, 01 Feb 2023 20:25:19 +0800</lastBuildDate>
    <atom:link href="https://tsic.top/tags/ci/cd/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>OBS使用指南</title>
      <link>https://tsic.top/post/obs-user-manual/</link>
      <pubDate>Wed, 01 Feb 2023 20:25:19 +0800</pubDate>
      <guid>https://tsic.top/post/obs-user-manual/</guid>
      <description>&lt;p&gt;介绍OBS的一些使用指南。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>介绍OBS的一些使用指南。</p>
<h2 id="obs-介绍">OBS 介绍</h2>
<p><a href="https://openbuildservice.org/">open build service</a>简称OBS，是<a href="https://github.com/openSUSE/open-build-service">openSUSE主导开发</a>的通用构建系统，用于从源码的自动构建和包分发。</p>
<p>假设读者已经了解debian系打包📦相关。本文中对osc的介绍主要作为OBS的CLI接口，本地构建方面可参考<a href="#osc-%E6%9C%AC%E5%9C%B0%E6%9E%84%E5%BB%BA">osc 本地构建</a>。</p>
<h2 id="obs-打包流程">OBS 打包流程</h2>
<p>本文以deepin(debian系)构建，<a href="build.deepin.com">deepin OBS实例</a>为例</p>
<ol>
<li>
<p>创建Project
每个普通账号只有自己的home project。比如：home:tsic404</p>
<p>也可以可以在Subprojects一栏，创建subproject。比如创建 home:tsic404:ddeOnDebian。
<img loading="lazy" src="https://s2.loli.net/2023/02/06/4mSBpOAgrW2fRaD.jpg">
<img loading="lazy" src="https://s2.loli.net/2023/02/06/ymsQDnxCF34vuAh.jpg">
然后</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">osc co home:tsic404:ddeOnDebian
</span></span></code></pre></div><p><code>home:tsic</code>项目内容不会包含<code>home:tsic:ddeOnDebian</code>,两个是各自 “相对独立” 的project。</p>
</li>
<li>
<p>添加构建仓库
在OBS web界面点击Repository，然后add一个Repository到该Project中。
<img loading="lazy" src="https://s2.loli.net/2023/02/06/VmgQ59vcUJbodGn.jpg">
<img loading="lazy" src="https://s2.loli.net/2023/02/06/gaest56XP3kSnic.jpg">
如上图add debian sid repo。</p>
<p>或者使用<code>osc meta prj</code>修改project使用的仓库。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="nt">&lt;project</span> <span class="na">name=</span><span class="s">&#34;home:tsic404:ddeOnDebian&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="nt">&lt;title/&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="nt">&lt;description/&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="nt">&lt;person</span> <span class="na">userid=</span><span class="s">&#34;tsic&#34;</span> <span class="na">role=</span><span class="s">&#34;maintainer&#34;</span><span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="nt">&lt;repository</span> <span class="na">name=</span><span class="s">&#34;Debian_Sid&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;path</span> <span class="na">project=</span><span class="s">&#34;Debian:Sid&#34;</span> <span class="na">repository=</span><span class="s">&#34;standard&#34;</span><span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;path</span> <span class="na">project=</span><span class="s">&#34;Debian:ddeExtra&#34;</span> <span class="na">repository=</span><span class="s">&#34;Debian_Sid&#34;</span><span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;arch&gt;</span>x86_64<span class="nt">&lt;/arch&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="nt">&lt;/repository&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/project&gt;</span>
</span></span></code></pre></div></li>
<li>
<p>创建Package
可以在web点击create package或者使用osc</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">cd</span> home:tsic404:ddeOnDebian
</span></span><span class="line"><span class="cl">osc mkpac dtkcore
</span></span></code></pre></div></li>
<li>
<p>上传打包文件
点击dtkcore，然后点击add local file。选择dtkcore相关打包文件。即可上传到OBS的Project中。
或者使用 osc
<img loading="lazy" src="https://s2.loli.net/2023/02/06/zJcxQnu98PdMUpG.jpg"></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">cd</span> dtkcore
</span></span><span class="line"><span class="cl">cp xxxx/dtkcore/* ./
</span></span><span class="line"><span class="cl">osc add *
</span></span><span class="line"><span class="cl">osc ci -m <span class="s2">&#34;init&#34;</span>
</span></span></code></pre></div></li>
<li>
<p>OBS开始构建
在dtkcore右侧即可看到对应的状态
点击对应仓库的架构即可看到构建日志，或者使用osc 也可以查看构建日志。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">osc buildlog Debian_Sid x86_64
</span></span></code></pre></div></li>
</ol>
<p><strong>总结</strong>：</p>
<p>使用OBS进行打包，首先先创建Project，添加构建使用的仓库，然后上传需要打包的package到project中，等待OBS构建完成。Project + 构建仓库决定OBS publish的一个仓库。</p>
<h2 id="obs-打包优化service及scm集成">OBS 打包优化(service)及SCM集成</h2>
<p>传统方式需要用户自己手动上传打包需要的全部文件xxxx.org.tar.gz xxx.debain.tar.gz xxxx.dsc三件套，这个过程比较麻烦。我们可以使用OBS的service来生成这些必要的文件。</p>
<h3 id="obs-service介绍">OBS service介绍</h3>
<p>service 简单来说就是一些辅助型的脚本，来协助生成和修改打包所需要的文件。</p>
<p>比如:</p>
<p>使用obs_gbp为git仓库生成debian构建需要的dsc等。</p>
<p>使用set_version动态修改版本号。</p>
<p>使用download_url从指定的url(比如release)下载压缩包等。</p>
<p>service有自己的mode(运行的时机)
service的runmode有</p>
<table>
  <thead>
      <tr>
          <th>Mode</th>
          <th>是否在OBS server上运行</th>
          <th>本地构建时是否运行</th>
          <th>service新增文件处理方式</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Default</td>
          <td>在commit之后</td>
          <td>本地构建之前</td>
          <td>生成_service:前缀的文件</td>
      </tr>
      <tr>
          <td>trylocal</td>
          <td>Yes</td>
          <td>Yes</td>
          <td>生成文件会直接merge到commit里面</td>
      </tr>
      <tr>
          <td>localonly</td>
          <td>No</td>
          <td>Yes</td>
          <td>生成文件会直接merge到commit里面｜</td>
      </tr>
      <tr>
          <td>serveronly</td>
          <td>Yes</td>
          <td>No</td>
          <td>以_service:前缀开始，但是用户本地不会生成</td>
      </tr>
      <tr>
          <td>buildtime</td>
          <td>构建调用dpkg-buildpackage之类的打包工具之前</td>
          <td>每次构建之前</td>
          <td></td>
      </tr>
      <tr>
          <td>manual</td>
          <td>No</td>
          <td>只有OSC命令调用</td>
          <td></td>
      </tr>
      <tr>
          <td>disabled</td>
          <td>No</td>
          <td>只有OSC命令调用</td>
          <td></td>
      </tr>
  </tbody>
</table>
<p>注：</p>
<ol>
<li>
<p>在对应时间运行service时，需要此时安装该service。比如trylocal需要本机，server需要server安装，buildtime需要worker安装。比如选择buildtime，但是worker没有对应service的依赖时，构建就会处于unresolvable状态。</p>
</li>
<li>
<p>build.deepin.com提供了<a href="https://github.com/openSUSE/obs-service-download_files">download_files</a>,<a href="https://github.com/openSUSE/obs-service-download_url">download_url</a>,<a href="https://github.com/openSUSE/obs-service-tar_scm">obs_gbp</a>，<a href="https://github.com/openSUSE/obs-service-tar_scm">obs_scm</a>，<a href="https://github.com/openSUSE/obs-service-tar_scm">tar_scm</a>，<a href="https://github.com/openSUSE/obs-service-set_version">set_version</a>，<a href="https://github.com/openSUSE/obs-service-tar_scm">tar</a>几种服务。</p>
</li>
</ol>
<h3 id="使用service过程">使用service过程</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">cd</span> home:tsic404:ddeOnDebain
</span></span><span class="line"><span class="cl">vim _service
</span></span></code></pre></div><p>加入以下内容</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="nt">&lt;services&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="nt">&lt;service</span> <span class="na">name=</span><span class="s">&#34;obs_gbp&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">&#34;url&#34;</span><span class="nt">&gt;</span>https://github.com/linuxdeepin/dtkcore.git<span class="nt">&lt;/param&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">&#34;scm&#34;</span><span class="nt">&gt;</span>git<span class="nt">&lt;/param&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">&#34;exclude&#34;</span><span class="nt">&gt;</span>.git<span class="nt">&lt;/param&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">&#34;exclude&#34;</span><span class="nt">&gt;</span>.github<span class="nt">&lt;/param&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">&#34;versionformat&#34;</span><span class="nt">&gt;</span>@CHANGELOG@@DEEPIN_OFFSET@<span class="nt">&lt;/param&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">&#34;gbp-dch-release-update&#34;</span><span class="nt">&gt;</span>enable<span class="nt">&lt;/param&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="nt">&lt;/service&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/services&gt;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">osc add _service
</span></span><span class="line"><span class="cl">osc commit -m <span class="s2">&#34;init&#34;</span>
</span></span></code></pre></div><p>然后web看到service is running的提示，等待service运行完毕，即可看到对应文件的生成。</p>
<p>使用service可以极大方便使用源代码服务器(git等)的项目打包构建。</p>
<h3 id="workflow介绍">workflow介绍</h3>
<p>注：OBS-api需要在2.11版本之后才有workflow功能</p>
<p>workflow 的步骤有</p>
<ol>
<li>
<p>branch_package</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">test_build</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">   </span><span class="nt">steps</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">branch_package</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">         </span><span class="nt">source_project</span><span class="p">:</span><span class="w"> </span><span class="l">deepin:Develop:main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">         </span><span class="nt">source_package</span><span class="p">:</span><span class="w"> </span><span class="l">%{SCM_REPOSITORY_NAME} </span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">         </span><span class="nt">target_project</span><span class="p">:</span><span class="w"> </span><span class="l">deepin:CI</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">   </span><span class="nt">filters</span><span class="p">:</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">event</span><span class="p">:</span><span class="w"> </span><span class="l">pull_request</span><span class="w">
</span></span></span></code></pre></div></li>
<li>
<p>link_package</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">test_build</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">   </span><span class="nt">steps</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">link_package</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">         </span><span class="nt">source_project</span><span class="p">:</span><span class="w"> </span><span class="l">deepin:Develop:main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">         </span><span class="nt">source_package</span><span class="p">:</span><span class="w"> </span><span class="l">%{SCM_REPOSITORY_NAME} </span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">         </span><span class="nt">target_project</span><span class="p">:</span><span class="w"> </span><span class="l">deepin:CI</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">configure_repositories</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">         </span><span class="nt">project</span><span class="p">:</span><span class="w"> </span><span class="l">deepin:CI</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">         </span><span class="nt">repositories</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">deepin_develop</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">paths</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">               </span>- <span class="nt">target_project</span><span class="p">:</span><span class="w"> </span><span class="l">deepin:CI</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                 </span><span class="nt">target_repository</span><span class="p">:</span><span class="w"> </span><span class="l">deepin_develop</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">architectures</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">               </span>- <span class="l">x86_64</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">               </span>- <span class="l">aarch64</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">   </span><span class="nt">filters</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">event</span><span class="p">:</span><span class="w"> </span><span class="l">pull_request</span><span class="w">
</span></span></span></code></pre></div></li>
<li>
<p>configure_repositories</p>
<p>configure_repositories 如上面所示，用于配置link_package后的project构建仓库。</p>
</li>
<li>
<p>set_flag</p>
<p>支持的flag有</p>
<ul>
<li>lock (default status disable)</li>
<li>build (default status enable)</li>
<li>publish (default status enable)</li>
<li>debuginfo (default status disable)</li>
<li>useforbuild (default status enable)</li>
<li>binarydownload (default status enable)</li>
<li>sourceaccess (default status enable)</li>
<li>access (default status enable)</li>
</ul>
</li>
<li>
<p>trigger_service</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">commit_build</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">   </span><span class="nt">steps</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">trigger_services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">         </span><span class="nt">project</span><span class="p">:</span><span class="w"> </span><span class="l">deepin:Develop:community</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">         </span><span class="nt">package</span><span class="p">:</span><span class="w"> </span><span class="l">%{SCM_REPOSITORY_NAME}</span><span class="w">
</span></span></span></code></pre></div><p>重新trigger 该package的service，用于更新commit仓库的代码。</p>
</li>
<li>
<p>rebuild_package</p>
<p>触发pacakge的rebuild。</p>
</li>
</ol>
<h3 id="使用service与workflow">使用service与workflow</h3>
<ol>
<li>SCM + service 持续集成
osc token 创建SCM token
github 填写对应的webhook
推送.obs/workflows.yml到仓库中，该文件定义了OBS workflow的步骤。</li>
</ol>
<h2 id="obs-集成姿势">OBS 集成姿势</h2>
<p>在package 左侧点击<code>Submit Package</code>。
然后填写如下内容。
<img loading="lazy" src="https://s2.loli.net/2023/02/08/bu2pqBN9S1ovnJc.png">
submit 提交。将生成一个request，等待管理员审核。</p>
<p>project管理员在<a href="https://build.deepin.com/my/tasks">tasks</a>看到所有的请求</p>
<p>点击对应请求，approve或者reject request。</p>
<p>approve后 package将提交到target project中。</p>
<h2 id="osc-本地构建">osc 本地构建</h2>
<p>deepin 20环境</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo apt install osc obs-build rpm <span class="nv">debugedit</span><span class="o">=</span>4.14.2.1+dfsg1.1-1+dde
</span></span></code></pre></div><p>把obs-build设置免密。</p>
<pre tabindex="0"><code>sudo visudo
</code></pre><p>加入以下内容</p>
<pre tabindex="0"><code>LOGIN    ALL = NOPASSWD: /usr/bin/build
LOGIN    ALL = NOPASSWD: /usr/bin/osc
</code></pre><pre tabindex="0"><code>osc co deepin:Develop:main apt
cd deepin\:Develop\:main/apt
osc build xxxxx.dsc
</code></pre><p>即可使用OBS上的仓库进行构建。</p>
<h3 id="deepin-obs-scm一些常见问题">deepin OBS SCM一些常见问题</h3>
<ol>
<li>
<p>GitHub webhooks未触发</p>
<p>大概率是网络问题导致，需要在 GitHub webhook 配置中<code>redeliver</code>该次失败的请求。</p>
</li>
<li>
<p>GitHub webhooks传递过来但是没有对应仓库和架构的情况返回</p>
<p>需要到OBS看看是不是构建前的准备工作出现问题，比如service失败，依赖处于 unresolvable，broken。只有成功构建的 succeeded 和失败的 failed 才会返回到GitHub。</p>
</li>
</ol>
<h2 id="备注">备注</h2>
<p>参考文档</p>
<ol>
<li>
<p>OBS 用户手册</p>
<ol>
<li><a href="https://openbuildservice.org/help/manuals/obs-user-guide/">https://openbuildservice.org/help/manuals/obs-user-guide/</a></li>
<li><a href="https://openbuildservice.org/files/manuals/obs-user-guide.pdf">https://openbuildservice.org/files/manuals/obs-user-guide.pdf</a></li>
<li><a href="https://openbuildservice.org/files/manuals/obs-user-guide.epub">https://openbuildservice.org/files/manuals/obs-user-guide.epub</a></li>
</ol>
</li>
<li>
<p>OBS 管理员手册</p>
<ol>
<li><a href="https://openbuildservice.org/help/manuals/obs-admin-guide/">https://openbuildservice.org/help/manuals/obs-admin-guide/</a></li>
<li><a href="https://openbuildservice.org/files/manuals/obs-admin-guide.pdf">https://openbuildservice.org/files/manuals/obs-admin-guide.pdf</a></li>
<li><a href="https://openbuildservice.org/files/manuals/obs-admin-guide.epub">https://openbuildservice.org/files/manuals/obs-admin-guide.epub</a></li>
</ol>
</li>
<li>
<p>suse wiki</p>
<ol>
<li><a href="https://zh.opensuse.org/Category">https://zh.opensuse.org/Category</a>:构建服务</li>
<li><a href="https://en.opensuse.org/Category:Build_Service">https://en.opensuse.org/Category:Build_Service</a></li>
</ol>
</li>
<li>
<p>osc <a href="https://en.opensuse.org/openSUSE:Build_Service_Tutorial">https://en.opensuse.org/openSUSE:Build_Service_Tutorial</a></p>
</li>
<li>
<p>OBS 调度 <a href="https://wiki.tizen.org/OBS_scheduler_internals">https://wiki.tizen.org/OBS_scheduler_internals</a></p>
</li>
<li>
<p>OBS 开发 wiki <a href="https://github.com/openSUSE/open-build-service/wiki">https://github.com/openSUSE/open-build-service/wiki</a></p>
</li>
</ol>
]]></content:encoded>
    </item>
  </channel>
</rss>
