<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>OPSaid – 构建与发布</title><link>https://opsaid.net/docs/platform-engineering/build-release/</link><description>Recent content in 构建与发布 on OPSaid</description><generator>Hugo -- gohugo.io</generator><atom:link href="https://opsaid.net/docs/platform-engineering/build-release/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: Kaniko</title><link>https://opsaid.net/docs/platform-engineering/build-release/kaniko/</link><pubDate>Wed, 22 Mar 2023 11:10:14 +0800</pubDate><guid>https://opsaid.net/docs/platform-engineering/build-release/kaniko/</guid><description>
&lt;h2 id="简要概述">简要概述&lt;/h2>
&lt;p>需要在容器里面构建镜像，一般有以下 3 中方式：&lt;/p>
&lt;ol>
&lt;li>通过挂载宿主的运行时 socket；&lt;/li>
&lt;li>通过 Docker-in-Docker 方式；&lt;/li>
&lt;li>使用 buildkit 工具与运行时 socket；&lt;/li>
&lt;/ol>
&lt;p>以上方式均需要依赖后端的容器 daemon，可能还需特权模式，这样构建镜像不够便利以及可能存在安全风险。&lt;/p>
&lt;p>这里通过 &lt;a href="https://github.com/GoogleContainerTools/kaniko">kaniko&lt;/a> 在容器运行时构建镜像，而不依赖后端。&lt;/p>
&lt;h2 id="镜像地址">镜像地址&lt;/h2>
&lt;ul>
&lt;li>官方镜像&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>gcr.io/kaniko-project/executor:v1.9.1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gcr.io/kaniko-project/executor:v1.9.1-slim
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gcr.io/kaniko-project/executor:v1.9.1-debug
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>默认镜像是 &amp;ldquo;FROM scratch&amp;rdquo;，也就是不带任何 &amp;ldquo;shell&amp;rdquo;，无法登录调试。 其他 &amp;ldquo;-slim&amp;rdquo; 是瘦身精简的镜像，而 &amp;ldquo;-debug&amp;rdquo; 是带了 &amp;ldquo;busybox&amp;rdquo; 版本的 &amp;ldquo;shell&amp;rdquo; 镜像。&lt;/p>
&lt;ul>
&lt;li>国内镜像&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>registry.cn-hangzhou.aliyuncs.com/kube-image-repo/kaniko:v1.9.1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>registry.cn-hangzhou.aliyuncs.com/kube-image-repo/kaniko:v1.9.1-slim
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>registry.cn-hangzhou.aliyuncs.com/kube-image-repo/kaniko:v1.9.1-debug
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>国内仅同步 &amp;ldquo;linux/amd64&amp;rdquo; 架构。&lt;/p>
&lt;h2 id="命令参数">命令参数&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>名称&lt;/th>
&lt;th>默认值&lt;/th>
&lt;th>描述&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>build-arg&lt;/td>
&lt;td>-&lt;/td>
&lt;td>&amp;ldquo;MY_VAR=&amp;lsquo;value with spaces&amp;rsquo;&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cache&lt;/td>
&lt;td>false&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cache-dir&lt;/td>
&lt;td>/cache&lt;/td>
&lt;td>需配合参数 &amp;ldquo;&amp;ndash;cache=true&amp;rdquo; 使用&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cache-repo&lt;/td>
&lt;td>-&lt;/td>
&lt;td>需配合参数 &amp;ldquo;&amp;ndash;cache=true&amp;rdquo; 使用&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cache-copy-layers&lt;/td>
&lt;td>-&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cache-run-layers&lt;/td>
&lt;td>true&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cache-ttl&lt;/td>
&lt;td>336h0m0s&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cleanup&lt;/td>
&lt;td>-&lt;/td>
&lt;td>完成时清理文件系统内容，不做清理的话，当前容器将会是 Dockerfile 构建后的结果&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>compressed-caching&lt;/td>
&lt;td>true&lt;/td>
&lt;td>压缩缓存层，以减少编译时间，但增加内存使用&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>context&lt;/td>
&lt;td>/workspace/&lt;/td>
&lt;td>指向 Dockerfile 文件路径&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>context-sub-path&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>custom-platform&lt;/td>
&lt;td>同宿主架构&lt;/td>
&lt;td>自定义构建的架构，如：linux/adm64，类型：docker build &amp;ndash;platform&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>destination&lt;/td>
&lt;td>-&lt;/td>
&lt;td>构建的容器镜像全名，可添加多个，上传到指定的仓库&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>digest-file&lt;/td>
&lt;td>/dev/termination-log&lt;/td>
&lt;td>用于接收构建镜像的信息&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>dockerfile&lt;/td>
&lt;td>Dockerfile&lt;/td>
&lt;td>使用哪个 Dockerfile 文件构建镜像&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>force&lt;/td>
&lt;td>-&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>force-build-metadata&lt;/td>
&lt;td>-&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>git&lt;/td>
&lt;td>branch=,single-branch=false,recurse-submodules=false&lt;/td>
&lt;td>如果编译上下问来自 git 仓库&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ignore-path&lt;/td>
&lt;td>-&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ignore-var-run&lt;/td>
&lt;td>true&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>image-fs-extract-retry&lt;/td>
&lt;td>-&lt;/td>
&lt;td>重试次数&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>image-name-tag-with-digest-file&lt;/td>
&lt;td>-&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>image-name-with-digest-file&lt;/td>
&lt;td>-&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>insecure&lt;/td>
&lt;td>false&lt;/td>
&lt;td>使用 HTTP 协议推送镜像至镜像中心&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>insecure-pull&lt;/td>
&lt;td>false&lt;/td>
&lt;td>使用 HTTP 协议拉取镜像&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>insecure-registry&lt;/td>
&lt;td>-&lt;/td>
&lt;td>使用 HTTP 协议的镜像中心列表，可添加多个&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>kaniko-dir&lt;/td>
&lt;td>/kaniko&lt;/td>
&lt;td>指向 kaniko 目录，优先级高于 &amp;ldquo;KANIKO_DIR&amp;rdquo; 环境变量&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>label&lt;/td>
&lt;td>-&lt;/td>
&lt;td>设置镜像标签&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>log-format&lt;/td>
&lt;td>color&lt;/td>
&lt;td>日志格式，可取：text, color, json&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>log-timestamp&lt;/td>
&lt;td>-&lt;/td>
&lt;td>日志时间戳&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>no-push&lt;/td>
&lt;td>-&lt;/td>
&lt;td>不上传至镜像中心&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>no-push-cache&lt;/td>
&lt;td>-&lt;/td>
&lt;td>不上传至镜像中心&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>oci-layout-path&lt;/td>
&lt;td>-&lt;/td>
&lt;td>存放 oci 格式的镜像路径&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>push-retry&lt;/td>
&lt;td>-&lt;/td>
&lt;td>上传镜像的重试次数&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>registry-certificate&lt;/td>
&lt;td>-&lt;/td>
&lt;td>使用 tls 认证镜像中心&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>registry-mirror&lt;/td>
&lt;td>-&lt;/td>
&lt;td>用于 pull 镜像使用的 mirror，如：docker.io&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>reproducible&lt;/td>
&lt;td>-&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>single-snapshot&lt;/td>
&lt;td>-&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>skip-tls-verify&lt;/td>
&lt;td>-&lt;/td>
&lt;td>push 镜像跳过 tls 验证&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>skip-tls-verify-pull&lt;/td>
&lt;td>-&lt;/td>
&lt;td>pull 镜像跳过 tls 验证&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>skip-tls-verify-registry&lt;/td>
&lt;td>-&lt;/td>
&lt;td>对指定镜像中心跳过 tls 验证&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>skip-unused-stages&lt;/td>
&lt;td>-&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>snapshot-mode&lt;/td>
&lt;td>full&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>tar-path&lt;/td>
&lt;td>-&lt;/td>
&lt;td>镜像以 tar 格式保存路径&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>target&lt;/td>
&lt;td>-&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>use-new-run&lt;/td>
&lt;td>-&lt;/td>
&lt;td>TODO;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>verbosity&lt;/td>
&lt;td>info&lt;/td>
&lt;td>日志级别：trace, debug, info, warn, error, fatal, panic&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="应用场景">应用场景&lt;/h2>
&lt;h3 id="启动进入-shell">启动进入 shell&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>docker run &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -i -t &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --rm &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --entrypoint /bin/sh &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> registry.cn-hangzhou.aliyuncs.com/kube-image-repo/kaniko:v1.9.1-debug
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="构建容器镜像">构建容器镜像&lt;/h3>
&lt;p>假设需要构建 &amp;ldquo;ccr.ccs.tencentyun.com/opsaid/test2:0.1.0&amp;rdquo; 镜像，则可使用以下指令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>docker run &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -v /tmp/coding/test2:/workspace &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> -v /tmp/docker/config.json:/kaniko/.docker/config.json:ro &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> registry.cn-hangzhou.aliyuncs.com/kube-image-repo/kaniko:v1.9.1 &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --dockerfile /workspace/Dockerfile &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --context /workspace &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --destination ccr.ccs.tencentyun.com/opsaid/test2:0.1.0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>脚本分析：&lt;/p>
&lt;ol>
&lt;li>应用代码&lt;/li>
&lt;/ol>
&lt;p>/workspace/Dockerfile 内容：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>添加 &amp;ldquo;ccr.ccs.tencentyun.com/opsaid&amp;rdquo; 镜像中心权限&lt;/li>
&lt;/ol>
&lt;p>见配置：/tmp/docker/config.json&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;auths&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;ccr.ccs.tencentyun.com&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#204a87;font-weight:bold">&amp;#34;auth&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;base64(username:password)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000;font-weight:bold">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>挂载至 kaniko 容器内 &amp;ldquo;/kaniko/.docker/config.json&amp;rdquo; 地址。如果您更改了 &amp;ldquo;kaniko&amp;rdquo; 镜像，导致变量 &amp;ldquo;$HOME&amp;rdquo; 非 “/kaniko&amp;quot;，则需要更改挂载的配置，否则 &amp;ldquo;/kaniko/executer&amp;rdquo; 会无法正确读取授权文件。&lt;/p></description></item><item><title>Docs: Multi Arch</title><link>https://opsaid.net/docs/platform-engineering/build-release/multi-arch/</link><pubDate>Fri, 14 Apr 2023 22:46:52 +0800</pubDate><guid>https://opsaid.net/docs/platform-engineering/build-release/multi-arch/</guid><description>
&lt;h2 id="简要概述">简要概述&lt;/h2>
&lt;p>如何构建多架构镜像&lt;/p></description></item><item><title>Docs: Fpm</title><link>https://opsaid.net/docs/platform-engineering/build-release/fpm/</link><pubDate>Thu, 08 Dec 2022 10:46:49 +0800</pubDate><guid>https://opsaid.net/docs/platform-engineering/build-release/fpm/</guid><description>
&lt;h2 id="简要概述">简要概述&lt;/h2>
&lt;p>实现各系统打包，如：rpm、deb 等&lt;/p>
&lt;p>&lt;a href="https://github.com/jordansissel/fpm">https://github.com/jordansissel/fpm&lt;/a>&lt;/p>
&lt;h2 id="安装部署">安装部署&lt;/h2>
&lt;ul>
&lt;li>ubuntu 20.04 示例&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>apt install -y ruby
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gem install fpm
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 打 rpm 包需要&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>apt install rpm
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 打 deb 包需要&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>apt install binutils
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>root@ubuntu:~# fpm --version
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>1.15.0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>root@ubuntu:~#
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>centos 7 示例&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 安装依赖的 ruby 环境&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>yum install -y ruby
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 查看 ruby 版本&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>root@lfheaplt gitlab-runner&lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># ruby --version&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ruby 2.0.0p648 &lt;span style="color:#ce5c00;font-weight:bold">(&lt;/span>2015-12-16&lt;span style="color:#ce5c00;font-weight:bold">)&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>x86_64-linux&lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ce5c00;font-weight:bold">[&lt;/span>root@lfheaplt gitlab-runner&lt;span style="color:#ce5c00;font-weight:bold">]&lt;/span>&lt;span style="color:#8f5902;font-style:italic">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 移除默认 sources&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gem &lt;span style="color:#204a87">source&lt;/span> --remove https://rubygems.org/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 添加阿里云 sources&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gem sources -a https://mirrors.aliyun.com/rubygems/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 安装 rvm&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -sSL https://get.rvm.io &lt;span style="color:#000;font-weight:bold">|&lt;/span> bash -s stable
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 升级 ruby&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>/usr/local/rvm/bin/rvm install 2.7
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre tabindex="0">&lt;code># 通过 gem 安装 fpm
gem install fpm
&lt;/code>&lt;/pre>&lt;h2 id="制作安装包">制作安装包&lt;/h2>
&lt;h3 id="rpm包">RPM包&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;/code>&lt;/pre>&lt;/div></description></item></channel></rss>