<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CICD on F嘉阳</title><link>https://blog.fjy8018.top/tags/cicd/</link><description>Recent content in CICD on F嘉阳</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sun, 04 Aug 2024 19:34:53 +0800</lastBuildDate><atom:link href="https://blog.fjy8018.top/tags/cicd/index.xml" rel="self" type="application/rss+xml"/><item><title>Kubesphere落地DevOps</title><link>https://blog.fjy8018.top/archives/273/</link><pubDate>Sat, 19 Jun 2021 22:16:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/273/</guid><description>&lt;h2 id="创建企业空间"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba%e4%bc%81%e4%b8%9a%e7%a9%ba%e9%97%b4" class="header-anchor"&gt;&lt;/a&gt;创建企业空间&#10;&lt;/h2&gt;&lt;p&gt;创建一个企业空间和一个帐户 (&lt;code&gt;project-admin&lt;/code&gt;)，必须邀请该帐户至该企业空间并赋予 &lt;code&gt;workspace-self-provisioner&lt;/code&gt; 角色。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623583200028" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623583200028.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;进入企业空间，切换到DevOps工程，点击创建&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623583256804" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623583256804.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;创建工程&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623583296345" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623583296345.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;h2 id="安装helm"&gt;&lt;a href="#%e5%ae%89%e8%a3%85helm" class="header-anchor"&gt;&lt;/a&gt;安装helm&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 &lt;span class="p"&gt;|&lt;/span&gt; bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="找不到环境变量报错"&gt;&lt;a href="#%e6%89%be%e4%b8%8d%e5%88%b0%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f%e6%8a%a5%e9%94%99" class="header-anchor"&gt;&lt;/a&gt;找不到环境变量报错&#10;&lt;/h3&gt;&lt;p&gt;安装helm遇到报错&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 &lt;span class="p"&gt;|&lt;/span&gt; bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; % Total % Received % Xferd Average Speed Time Time Time Current&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;unset&lt;/span&gt; -f pathmunge&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Dload Upload Total Spent Left Speed&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;100&lt;/span&gt; &lt;span class="m"&gt;11248&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt; &lt;span class="m"&gt;11248&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;61543&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; --:--:-- --:--:-- --:--:-- &lt;span class="m"&gt;61802&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Helm v3.6.0 is available. Changing from version v3.2.1.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Downloading https://get.helm.sh/helm-v3.6.0-linux-amd64.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Verifying checksum... Done.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Preparing to install helm into /usr/local/bin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;helm installed into /usr/local/bin/helm&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;helm not found. Is /usr/local/bin on your &lt;span class="nv"&gt;$PATH&lt;/span&gt;?&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Failed to install helm&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; For support, go to https://github.com/helm/helm.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;则需要配置环境变量&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vi /etc/profile&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 添加配置&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/bin:&lt;span class="nv"&gt;$PATH&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;source&lt;/span&gt; /etc/profile&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;验证&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ helm version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;version.BuildInfo&lt;span class="o"&gt;{&lt;/span&gt;Version:&lt;span class="s2"&gt;&amp;#34;v3.6.0&amp;#34;&lt;/span&gt;, GitCommit:&lt;span class="s2"&gt;&amp;#34;7f2df6467771a75f5646b7f12afb408590ed1755&amp;#34;&lt;/span&gt;, GitTreeState:&lt;span class="s2"&gt;&amp;#34;clean&amp;#34;&lt;/span&gt;, GoVersion:&lt;span class="s2"&gt;&amp;#34;go1.16.3&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="安装sonarqube"&gt;&lt;a href="#%e5%ae%89%e8%a3%85sonarqube" class="header-anchor"&gt;&lt;/a&gt;安装SonarQube&#10;&lt;/h2&gt;&lt;p&gt;执行以下命令安装 SonarQube 服务器&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ helm upgrade --install sonarqube sonarqube --repo https://charts.kubesphere.io/main -n kubesphere-devops-system --create-namespace --set service.type&lt;span class="o"&gt;=&lt;/span&gt;NodePort&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623589400716" class="gallery-image" data-flex-basis="903px" data-flex-grow="376" height="361" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623589400716.png" width="1359"&gt;&lt;/p&gt;&#10;&lt;p&gt;执行以下命令以获取 SonarQube NodePort&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;NODE_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;kubectl get --namespace kubesphere-devops-system -o &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{.spec.ports[0].nodePort}&amp;#34;&lt;/span&gt; services sonarqube-sonarqube&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;NODE_IP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;kubectl get nodes --namespace kubesphere-devops-system -o &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{.items[0].status.addresses[0].address}&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; http://&lt;span class="nv"&gt;$NODE_IP&lt;/span&gt;:&lt;span class="nv"&gt;$NODE_PORT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623589466239" class="gallery-image" data-flex-basis="1970px" data-flex-grow="821" height="166" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623589466239.png" width="1363"&gt;&lt;/p&gt;&#10;&lt;p&gt;此时可在kubesphere控制台中看到sonar服务&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623589521856" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.fjy8018.top/images/recovered/e160945c268d616ce126.png"&gt;&lt;/p&gt;&#10;&lt;h2 id="配置-sonarqube-服务器"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae-sonarqube-%e6%9c%8d%e5%8a%a1%e5%99%a8" class="header-anchor"&gt;&lt;/a&gt;配置 SonarQube 服务器&#10;&lt;/h2&gt;&lt;p&gt;访问地址，点击右上角的 &lt;strong&gt;Log in&lt;/strong&gt;，然后使用默认帐户 &lt;code&gt;admin/admin&lt;/code&gt; 登录。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623589484956" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.fjy8018.top/images/recovered/318f45c8e4470dac1fb4.png"&gt;&lt;/p&gt;&#10;&lt;h3 id="创建-sonarqube-管理员令牌-token"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba-sonarqube-%e7%ae%a1%e7%90%86%e5%91%98%e4%bb%a4%e7%89%8c-token" class="header-anchor"&gt;&lt;/a&gt;创建 SonarQube 管理员令牌 (Token)&#10;&lt;/h3&gt;&lt;p&gt;点击右上角字母 &lt;strong&gt;A&lt;/strong&gt;，然后从菜单中选择 &lt;strong&gt;My Account&lt;/strong&gt; 以转到 &lt;strong&gt;Profile&lt;/strong&gt; 页面。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623589658291" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1574" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623589658291.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;生成token&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623589677983" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1574" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623589677983.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;h3 id="创建-webhook-服务器"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba-webhook-%e6%9c%8d%e5%8a%a1%e5%99%a8" class="header-anchor"&gt;&lt;/a&gt;创建 Webhook 服务器&#10;&lt;/h3&gt;&lt;p&gt;执行以下命令获取 SonarQube Webhook 的地址。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;NODE_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;kubectl get --namespace kubesphere-devops-system -o &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{.spec.ports[0].nodePort}&amp;#34;&lt;/span&gt; services ks-jenkins&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;NODE_IP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;kubectl get nodes --namespace kubesphere-devops-system -o &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{.items[0].status.addresses[0].address}&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; http://&lt;span class="nv"&gt;$NODE_IP&lt;/span&gt;:&lt;span class="nv"&gt;$NODE_PORT&lt;/span&gt;/sonarqube-webhook/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623589732948" class="gallery-image" data-flex-basis="1768px" data-flex-grow="736" height="185" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623589732948.png" width="1363"&gt;&lt;/p&gt;&#10;&lt;p&gt;依次点击 &lt;strong&gt;Administration&lt;/strong&gt;、&lt;strong&gt;Configuration&lt;/strong&gt; 和 &lt;strong&gt;Webhooks&lt;/strong&gt; 创建一个 Webhook。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623589828830" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.fjy8018.top/images/recovered/5d85d8f656afd2acd16e.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;点击 &lt;strong&gt;Create&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;由于webhook都通过内部网络调用，故可以使用内部网络地址&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623589887169" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.fjy8018.top/images/recovered/8d5a1ac24ac1f38e34a5.png"&gt;&lt;/p&gt;&#10;&lt;h3 id="将-sonarqube-配置添加到-ks-installer"&gt;&lt;a href="#%e5%b0%86-sonarqube-%e9%85%8d%e7%bd%ae%e6%b7%bb%e5%8a%a0%e5%88%b0-ks-installer" class="header-anchor"&gt;&lt;/a&gt;将 SonarQube 配置添加到 ks-installer&#10;&lt;/h3&gt;&lt;p&gt;执行以下命令编辑 &lt;code&gt;ks-installer&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl edit cc -n kubesphere-system ks-installer&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;搜寻至 &lt;code&gt;devops&lt;/code&gt;。添加字段 &lt;code&gt;sonarqube&lt;/code&gt; 并在其下方指定 &lt;code&gt;externalSonarUrl&lt;/code&gt; 和 &lt;code&gt;externalSonarToken&lt;/code&gt;。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;devops&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;jenkinsJavaOpts_MaxRAM&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;2g&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;jenkinsJavaOpts_Xms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;512m&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;jenkinsJavaOpts_Xmx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;512m&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;jenkinsMemoryLim&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;2Gi&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;jenkinsMemoryReq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;1500Mi&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;jenkinsVolumeSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;8Gi&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sonarqube&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;externalSonarUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://10.170.0.5:32108&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;externalSonarToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;c6a6e2e15a9d52e30b744df0eef4c639bbea88a1&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;完成操作后保存此文件。&lt;/p&gt;&#10;&lt;h3 id="将-sonarqube-服务器添加至-jenkins"&gt;&lt;a href="#%e5%b0%86-sonarqube-%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%b7%bb%e5%8a%a0%e8%87%b3-jenkins" class="header-anchor"&gt;&lt;/a&gt;将 SonarQube 服务器添加至 Jenkins&#10;&lt;/h3&gt;&lt;p&gt;执行以下命令获取 Jenkins 的地址。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;NODE_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;kubectl get --namespace kubesphere-devops-system -o &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{.spec.ports[0].nodePort}&amp;#34;&lt;/span&gt; services ks-jenkins&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;NODE_IP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;kubectl get nodes --namespace kubesphere-devops-system -o &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{.items[0].status.addresses[0].address}&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; http://&lt;span class="nv"&gt;$NODE_IP&lt;/span&gt;:&lt;span class="nv"&gt;$NODE_PORT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623590243987" class="gallery-image" data-flex-basis="2006px" data-flex-grow="836" height="163" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623590243987.png" width="1363"&gt;&lt;/p&gt;&#10;&lt;p&gt;使用地址 &lt;code&gt;http://{$Public IP}:30180&lt;/code&gt; 访问 Jenkins。安装 KubeSphere 时，默认情况下也会安装 Jenkins 仪表板。此外，Jenkins 还配置有 KubeSphere LDAP，这意味着您可以直接使用 KubeSphere 帐户（例如 &lt;code&gt;admin/P@88w0rd&lt;/code&gt;）登录 Jenkins。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623590218736" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1574" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623590218736.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;使用kubesphere admin账户登录&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623590300294" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1574" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623590300294.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;前往&lt;strong&gt;系统管理&lt;/strong&gt;下的 &lt;strong&gt;Manage Credentials&lt;/strong&gt; 并点击 &lt;strong&gt;Stores scoped to Jenkins&lt;/strong&gt; 下的 &lt;strong&gt;Jenkins&lt;/strong&gt;，再点击&lt;strong&gt;全局凭据 (unrestricted)&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623590813853" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1574" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623590813853.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;点击左侧导航栏的&lt;strong&gt;添加凭据&lt;/strong&gt;，用 SonarQube 管理员令牌添加凭证&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623590901716" class="gallery-image" data-flex-basis="555px" data-flex-grow="231" height="832" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623590901716.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;点击左侧的&lt;strong&gt;系统管理&lt;/strong&gt;，向下翻页找到并点击&lt;strong&gt;系统配置&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623590362224" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1574" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623590362224.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;搜寻到 &lt;strong&gt;SonarQube servers&lt;/strong&gt;，然后点击 &lt;strong&gt;Add SonarQube&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623590399204" class="gallery-image" data-flex-basis="629px" data-flex-grow="262" height="733" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623590399204.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;添加sonar服务器地址和名称，点击&lt;strong&gt;应用&lt;/strong&gt;完成操作。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623590948756" class="gallery-image" data-flex-basis="400px" data-flex-grow="167" height="1152" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623590948756.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;h3 id="将-sonarqubeurl-添加到-kubesphere-控制台"&gt;&lt;a href="#%e5%b0%86-sonarqubeurl-%e6%b7%bb%e5%8a%a0%e5%88%b0-kubesphere-%e6%8e%a7%e5%88%b6%e5%8f%b0" class="header-anchor"&gt;&lt;/a&gt;将 sonarqubeURL 添加到 KubeSphere 控制台&#10;&lt;/h3&gt;&lt;p&gt;指定 &lt;code&gt;sonarqubeURL&lt;/code&gt;，以便可以直接从 KubeSphere 控制台访问 SonarQube。&lt;/p&gt;&#10;&lt;p&gt;执行以下命令：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl edit cm -n kubesphere-system ks-console-config&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;搜寻到 &lt;code&gt;client&lt;/code&gt;，添加 &lt;code&gt;devops&lt;/code&gt; 字段并指定 &lt;code&gt;sonarqubeURL&lt;/code&gt;。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kubesphere&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v3.1.0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kubernetes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1.20.4&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;openpitrix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v0.3.5&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enableKubeConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;devops&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sonarqubeURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://34.92.90.181:32108&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623591094844" class="gallery-image" data-flex-basis="327px" data-flex-grow="136" height="1000" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623591094844.png" width="1363"&gt;&lt;/p&gt;&#10;&lt;h3 id="重启服务"&gt;&lt;a href="#%e9%87%8d%e5%90%af%e6%9c%8d%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;重启服务&#10;&lt;/h3&gt;&lt;p&gt;执行以下命令。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl -n kubesphere-system rollout restart deploy ks-apiserver&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl -n kubesphere-system rollout restart deploy ks-console&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="为新工程创建-sonarqube-token"&gt;&lt;a href="#%e4%b8%ba%e6%96%b0%e5%b7%a5%e7%a8%8b%e5%88%9b%e5%bb%ba-sonarqube-token" class="header-anchor"&gt;&lt;/a&gt;为新工程创建 SonarQube Token&#10;&lt;/h2&gt;&lt;p&gt;创建一个 SonarQube 令牌，以便您的流水线可以在运行时与 SonarQube 通信。&lt;/p&gt;&#10;&lt;p&gt;在 SonarQube 控制台上，点击 &lt;strong&gt;Create new project&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623591255909" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1574" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623591255909.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;设置工程名称&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623591269495" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1574" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623591269495.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;生成token&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623591326774" class="gallery-image" data-flex-basis="459px" data-flex-grow="191" height="1005" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623591326774.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;创建令牌后，点击 &lt;strong&gt;Continue&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623591357570" class="gallery-image" data-flex-basis="515px" data-flex-grow="214" height="895" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623591357570.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;分别选择 &lt;strong&gt;Java&lt;/strong&gt; 和 &lt;strong&gt;Maven&lt;/strong&gt;。复制下图所示绿色框中的序列号，如果要在流水线中使用，则需要在&lt;a class="link" href="https://kubesphere.io/zh/docs/devops-user-guide/how-to-use/credential-management/#%e5%88%9b%e5%bb%ba%e5%87%ad%e8%af%81" target="_blank" rel="noopener"&#10; &gt;凭证&lt;/a&gt;中添加此序列号。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623591381678" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1574" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623591381678.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;h2 id="创建流水线工程"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba%e6%b5%81%e6%b0%b4%e7%ba%bf%e5%b7%a5%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;创建流水线工程&#10;&lt;/h2&gt;&lt;h3 id="创建凭证"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba%e5%87%ad%e8%af%81" class="header-anchor"&gt;&lt;/a&gt;创建凭证&#10;&lt;/h3&gt;&lt;p&gt;登录 KubeSphere 控制台。转到 DevOps 工程，在&lt;strong&gt;工程管理&lt;/strong&gt;下的&lt;strong&gt;凭证&lt;/strong&gt;页面创建以下凭证。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;凭证 ID&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;类型&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;用途&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;dockerhub-id&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;帐户凭证&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Docker Hub&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;demo-kubeconfig&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;kubeconfig&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Kubernetes&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;demo-kubeconfig&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623591543502" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623591543502.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;dockerhub-id&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623591726548" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623591726548.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;创建一个凭证 ID (&lt;code&gt;sonar-token&lt;/code&gt;)&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623591882055" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623591882055.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;列表中看到已创建的三个凭证。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623591917707" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623591917707.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;h3 id="创建流水线"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba%e6%b5%81%e6%b0%b4%e7%ba%bf" class="header-anchor"&gt;&lt;/a&gt;创建流水线&#10;&lt;/h3&gt;&lt;p&gt;在&lt;strong&gt;流水线&lt;/strong&gt;页面点击&lt;strong&gt;创建&lt;/strong&gt;，为了使用图形化流水线搭建，不在此处引用代码仓库，直接点击下一步&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623592917931" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623592917931.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;保持默认配置，点击创建&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623592981578" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623592981578.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;创建成功&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623592994758" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623592994758.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;进入流水线，点击编辑&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623593005853" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623593005853.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;此时选择CICD模板&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623593042443" class="gallery-image" data-flex-basis="438px" data-flex-grow="182" height="2100" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623593042443.png" width="3840"&gt;&lt;/p&gt;&#10;&lt;p&gt;可视化编辑流水线&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623593102065" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623593102065.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;编辑后运行&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623593508711" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623593508711.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;流水线支持交互式操作&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623664726853" class="gallery-image" data-flex-basis="771px" data-flex-grow="321" height="1195" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623664726853.png" width="3840"&gt;&lt;/p&gt;&#10;&lt;h2 id="在-kubesphere-控制台查看结果"&gt;&lt;a href="#%e5%9c%a8-kubesphere-%e6%8e%a7%e5%88%b6%e5%8f%b0%e6%9f%a5%e7%9c%8b%e7%bb%93%e6%9e%9c" class="header-anchor"&gt;&lt;/a&gt;在 KubeSphere 控制台查看结果&#10;&lt;/h2&gt;&lt;p&gt;流水线执行成功后，即可查看到代码质量标签&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623664520315" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1573" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623664520315.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;sonar控制台也可以查看对应结果&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623664594650" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1573" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623664594650.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;jenkins视图&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623664630635" class="gallery-image" data-flex-basis="438px" data-flex-grow="182" height="2100" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623664630635.png" width="3840"&gt;&lt;/p&gt;&#10;&lt;p&gt;blue ocean&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623664649276" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1573" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623664649276.png" width="1924"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1623664672153" class="gallery-image" data-flex-basis="293px" data-flex-grow="122" height="1573" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1623664672153.png" width="1924"&gt;&lt;/p&gt;&#10;</description></item><item><title>GitHub DevOps工作流构建Java项目并上传到DockerHub</title><link>https://blog.fjy8018.top/archives/265/</link><pubDate>Sun, 07 Feb 2021 11:58:43 +0800</pubDate><guid>https://blog.fjy8018.top/archives/265/</guid><description>&lt;h2 id="工程准备"&gt;&lt;a href="#%e5%b7%a5%e7%a8%8b%e5%87%86%e5%a4%87" class="header-anchor"&gt;&lt;/a&gt;工程准备&#10;&lt;/h2&gt;&lt;p&gt;此处使用fork自&lt;code&gt;alibaba/Sentinel&lt;/code&gt;的&lt;code&gt;FJiayang/Sentinel&lt;/code&gt;项目实践&lt;/p&gt;&#10;&lt;p&gt;工程地址&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://github.com/FJiayang/Sentinel" target="_blank" rel="noopener"&#10; &gt;Sentinel&lt;/a&gt; — Sentinel仓库源码&lt;/p&gt;&#10;&lt;h2 id="准备dockerfile"&gt;&lt;a href="#%e5%87%86%e5%a4%87dockerfile" class="header-anchor"&gt;&lt;/a&gt;准备Dockerfile&#10;&lt;/h2&gt;&lt;p&gt;该工程为标准Java项目，故准备好的&lt;code&gt;Dockerfile&lt;/code&gt;文件如下&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;anapsix/alpine-java:8_server-jre_unlimited&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;MAINTAINER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;fjy8018@gmail.com&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENV&lt;/span&gt; PARAM &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENV&lt;/span&gt; VERSION 1.8.0&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; mkdir -p /sentinel&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/sentinel&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ADD&lt;/span&gt; ./sentinel-dashboard/target/sentinel-dashboard.jar ./app-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.jar&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 设置时区，默认为UTC&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Asia/Shanghai&amp;#39;&lt;/span&gt; &amp;gt; /etc/timezone&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;java&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${PARAM}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-jar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;app-${VERSION}.jar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="编写github工作流"&gt;&lt;a href="#%e7%bc%96%e5%86%99github%e5%b7%a5%e4%bd%9c%e6%b5%81" class="header-anchor"&gt;&lt;/a&gt;编写GitHub工作流&#10;&lt;/h2&gt;&lt;p&gt;GitHub DevOps工作流又叫GitHub Actions 是2019年末推出的自动化CICD持续集成工作流，有详细的样例文档&lt;/p&gt;&#10;&lt;p&gt;此处参考以下文档编写&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://docs.github.com/cn/actions/guides/building-and-testing-java-with-maven" target="_blank" rel="noopener"&#10; &gt;使用 Maven 构建和测试 Java&lt;/a&gt; — GitHub Actions 指南&lt;/p&gt;&#10;&lt;h3 id="安全配置"&gt;&lt;a href="#%e5%ae%89%e5%85%a8%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;安全配置&#10;&lt;/h3&gt;&lt;p&gt;由于需要建构建后的制品推送到DockerHub中，但又不能在工作流中直接使用用户名和密码登陆，故还需要配置环境变量&lt;/p&gt;&#10;&lt;p&gt;在DockerHub中新增秘钥&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1612612278354" class="gallery-image" data-flex-basis="388px" data-flex-grow="161" height="831" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1612612278354.png" width="1346"&gt;&lt;/p&gt;&#10;&lt;p&gt;在构建工程的设置中新增用户名和密码变量&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1612612340227" class="gallery-image" data-flex-basis="470px" data-flex-grow="196" height="845" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1612612340227.png" width="1658"&gt;&lt;/p&gt;&#10;&lt;p&gt;编写后的工作流如下&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Publish Docker image&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;push]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ubuntu-latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/checkout@v2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Set up Maven Central Repository&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/setup-java@v1&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;java-version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1.8&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Publish package&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;mvn --batch-mode clean package -Dmaven.test.skip=true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Push to Docker Hub&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker/build-push-action@v1&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ secrets.DOCKER_USERNAME }}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ secrets.DOCKER_PASSWORD }}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;fjy8018/sentinel&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tag_with_ref&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="触发构建"&gt;&lt;a href="#%e8%a7%a6%e5%8f%91%e6%9e%84%e5%bb%ba" class="header-anchor"&gt;&lt;/a&gt;触发构建&#10;&lt;/h2&gt;&lt;p&gt;当前的触发方式配置为&lt;code&gt;PUSH&lt;/code&gt;，修改好文件后会自动触发流水线工作&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1612612585264" class="gallery-image" data-flex-basis="491px" data-flex-grow="204" height="938" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1612612585264.png" width="1920"&gt;&lt;/p&gt;&#10;&lt;p&gt;Maven打包，速度很快&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1612612545382" class="gallery-image" data-flex-basis="492px" data-flex-grow="205" height="936" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1612612545382.png" width="1920"&gt;&lt;/p&gt;&#10;&lt;p&gt;打包完成&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1612612706399" class="gallery-image" data-flex-basis="491px" data-flex-grow="204" height="937" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1612612706399.png" width="1920"&gt;&lt;/p&gt;&#10;&lt;h2 id="检查结果"&gt;&lt;a href="#%e6%a3%80%e6%9f%a5%e7%bb%93%e6%9e%9c" class="header-anchor"&gt;&lt;/a&gt;检查结果&#10;&lt;/h2&gt;&lt;p&gt;登录到DockerHub中检查推送结果，可见成功推送&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1612612761551" class="gallery-image" data-flex-basis="921px" data-flex-grow="384" height="500" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1612612761551.png" width="1920"&gt;&lt;/p&gt;&#10;&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结&#10;&lt;/h2&gt;&lt;p&gt;整体来看，GitHub工作流效率高，文档齐全，编码上手速度快，相比GitLab CICD和DockerHub CICD来说，GitHub CICD配置更加简单、友好和高效。&lt;/p&gt;&#10;</description></item><item><title>k8s环境下GitLab+Helm+GitLab Runner Java项目CICD落地实践</title><link>https://blog.fjy8018.top/archives/227/</link><pubDate>Wed, 27 Nov 2019 10:24:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/227/</guid><description>&lt;img src="https://s2.ax1x.com/2019/11/27/Qpybmn.png" alt="Featured image of post k8s环境下GitLab+Helm+GitLab Runner Java项目CICD落地实践" /&gt;&lt;h2 id="背景"&gt;&lt;a href="#%e8%83%8c%e6%99%af" class="header-anchor"&gt;&lt;/a&gt;背景&#10;&lt;/h2&gt;&lt;p&gt;目前使用5台服务器搭建了&lt;code&gt;Kubernetes&lt;/code&gt;集群环境，监控、日志采集均已落地，业务也手工迁移到集群中顺利运行，故需要将原本基于原生&lt;code&gt;docker&lt;/code&gt;环境的CICD流程迁移到&lt;code&gt;Kubernetes&lt;/code&gt;集群中&lt;/p&gt;&#10;&lt;h2 id="优势"&gt;&lt;a href="#%e4%bc%98%e5%8a%bf" class="header-anchor"&gt;&lt;/a&gt;优势&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Kubernetes&lt;/code&gt;集群实现CICD有几个显著优势&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;Deployment&lt;/code&gt; 天然支持滚动部署、结合其他&lt;code&gt;Kubernetes&lt;/code&gt;特性还能实现蓝绿部署、金丝雀部署等&lt;/li&gt;&#10;&lt;li&gt;新版本的&lt;code&gt;GitLab&lt;/code&gt;与&lt;code&gt;GitLab Runner&lt;/code&gt;天然支持&lt;code&gt;Kubernetes&lt;/code&gt;集群，支持&lt;code&gt;runner&lt;/code&gt;自动伸缩，减小资源占用&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="环境"&gt;&lt;a href="#%e7%8e%af%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;环境&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Kubernetes&lt;/code&gt;版本：1.14&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;GitLab&lt;/code&gt;版本：12.2.5&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;GitLab-Runner&lt;/code&gt;版本：12.1.0&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;Docker&lt;/code&gt;环境版本：17.03.1&lt;/p&gt;&#10;&lt;h2 id="gitlab-runner部署"&gt;&lt;a href="#gitlab-runner%e9%83%a8%e7%bd%b2" class="header-anchor"&gt;&lt;/a&gt;GitLab-Runner部署&#10;&lt;/h2&gt;&lt;h3 id="配置介绍"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae%e4%bb%8b%e7%bb%8d" class="header-anchor"&gt;&lt;/a&gt;配置介绍&#10;&lt;/h3&gt;&lt;p&gt;原始环境的&lt;code&gt;gitlab runner&lt;/code&gt;通过手动执行官网提供的注册命令和启动命令，分成两部部署，需要较多的手工操作，而在&lt;code&gt;Kubernetes&lt;/code&gt;中，其支持使用&lt;code&gt;Helm&lt;/code&gt;一键部署，官方文档如下&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/install/%60Kubernetes%60.html" target="_blank" rel="noopener"&#10; &gt;GitLab Runner Helm Chart&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;其实官方文档的指引并不清晰，许多配置在文档中没有介绍用法，推荐去其源码仓库查看详细的参数使用文档&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/executors/%60Kubernetes%60.md#the-keywords" target="_blank" rel="noopener"&#10; &gt;The Kubernetes executor&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;其中介绍了几个关键配置，在后面修改工程的&lt;code&gt;ci&lt;/code&gt;配置文件时会用到&lt;/p&gt;&#10;&lt;h4 id="使用dind方式构建已经不再推荐"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8dind%e6%96%b9%e5%bc%8f%e6%9e%84%e5%bb%ba%e5%b7%b2%e7%bb%8f%e4%b8%8d%e5%86%8d%e6%8e%a8%e8%8d%90" class="header-anchor"&gt;&lt;/a&gt;使用DinD方式构建已经不再推荐&#10;&lt;/h4&gt;&lt;p&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#use-docker-in-docker-workflow-with-docker-executor" target="_blank" rel="noopener"&#10; &gt;官方文档&lt;/a&gt;介绍&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;h3 id="use-docker-in-docker-workflow-with-docker-executor"&gt;&lt;a href="#use-docker-in-docker-workflow-with-docker-executor" class="header-anchor"&gt;&lt;/a&gt;Use docker-in-docker workflow with Docker executor&#10;&lt;/h3&gt;&lt;p&gt;The second approach is to use the special docker-in-docker (dind) &lt;a class="link" href="https://hub.docker.com/_/docker/" target="_blank" rel="noopener"&#10; &gt;Docker image&lt;/a&gt; with all tools installed (&lt;code&gt;docker&lt;/code&gt;) and run the job script in context of that image in privileged mode.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;docker-compose&lt;/code&gt; is not part of docker-in-docker (dind). To use &lt;code&gt;docker-compose&lt;/code&gt; in your CI builds, follow the &lt;code&gt;docker-compose&lt;/code&gt; &lt;a class="link" href="https://docs.docker.com/compose/install/" target="_blank" rel="noopener"&#10; &gt;installation instructions&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Danger:&lt;/strong&gt; By enabling &lt;code&gt;--docker-privileged&lt;/code&gt;, you are effectively disabling all of the security mechanisms of containers and exposing your host to privilege escalation which can lead to container breakout. For more information, check out the official Docker documentation on &lt;a class="link" href="https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities" target="_blank" rel="noopener"&#10; &gt;Runtime privilege and Linux capabilities&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Docker-in-Docker works well, and is the recommended configuration, but it is not without its own challenges:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;When using docker-in-docker, each job is in a clean environment without the past history. Concurrent jobs work fine because every build gets it’s own instance of Docker engine so they won’t conflict with each other. But this also means jobs can be slower because there’s no caching of layers.&lt;/li&gt;&#10;&lt;li&gt;By default, Docker 17.09 and higher uses &lt;code&gt;--storage-driver overlay2&lt;/code&gt; which is the recommended storage driver. See &lt;a class="link" href="https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#using-the-overlayfs-driver" target="_blank" rel="noopener"&#10; &gt;Using the overlayfs driver&lt;/a&gt; for details.&lt;/li&gt;&#10;&lt;li&gt;Since the &lt;code&gt;docker:19.03.1-dind&lt;/code&gt; container and the Runner container don’t share their root filesystem, the job’s working directory can be used as a mount point for child containers. For example, if you have files you want to share with a child container, you may create a subdirectory under &lt;code&gt;/builds/$CI_PROJECT_PATH&lt;/code&gt; and use it as your mount point (for a more thorough explanation, check &lt;a class="link" href="https://gitlab.com/gitlab-org/gitlab-foss/issues/41227" target="_blank" rel="noopener"&#10; &gt;issue #41227&lt;/a&gt;):&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;总之使用&lt;code&gt;DinD&lt;/code&gt;进行容器构建并非不可行，但面临许多问题，例如使用&lt;code&gt;overlay2&lt;/code&gt;网络需要Docker版本高于 17.09&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;h3 id="using-dockerdind"&gt;&lt;a href="#using-dockerdind" class="header-anchor"&gt;&lt;/a&gt;Using &lt;code&gt;docker:dind&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;Running the &lt;code&gt;docker:dind&lt;/code&gt; also known as the &lt;code&gt;docker-in-docker&lt;/code&gt; image is also possible but sadly needs the containers to be run in privileged mode. If you&amp;rsquo;re willing to take that risk other problems will arise that might not seem as straight forward at first glance. Because the docker daemon is started as a &lt;code&gt;service&lt;/code&gt; usually in your &lt;code&gt;.gitlab-ci.yaml&lt;/code&gt; it will be run as a separate container in your Pod. Basically containers in Pods only share volumes assigned to them and an IP address by which they can reach each other using &lt;code&gt;localhost&lt;/code&gt;. &lt;code&gt;/var/run/docker.sock&lt;/code&gt; is not shared by the &lt;code&gt;docker:dind&lt;/code&gt; container and the &lt;code&gt;docker&lt;/code&gt; binary tries to use it by default.&lt;/p&gt;&#10;&lt;p&gt;To overwrite this and make the client use TCP to contact the Docker daemon, in the other container, be sure to include the environment variables of the build container:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;DOCKER_HOST=tcp://localhost:2375&lt;/code&gt; for no TLS connection.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;DOCKER_HOST=tcp://localhost:2376&lt;/code&gt; for TLS connection.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Make sure to configure those properly. As of Docker 19.03, TLS is enabled by default but it requires mapping certificates to your client. You can enable non-TLS connection for DIND or mount certificates as described in &lt;a class="link" href="https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#use-docker-in-docker-workflow-with-docker-executor" target="_blank" rel="noopener"&#10; &gt;&lt;strong&gt;Use Docker In Docker Workflow wiht Docker executor&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;在Docker 19.03.1版本之后默认开启了&lt;code&gt;TLS&lt;/code&gt;配置，在构建的环境变量中需要声明，否则报连接不上&lt;code&gt;docker&lt;/code&gt;的错误，并且使用&lt;code&gt;DinD&lt;/code&gt;构建需要&lt;code&gt;runner&lt;/code&gt;开启特权模式，以访问主机的资源，并且由于使用了特权模式，在&lt;code&gt;Pod&lt;/code&gt;中对&lt;code&gt;runner&lt;/code&gt;需要使用的资源限制将失效&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1574777453616" class="gallery-image" data-flex-basis="1465px" data-flex-grow="610" height="104" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1574777453616.png" width="635"&gt;&lt;/p&gt;&#10;&lt;h4 id="使用kaniko构建docker镜像"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8kaniko%e6%9e%84%e5%bb%badocker%e9%95%9c%e5%83%8f" class="header-anchor"&gt;&lt;/a&gt;使用Kaniko构建Docker镜像&#10;&lt;/h4&gt;&lt;p&gt;目前官方提供另一种方式在&lt;code&gt;docker&lt;/code&gt;容器中构建并推送镜像，实现更加优雅，可以实现无缝迁移，那就是&lt;code&gt;kaniko&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/docker/using_kaniko.html" target="_blank" rel="noopener"&#10; &gt;Building a Docker image with kaniko&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;其优势官网描述如下&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;在Kubernetes集群中构建Docker映像的另一种方法是使用&lt;a class="link" href="https://github.com/GoogleContainerTools/kaniko" target="_blank" rel="noopener"&#10; &gt;kaniko&lt;/a&gt;。iko子&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;允许您构建没有特权访问权限的映像。&lt;/li&gt;&#10;&lt;li&gt;无需Docker守护程序即可工作。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;在后面的实践中会使用两种方式构建Docker镜像，可根据实际情况选择&lt;/p&gt;&#10;&lt;h3 id="使用helm部署"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8helm%e9%83%a8%e7%bd%b2" class="header-anchor"&gt;&lt;/a&gt;使用Helm部署&#10;&lt;/h3&gt;&lt;p&gt;拉取&lt;code&gt;Helm&lt;/code&gt; &lt;code&gt;Gitlab-Runner&lt;/code&gt;仓库到本地，修改配置&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitlab.com/gitlab-org/charts/gitlab-runner" target="_blank" rel="noopener"&#10; &gt;GitLab Runner&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;将原有的&lt;code&gt;gitlab-runner&lt;/code&gt;配置迁移到&lt;code&gt;Helm&lt;/code&gt;中，迁移后如下&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;alpine-v12.1.0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;IfNotPresent&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;gitlabUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://gitlab.fjy8018.top/&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;runnerRegistrationToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;***&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;unregisterRunners&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;terminationGracePeriodSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3600&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;concurrent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;checkInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;rbac&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;create&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;clusterWideAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;listenPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9090&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;runners&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ubuntu:16.04&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;imagePullSecrets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;registry-secret&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;locked&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;k8s&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;runUntagged&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;privileged&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;pollTimeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;180&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;outputLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4096&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{}&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;builds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{}&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{}&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;helpers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{}&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;limits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;2048Mi&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;1500m&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;128Mi&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;200m&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;affinity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{}&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;nodeSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{}&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;tolerations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hostAliases&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;192.168.1.13&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hostnames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;gitlab.fjy8018.top&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;192.168.1.30&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hostnames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;harbor.fjy8018.top&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;podAnnotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{}&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中配置了私钥、内网&lt;code&gt;harbor&lt;/code&gt;地址、&lt;code&gt;harbor&lt;/code&gt;拉取资源私钥，资源限制策略&lt;/p&gt;&#10;&lt;h4 id="gitlab-runner选择可能导致的坑"&gt;&lt;a href="#gitlab-runner%e9%80%89%e6%8b%a9%e5%8f%af%e8%83%bd%e5%af%bc%e8%87%b4%e7%9a%84%e5%9d%91" class="header-anchor"&gt;&lt;/a&gt;GitLab-Runner选择可能导致的坑&#10;&lt;/h4&gt;&lt;p&gt;选择&lt;code&gt;runner&lt;/code&gt;镜像为&lt;code&gt;alpine-v12.1.0&lt;/code&gt;，这一点单独说一下，目前最新的runner版本为12.5.0，但其有许多问题，&lt;code&gt;alpine&lt;/code&gt;新版镜像在&lt;code&gt;Kubernetes&lt;/code&gt;中间断发生无法解析&lt;code&gt;DNS&lt;/code&gt;的问题，反映到&lt;code&gt;GitLab-Runner&lt;/code&gt;中就是&lt;code&gt;Could not resolve host&lt;/code&gt;和&lt;code&gt;server misbehaving&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1574778107416" class="gallery-image" data-flex-basis="2018px" data-flex-grow="840" height="161" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1574778107416.png" width="1354"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1574778146693" class="gallery-image" data-flex-basis="2171px" data-flex-grow="904" height="108" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1574778146693.png" width="977"&gt;&lt;/p&gt;&#10;&lt;p&gt;查阅解决方法&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1574777890021" class="gallery-image" data-flex-basis="232px" data-flex-grow="96" height="898" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1574777890021.png" width="871"&gt;&lt;/p&gt;&#10;&lt;p&gt;通过查询发现，其官方仓库还有多个相关issue没有关闭&lt;/p&gt;&#10;&lt;p&gt;官方gitlab：&lt;a class="link" href="https://gitlab.com/gitlab-org/charts/gitlab-runner/issues/96" target="_blank" rel="noopener"&#10; &gt;Kubernetes runner: Could not resolve host&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;stackoverflow：&lt;a class="link" href="https://stackoverflow.com/questions/57049548/gitlab-runner-is-not-able-to-resolve-dns-of-gitlab-server" target="_blank" rel="noopener"&#10; &gt;Gitlab Runner is not able to resolve DNS of Gitlab Server&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;给出的解决方案无一例外都是降级到alpine-v12.1.0&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;We had same issue for couple of days. We tried change CoreDNS config, move runners to different k8s cluster and so on. Finally today i checked my personal runner and found that i&amp;rsquo;m using different version. Runners in cluster had &lt;code&gt;gitlab/gitlab-runner:alpine-v12.3.0&lt;/code&gt;, when mine had &lt;code&gt;gitlab/gitlab-runner:alpine-v12.0.1&lt;/code&gt;. We added line&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;gitlab/gitlab-runner:alpine-v12.1.0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;in &lt;code&gt;values.yaml&lt;/code&gt; and this solved problem for us&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;其问题的根源应该在于alpine基础镜像对Kubernetes 集群支持有问题，&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://github.com/%60Kubernetes%60/%60Kubernetes%60/issues/64924" target="_blank" rel="noopener"&#10; &gt;ndots breaks DNS resolving #64924&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1574778408166" class="gallery-image" data-flex-basis="722px" data-flex-grow="300" height="110" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1574778408166.png" width="331"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1574778416868" class="gallery-image" data-flex-basis="645px" data-flex-grow="269" height="126" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1574778416868.png" width="339"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;docker-alpine&lt;/code&gt;仓库对应也有未关闭的&lt;code&gt;issue&lt;/code&gt;，其中就提到了关于&lt;code&gt;DNS&lt;/code&gt;解析超时和异常的问题&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://github.com/gliderlabs/docker-alpine/issues/255" target="_blank" rel="noopener"&#10; &gt;DNS Issue #255&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1574778470283" class="gallery-image" data-flex-basis="312px" data-flex-grow="130" height="607" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1574778470283.png" width="791"&gt;&lt;/p&gt;&#10;&lt;h4 id="安装"&gt;&lt;a href="#%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;安装&#10;&lt;/h4&gt;&lt;p&gt;一行命令安装即可&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ helm install /root/gitlab-runner/ --name k8s-gitlab-runner --namespace gitlab-runner&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出如下&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME: k8s-gitlab-runner&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LAST DEPLOYED: Tue Nov &lt;span class="m"&gt;26&lt;/span&gt; 21:51:57 &lt;span class="m"&gt;2019&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAMESPACE: gitlab-runner&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;STATUS: DEPLOYED&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RESOURCES:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;==&lt;/span&gt;&amp;gt; v1/ConfigMap&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME DATA AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k8s-gitlab-runner-gitlab-runner &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="nv"&gt;0s&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;==&lt;/span&gt;&amp;gt; v1/Deployment&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME READY UP-TO-DATE AVAILABLE AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k8s-gitlab-runner-gitlab-runner 0/1 &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nv"&gt;0s&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;==&lt;/span&gt;&amp;gt; v1/Pod&lt;span class="o"&gt;(&lt;/span&gt;related&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME READY STATUS RESTARTS AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k8s-gitlab-runner-gitlab-runner-744d598997-xwh92 0/1 Pending &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nv"&gt;0s&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;==&lt;/span&gt;&amp;gt; v1/Role&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k8s-gitlab-runner-gitlab-runner &lt;span class="nv"&gt;0s&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;==&lt;/span&gt;&amp;gt; v1/RoleBinding&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k8s-gitlab-runner-gitlab-runner &lt;span class="nv"&gt;0s&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;==&lt;/span&gt;&amp;gt; v1/Secret&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME TYPE DATA AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k8s-gitlab-runner-gitlab-runner Opaque &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;0s&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;==&lt;/span&gt;&amp;gt; v1/ServiceAccount&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME SECRETS AGE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k8s-gitlab-runner-gitlab-runner &lt;span class="m"&gt;1&lt;/span&gt; 0s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NOTES:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Your GitLab Runner should now be registered against the GitLab instance reachable at: &lt;span class="s2"&gt;&amp;#34;https://gitlab.fjy8018.top/&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看gitlab admin页面，发现已经有一个runner成功注册&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1574778634857" class="gallery-image" data-flex-basis="1945px" data-flex-grow="810" height="169" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1574778634857.png" width="1370"&gt;&lt;/p&gt;&#10;&lt;h2 id="工程配置"&gt;&lt;a href="#%e5%b7%a5%e7%a8%8b%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;工程配置&#10;&lt;/h2&gt;&lt;h3 id="dind方式构建所需配置"&gt;&lt;a href="#dind%e6%96%b9%e5%bc%8f%e6%9e%84%e5%bb%ba%e6%89%80%e9%9c%80%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;DinD方式构建所需配置&#10;&lt;/h3&gt;&lt;p&gt;如果原本的&lt;code&gt;ci&lt;/code&gt;文件是基于&lt;code&gt;19.03 DinD&lt;/code&gt;镜像构建的则需要加上&lt;code&gt;TLS&lt;/code&gt;相关配置&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker:19.03&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_DRIVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;overlay&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tcp://localhost:2375&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_TLS_CERTDIR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;...&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其余配置保持不变，使用DinD构建&lt;/p&gt;&#10;&lt;h3 id="kubectl和kubernetes权限配置"&gt;&lt;a href="#kubectl%e5%92%8ckubernetes%e6%9d%83%e9%99%90%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;Kubectl和Kubernetes权限配置&#10;&lt;/h3&gt;&lt;p&gt;由于使用&lt;code&gt;k8s&lt;/code&gt;集群，而通过集群部署需要使用&lt;code&gt;kubectl&lt;/code&gt;客户端，故手动创建了一个&lt;code&gt;kubectl&lt;/code&gt; &lt;code&gt;docker&lt;/code&gt;镜像，使用&lt;code&gt;gitlab&lt;/code&gt;触发&lt;code&gt;dockerhub&lt;/code&gt;构建，构建内容公开透明，可放心使用，如有其它版本的构建需求也可提pull request，会在后面补充，目前用到的只有1.14.0&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://hub.docker.com/r/fjy8018/kubectl" target="_blank" rel="noopener"&#10; &gt;fjy8018/kubectl&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1574778835433" class="gallery-image" data-flex-basis="562px" data-flex-grow="234" height="566" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1574778835433.png" width="1327"&gt;&lt;/p&gt;&#10;&lt;p&gt;有&lt;code&gt;kubectl&lt;/code&gt;客户端，还需要配置连接&lt;code&gt;TLS&lt;/code&gt;和连接账户&lt;/p&gt;&#10;&lt;p&gt;为了保障安全，新建一个专门访问该工程命名空间的&lt;code&gt;ServiceAccount&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ServiceAccount&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;hmdt-gitlab-ci&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;hmdt&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;利用集群提供的RBAC机制，为该账户授予该命名空间的admin权限&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;rbac.authorization.k8s.io/v1beta1&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;RoleBinding&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;hmdt-gitlab-role&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;hmdt&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;subjects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ServiceAccount&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;hmdt-gitlab-ci&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;hmdt&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;roleRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;apiGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;rbac.authorization.k8s.io&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Role&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;admin&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;创建后在查询其在k8s集群中生成的唯一名称，此处为&lt;code&gt;hmdt-gitlab-ci-token-86n89&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl describe sa hmdt-gitlab-ci -n hmdt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name: hmdt-gitlab-ci&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Namespace: hmdt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Labels: &amp;lt;none&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Annotations: kubectl.&lt;span class="sb"&gt;`&lt;/span&gt;Kubernetes&lt;span class="sb"&gt;`&lt;/span&gt;.io/last-applied-configuration:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;apiVersion&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;v1&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;kind&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;ServiceAccount&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;metadata&amp;#34;&lt;/span&gt;:&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;annotations&amp;#34;&lt;/span&gt;:&lt;span class="o"&gt;{}&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;hmdt-gitlab-ci&amp;#34;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;hmdt&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Image pull secrets: &amp;lt;none&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mountable secrets: hmdt-gitlab-ci-token-86n89&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tokens: hmdt-gitlab-ci-token-86n89&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Events: &amp;lt;none&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后根据上面的Secret找到CA证书&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl get secret hmdt-gitlab-ci-token-86n89 -n hmdt -o json &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.data[&amp;#34;ca.crt&amp;#34;]&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; base64 -d&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再找到对应的 Token&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl get secret hmdt-gitlab-ci-token-86n89 -n hmdt -o json &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.data.token&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; base64 -d&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="kubernetes关联gitlab配置"&gt;&lt;a href="#kubernetes%e5%85%b3%e8%81%94gitlab%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;Kubernetes关联GitLab配置&#10;&lt;/h3&gt;&lt;p&gt;进入gitlab Kubernetes集群配置页面，填写相关信息，让gitlab自动连接上集群环境&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1574779375430" class="gallery-image" data-flex-basis="83px" data-flex-grow="34" height="656" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1574779375430.png" width="229"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1574779403873" class="gallery-image" data-flex-basis="537px" data-flex-grow="223" height="597" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1574779403873.png" width="1336"&gt;&lt;/p&gt;&#10;&lt;p&gt;注意，需要将此处取消勾选，否则gitlab会自动创建新的用户账户，而不使用已经创建好的用户账户，在运行过程中会报无权限错误&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1574779467185" class="gallery-image" data-flex-basis="318px" data-flex-grow="132" height="751" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1574779467185.png" width="997"&gt;&lt;/p&gt;&#10;&lt;p&gt;不取消导致的报错如下，gitlab创建了新的用户账户&lt;code&gt;hmdt-prod-service-account&lt;/code&gt;，但没有操作指定命名空间的权限&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1574779599949" class="gallery-image" data-flex-basis="2160px" data-flex-grow="900" height="137" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1574779599949.png" width="1233"&gt;&lt;/p&gt;&#10;&lt;h3 id="gitlab环境配置"&gt;&lt;a href="#gitlab%e7%8e%af%e5%a2%83%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;GitLab环境配置&#10;&lt;/h3&gt;&lt;p&gt;创建环境&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20191127095307604" class="gallery-image" data-flex-basis="215px" data-flex-grow="89" height="258" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191127095307604.png" width="232"&gt;&lt;/p&gt;&#10;&lt;p&gt;名称和url可以按需自定义&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20191127095330949" class="gallery-image" data-flex-basis="917px" data-flex-grow="382" height="347" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191127095330949.png" width="1327"&gt;&lt;/p&gt;&#10;&lt;h3 id="ci脚本配置"&gt;&lt;a href="#ci%e8%84%9a%e6%9c%ac%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;CI脚本配置&#10;&lt;/h3&gt;&lt;p&gt;最终配置CI文件如下，该文件使用&lt;code&gt;DinD&lt;/code&gt;方式构建&lt;code&gt;Dockerfile&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker:19.03&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MAVEN_CLI_OPTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-s .m2/settings.xml --batch-mode -Dmaven.test.skip=true&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MAVEN_OPTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-Dmaven.repo.local=.m2/repository&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_DRIVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;overlay&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tcp://localhost:2375&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_TLS_CERTDIR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;SPRING_PROFILES_ACTIVE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;IMAGE_VERSION&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1.8.6&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_REGISTRY_MIRROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://XXX.mirror.aliyuncs.com&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;stages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;test&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;package&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;review&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;deploy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;maven-build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;maven:3-jdk-8&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;test&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;mvn $MAVEN_CLI_OPTS clean package -U -B -T 2C&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;artifacts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;expire_in&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;week&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;target/*.jar&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;maven-scan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;test&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;maven:3-jdk-8&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;mvn $MAVEN_CLI_OPTS verify sonar:sonar&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;maven-deploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;deploy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;maven:3-jdk-8&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;mvn $MAVEN_CLI_OPTS deploy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;docker-harbor-build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker:19.03&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;package&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker:19.03-dind&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;before_script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker login -u &amp;#34;$CI_REGISTRY_USER&amp;#34; -p &amp;#34;$CI_REGISTRY_PASSWORD&amp;#34; $CI_REGISTRY&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker build --pull -t &amp;#34;$CI_REGISTRY_IMAGE:$IMAGE_VERSION&amp;#34; .&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker push &amp;#34;$CI_REGISTRY_IMAGE:$IMAGE_VERSION&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker logout $CI_REGISTRY&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;deploy_live&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;fjy8018/kubectl:v1.14.0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;deploy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;prod&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://XXXX&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;kubectl version&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;kubectl get pods -n hmdt&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;cd manifests/&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;sed -i &amp;#34;s/__IMAGE_VERSION_SLUG__/${IMAGE_VERSION}/&amp;#34; deployment.yaml&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;kubectl apply -f deployment.yaml&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;kubectl rollout status -f deployment.yaml&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;kubectl get pods -n hmdt&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;若需要使用&lt;code&gt;Kaniko&lt;/code&gt;构建&lt;code&gt;Dockerfile&lt;/code&gt;，则配置如下&lt;/p&gt;&#10;&lt;p&gt;注意，其中依赖的镜像&lt;code&gt;gcr.io/kaniko-project/executor:debug&lt;/code&gt;属于谷歌镜像仓库，可能存在无法拉取的情况&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker:19.03&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MAVEN_CLI_OPTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-s .m2/settings.xml --batch-mode -Dmaven.test.skip=true&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MAVEN_OPTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-Dmaven.repo.local=.m2/repository&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_DRIVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;overlay&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tcp://localhost:2375&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_TLS_CERTDIR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;SPRING_PROFILES_ACTIVE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;IMAGE_VERSION&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1.8.6&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_REGISTRY_MIRROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://XXX.mirror.aliyuncs.com&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;target/&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;stages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;test&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;package&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;review&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;deploy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;maven-build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;maven:3-jdk-8&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;test&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;mvn $MAVEN_CLI_OPTS clean package -U -B -T 2C&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;artifacts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;expire_in&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;week&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;target/*.jar&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;maven-scan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;test&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;maven:3-jdk-8&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;mvn $MAVEN_CLI_OPTS verify sonar:sonar&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;maven-deploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;deploy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;maven:3-jdk-8&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;mvn $MAVEN_CLI_OPTS deploy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;docker-harbor-build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;package&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;gcr.io/kaniko-project/executor:debug&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;entrypoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;echo &amp;#34;{\&amp;#34;auths\&amp;#34;:{\&amp;#34;$CI_REGISTRY\&amp;#34;:{\&amp;#34;username\&amp;#34;:\&amp;#34;$CI_REGISTRY_USER\&amp;#34;,\&amp;#34;password\&amp;#34;:\&amp;#34;$CI_REGISTRY_PASSWORD\&amp;#34;}}}&amp;#34; &amp;gt; /kaniko/.docker/config.json&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:$IMAGE_VERSION&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;deploy_live&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;fjy8018/kubectl:v1.14.0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;deploy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;prod&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://XXXX&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;kubectl version&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;kubectl get pods -n hmdt&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;cd manifests/&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;sed -i &amp;#34;s/__IMAGE_VERSION_SLUG__/${IMAGE_VERSION}/&amp;#34; deployment.yaml&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;kubectl apply -f deployment.yaml&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;kubectl rollout status -f deployment.yaml&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;kubectl get pods -n hmdt&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="执行流水线"&gt;&lt;a href="#%e6%89%a7%e8%a1%8c%e6%b5%81%e6%b0%b4%e7%ba%bf" class="header-anchor"&gt;&lt;/a&gt;执行流水线&#10;&lt;/h2&gt;&lt;h3 id="runner自动扩缩容"&gt;&lt;a href="#runner%e8%87%aa%e5%8a%a8%e6%89%a9%e7%bc%a9%e5%ae%b9" class="header-anchor"&gt;&lt;/a&gt;runner自动扩缩容&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Kubernetes&lt;/code&gt;中的runner会根据任务多少自动扩缩容，目前配置的上限为10个&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1574776369212" class="gallery-image" data-flex-basis="766px" data-flex-grow="319" height="408" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1574776369212.png" width="1303"&gt;&lt;/p&gt;&#10;&lt;p&gt;Grafana也能监控到集群在构建过程中的资源使用情况&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1574776599795" class="gallery-image" data-flex-basis="587px" data-flex-grow="244" height="756" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1574776599795.png" width="1851"&gt;&lt;/p&gt;&#10;&lt;h3 id="使用dind构建dockerfile结果"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8dind%e6%9e%84%e5%bb%badockerfile%e7%bb%93%e6%9e%9c" class="header-anchor"&gt;&lt;/a&gt;使用&lt;code&gt;DinD&lt;/code&gt;构建&lt;code&gt;Dockerfile&lt;/code&gt;结果&#10;&lt;/h3&gt;&lt;p&gt;&lt;img alt="image-20191127100525518" class="gallery-image" data-flex-basis="245px" data-flex-grow="102" height="654" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191127100525518.png" width="670"&gt;&lt;/p&gt;&#10;&lt;h3 id="使用kaniko构建dockerfile的结果"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8kaniko%e6%9e%84%e5%bb%badockerfile%e7%9a%84%e7%bb%93%e6%9e%9c" class="header-anchor"&gt;&lt;/a&gt;使用&lt;code&gt;Kaniko&lt;/code&gt;构建&lt;code&gt;Dockerfile&lt;/code&gt;的结果&#10;&lt;/h3&gt;&lt;p&gt;&lt;img alt="image-20191127100458620" class="gallery-image" data-flex-basis="447px" data-flex-grow="186" height="546" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191127100458620.png" width="1018"&gt;&lt;/p&gt;&#10;&lt;h3 id="部署结果"&gt;&lt;a href="#%e9%83%a8%e7%bd%b2%e7%bb%93%e6%9e%9c" class="header-anchor"&gt;&lt;/a&gt;部署结果&#10;&lt;/h3&gt;&lt;p&gt;执行部署时gitlab会自动注入配置好的&lt;code&gt;kubectl&lt;/code&gt; config&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20191127095832650" class="gallery-image" data-flex-basis="576px" data-flex-grow="240" height="522" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191127095832650.png" width="1253"&gt;&lt;/p&gt;&#10;&lt;h3 id="构建结果"&gt;&lt;a href="#%e6%9e%84%e5%bb%ba%e7%bb%93%e6%9e%9c" class="header-anchor"&gt;&lt;/a&gt;构建结果&#10;&lt;/h3&gt;&lt;p&gt;&lt;img alt="image-20191127095739561" class="gallery-image" data-flex-basis="777px" data-flex-grow="324" height="262" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191127095739561.png" width="849"&gt;&lt;/p&gt;&#10;&lt;p&gt;部署完成后可在环境配置页中查看部署结果，只有成功的部署才会被记录&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20191127095923676" class="gallery-image" data-flex-basis="627px" data-flex-grow="261" height="509" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20191127095923676.png" width="1330"&gt;&lt;/p&gt;&#10;</description></item><item><title>使用GitHub和DockerHub自动构建镜像</title><link>https://blog.fjy8018.top/archives/210/</link><pubDate>Wed, 31 Jul 2019 22:36:41 +0800</pubDate><guid>https://blog.fjy8018.top/archives/210/</guid><description>&lt;h2 id="环境"&gt;&lt;a href="#%e7%8e%af%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;环境&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;DockerHub&lt;/code&gt;账号、&lt;code&gt;GitHub&lt;/code&gt;账号&lt;/p&gt;&#10;&lt;h2 id="步骤"&gt;&lt;a href="#%e6%ad%a5%e9%aa%a4" class="header-anchor"&gt;&lt;/a&gt;步骤&#10;&lt;/h2&gt;&lt;h3 id="构建脚本"&gt;&lt;a href="#%e6%9e%84%e5%bb%ba%e8%84%9a%e6%9c%ac" class="header-anchor"&gt;&lt;/a&gt;构建脚本&#10;&lt;/h3&gt;&lt;p&gt;此处以构建&lt;code&gt;mycat&lt;/code&gt;的&lt;code&gt;docker&lt;/code&gt;镜像为例，在本地准备好可以运行的构建脚本&lt;code&gt;Dockerfile&lt;/code&gt;，尽可能不使用准备好的配置文件，保证镜像的安全、纯净，并且利用环境变量配置精简构建脚本&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;openjdk:8-jre&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;MAINTAINER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;fjy8018&lt;/span&gt; fjy8018@gmail.com&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Mycat 版本&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENV&lt;/span&gt; MYCAT_VERSION 1.6-RELEASE&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENV&lt;/span&gt; MYCAT_PKG Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/usr/local&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 缓存层&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; wget http://dl.mycat.io/&lt;span class="nv"&gt;$MYCAT_VERSION&lt;/span&gt;/&lt;span class="nv"&gt;$MYCAT_PKG&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apt-get install -y procps &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apt-get clean &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tar -zxf /usr/local/&lt;span class="nv"&gt;$MYCAT_PKG&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rm -rf /usr/local/&lt;span class="nv"&gt;$MYCAT_PKG&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;VOLUME&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/usr/local/mycat/conf&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;8066&lt;/span&gt; &lt;span class="m"&gt;9066&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt; /usr/local/mycat/bin/mycat console&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="创建github仓库"&gt;&lt;a href="#%e5%88%9b%e5%bb%bagithub%e4%bb%93%e5%ba%93" class="header-anchor"&gt;&lt;/a&gt;创建GitHub仓库&#10;&lt;/h3&gt;&lt;p&gt;在&lt;code&gt;GitHub&lt;/code&gt;上创建对应的仓库，并推送&lt;code&gt;Dockerfile&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564572008865.png" class="gallery-image" data-flex-basis="298px" data-flex-grow="124" height="838" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/31/5d41a6b6dfd8192366.png" width="1043"&gt;&lt;/p&gt;&#10;&lt;h3 id="链接dockerhub与github"&gt;&lt;a href="#%e9%93%be%e6%8e%a5dockerhub%e4%b8%8egithub" class="header-anchor"&gt;&lt;/a&gt;链接DockerHub与GitHub&#10;&lt;/h3&gt;&lt;p&gt;登陆&lt;code&gt;DockerHub&lt;/code&gt;选择&lt;code&gt;repository&lt;/code&gt;新建仓库&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564572101153.png" class="gallery-image" data-flex-basis="1560px" data-flex-grow="650" height="180" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/31/5d41a6b6ca75420080.png" width="1170"&gt;&lt;/p&gt;&#10;&lt;p&gt;首次链接可以参照&lt;a class="link" href="https://docs.docker.com/docker-hub/builds/link-source/" target="_blank" rel="noopener"&#10; &gt;指引&lt;/a&gt;操作，主要是做&lt;code&gt;OAuth &lt;/code&gt;授权&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564572489753.png" class="gallery-image" data-flex-basis="337px" data-flex-grow="140" height="827" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/31/5d41a6b6b3cd010635.png" width="1162"&gt;&lt;/p&gt;&#10;&lt;h3 id="创建构建分支和标签"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba%e6%9e%84%e5%bb%ba%e5%88%86%e6%94%af%e5%92%8c%e6%a0%87%e7%ad%be" class="header-anchor"&gt;&lt;/a&gt;创建构建分支和标签&#10;&lt;/h3&gt;&lt;p&gt;连接&lt;code&gt;GitHub&lt;/code&gt;后可以选择需要构建的仓库，同时展开构建选项，可以指定不同分支构建出的标签，默认&lt;code&gt;master&lt;/code&gt;分支构建为&lt;code&gt;latest&lt;/code&gt;版本&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564580799275.png" class="gallery-image" data-flex-basis="255px" data-flex-grow="106" height="649" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/31/5d41a6b6d5f8a31891.png" width="691"&gt;&lt;/p&gt;&#10;&lt;h3 id="触发构建"&gt;&lt;a href="#%e8%a7%a6%e5%8f%91%e6%9e%84%e5%bb%ba" class="header-anchor"&gt;&lt;/a&gt;触发构建&#10;&lt;/h3&gt;&lt;p&gt;第一次会自动触发构建，随后代码推送都会触发构建&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564572890867.png" class="gallery-image" data-flex-basis="604px" data-flex-grow="251" height="431" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/31/5d41a6b6b319370352.png" width="1086"&gt;&lt;/p&gt;&#10;&lt;h3 id="构建结果"&gt;&lt;a href="#%e6%9e%84%e5%bb%ba%e7%bb%93%e6%9e%9c" class="header-anchor"&gt;&lt;/a&gt;构建结果&#10;&lt;/h3&gt;&lt;p&gt;在管理页面可以查看构建时长和构建结果&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564573686044.png" class="gallery-image" data-flex-basis="358px" data-flex-grow="149" height="767" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/31/5d41a6b6d559a89403.png" width="1147"&gt;&lt;/p&gt;&#10;&lt;h2 id="结果"&gt;&lt;a href="#%e7%bb%93%e6%9e%9c" class="header-anchor"&gt;&lt;/a&gt;结果&#10;&lt;/h2&gt;&lt;h3 id="用户视角"&gt;&lt;a href="#%e7%94%a8%e6%88%b7%e8%a7%86%e8%a7%92" class="header-anchor"&gt;&lt;/a&gt;用户视角&#10;&lt;/h3&gt;&lt;p&gt;用户视角可以看到构建的GitHub仓库&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564583383061.png" class="gallery-image" data-flex-basis="347px" data-flex-grow="144" height="897" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/31/5d41a6b6e89a952064.png" width="1297"&gt;&lt;/p&gt;&#10;&lt;p&gt;自动构建产生的分支&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564583424202.png" class="gallery-image" data-flex-basis="212px" data-flex-grow="88" height="478" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/31/5d41a6b6be96a97983.png" width="424"&gt;&lt;/p&gt;&#10;&lt;p&gt;构建历史记录&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564583451660.png" class="gallery-image" data-flex-basis="530px" data-flex-grow="221" height="598" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/31/5d41a6b6d671469520.png" width="1322"&gt;&lt;/p&gt;&#10;</description></item><item><title>Docker 19.03 版本对原Gitlab-Runner的影响</title><link>https://blog.fjy8018.top/archives/208/</link><pubDate>Sun, 28 Jul 2019 13:09:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/208/</guid><description>&lt;h2 id="版本变化始末"&gt;&lt;a href="#%e7%89%88%e6%9c%ac%e5%8f%98%e5%8c%96%e5%a7%8b%e6%9c%ab" class="header-anchor"&gt;&lt;/a&gt;版本变化始末&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;在 2019.07.24 Docker社区发布了&lt;code&gt;19.03&lt;/code&gt;的新版本，在此前版本号为&lt;code&gt;18.0x&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="新版本带来的坑"&gt;&lt;a href="#%e6%96%b0%e7%89%88%e6%9c%ac%e5%b8%a6%e6%9d%a5%e7%9a%84%e5%9d%91" class="header-anchor"&gt;&lt;/a&gt;新版本带来的坑&#10;&lt;/h2&gt;&lt;p&gt;原本没太在意&lt;code&gt;docker&lt;/code&gt;版本的变化，因为多数情况都是兼容旧版的所有特性和功能的&lt;/p&gt;&#10;&lt;p&gt;结果在近期的CICD构建中，在ci脚本没有变化的情况下突然所有&lt;code&gt;runner&lt;/code&gt;的构建都失败了&lt;/p&gt;&#10;&lt;p&gt;随后立即采取以下措施尝试修复&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;工程版本回退到上一次可用状态&lt;/li&gt;&#10;&lt;li&gt;更换&lt;code&gt;runner&lt;/code&gt;服务器和容器&lt;/li&gt;&#10;&lt;li&gt;更改&lt;code&gt;ci&lt;/code&gt;脚本&lt;/li&gt;&#10;&lt;li&gt;重启&lt;code&gt;docker&lt;/code&gt;服务&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;均无效&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564288081390.png" class="gallery-image" data-flex-basis="342px" data-flex-grow="142" height="746" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/28/5d3d2d216a5f496230.png" width="1064"&gt;&lt;/p&gt;&#10;&lt;p&gt;执行构建步骤出现了以往没有出现过的警告信息&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Running with gitlab-runner 11.8.0 &lt;span class="o"&gt;(&lt;/span&gt;4745a6f3&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; on docker-in-docker-runner 4iAG2sYM&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Using Docker executor with image docker:stable ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Starting service docker:dind ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Pulling docker image docker:dind ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Using docker image sha256:fd0c64832f7e46b63a180e6000dbba7ad7a63542c5764841cba73429ba74a39e &lt;span class="k"&gt;for&lt;/span&gt; docker:dind ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Waiting &lt;span class="k"&gt;for&lt;/span&gt; services to be up and running...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*** WARNING: Service runner-4iAG2sYM-project-89-concurrent-0-docker-0 probably didn&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;t start properly.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Health check error:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;service &lt;span class="s2"&gt;&amp;#34;runner-4iAG2sYM-project-89-concurrent-0-docker-0-wait-for-service&amp;#34;&lt;/span&gt; timeout&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Health check container logs:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2019-07-24T03:11:35.365911823Z &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2019-07-24T03:11:35.365537741Z&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;info &lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;API listen on [::]:2376&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2019-07-24T03:11:35.366107674Z &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2019-07-24T03:11:35.365626706Z&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;info &lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;API listen on /var/run/docker.sock&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*********&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Pulling docker image docker:stable ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Using docker image sha256:c4154a2b47a18fe9437956ab981bd5924b19e7ae3eb3ed60c42cf8dfa394d550 &lt;span class="k"&gt;for&lt;/span&gt; docker:stable ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最终报错信息&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Downloading artifacts &lt;span class="k"&gt;for&lt;/span&gt; maven-build &lt;span class="o"&gt;(&lt;/span&gt;280&lt;span class="o"&gt;)&lt;/span&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Downloading artifacts from coordinator... ok &lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;280&lt;/span&gt; &lt;span class="nv"&gt;responseStatus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt; OK &lt;span class="nv"&gt;token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;L9iuC5Ss&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker build -t &lt;span class="nv"&gt;$CONTAINER_IMAGE&lt;/span&gt;:&lt;span class="nv"&gt;$IMAGE_VERSION&lt;/span&gt; .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ERROR: Job failed: &lt;span class="nb"&gt;exit&lt;/span&gt; code &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="寻找解决方法"&gt;&lt;a href="#%e5%af%bb%e6%89%be%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;寻找解决方法&#10;&lt;/h2&gt;&lt;p&gt;该错误在早期版本就出现过，但与本次情况均不符合，以往通过挂载容器路径即可，而本次情况是&lt;code&gt;runner&lt;/code&gt;服务和构建脚本均不变的情况下突然出现构建失败的情况&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564288454164.png" class="gallery-image" data-flex-basis="313px" data-flex-grow="130" height="644" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/28/5d3d2d21691a426024.png" width="841"&gt;&lt;/p&gt;&#10;&lt;p&gt;最终在社区ISSUS讨论中发现了相关讨论，并且问题发生时间相近&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitlab.com/gitlab-org/gitlab-ce/issues/64959" target="_blank" rel="noopener"&#10; &gt;Jobs failing with &amp;ldquo;Cannot connect to the Docker daemon&amp;rdquo;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564288560626.png" class="gallery-image" data-flex-basis="390px" data-flex-grow="162" height="523" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/28/5d3d2d212457666352.png" width="852"&gt;&lt;/p&gt;&#10;&lt;p&gt;官方开发者解释 当天几个小时前发布的新版本 &lt;code&gt;19.03&lt;/code&gt;默认开启了&lt;code&gt;TLS&lt;/code&gt;确实会影响已有的&lt;code&gt;Docker in Docker &lt;/code&gt;模式的构建环境&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564288621569.png" class="gallery-image" data-flex-basis="521px" data-flex-grow="217" height="441" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/28/5d3d2d2147bd260875.png" width="959"&gt;&lt;/p&gt;&#10;&lt;p&gt;同时官方开发人员建议自行部署的&lt;code&gt;runner&lt;/code&gt;建议开启&lt;code&gt;TLS&lt;/code&gt;功能&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564288718662.png" class="gallery-image" data-flex-basis="1770px" data-flex-grow="737" height="128" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/28/5d3d2d214685a34515.png" width="944"&gt;&lt;/p&gt;&#10;&lt;p&gt;该开发者在另一个讨论中提供了19.03环境下的runner启动和配置样板，同时还有样例ci脚本&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/31051#note_194866340" target="_blank" rel="noopener"&#10; &gt;Update DinD example for 19.03&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564288829375.png" class="gallery-image" data-flex-basis="528px" data-flex-grow="220" height="452" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/28/5d3d2d21539a832091.png" width="995"&gt;&lt;/p&gt;&#10;&lt;h2 id="解决方法"&gt;&lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;解决方法&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;最好可以卸载旧版本的Docker，尽管运行runner和dind环境都基于docker容器中&lt;/li&gt;&#10;&lt;li&gt;加入TLS相关runner注册配置&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;此处采用更新Docker版本并使用最新版的runner镜像进行注册&lt;/p&gt;&#10;&lt;h3 id="更新docker版本"&gt;&lt;a href="#%e6%9b%b4%e6%96%b0docker%e7%89%88%e6%9c%ac" class="header-anchor"&gt;&lt;/a&gt;更新docker版本&#10;&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://docs.docker.com/install/linux/docker-ce/centos/" target="_blank" rel="noopener"&#10; &gt;官方文档&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;卸载旧docker&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo yum remove docker &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker-client &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker-client-latest &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker-common &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker-latest &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker-latest-logrotate &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker-logrotate &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker-engine&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置生产环境的依赖仓库&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo yum-config-manager &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --add-repo &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://download.docker.com/linux/centos/docker-ce.repo&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;官方建议&lt;/strong&gt;的安装新版Docker命令&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo yum install docker-ce docker-ce-cli containerd.io&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但经过这次事件后个人不建议使用该命令，而是应该手动指定所有Docker环境版本号，防止以后版本更新导致不兼容问题&lt;/p&gt;&#10;&lt;p&gt;查看当前可以安装的所有版本&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo yum list docker-ce --showduplicates &lt;span class="p"&gt;|&lt;/span&gt; sort -r&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * updates: repos.lax.quadranet.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Loaded plugins: fastestmirror&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * extras: mirror.hostduplex.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * epel: d2lzkl7pfhq30w.cloudfront.net&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * elrepo-kernel: repos.lax-noc.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 3:19.03.0-3.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 3:18.09.8-3.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 3:18.09.7-3.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 3:18.09.5-3.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 3:18.09.4-3.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 3:18.09.3-3.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 3:18.09.2-3.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Determining fastest mirrors&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; * base: mirror.hostduplex.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Available Packages&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;指定最新版本&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo yum install docker-ce-19.03.1 docker-ce-cli-19.03.1 containerd.io&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动docker&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;设置开机自启&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="安装gitlab-runner"&gt;&lt;a href="#%e5%ae%89%e8%a3%85gitlab-runner" class="header-anchor"&gt;&lt;/a&gt;安装Gitlab Runner&#10;&lt;/h3&gt;&lt;p&gt;官方对新版启用TLS的注册样例&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ol&gt;&#10;&lt;li&gt;Register GitLab Runner from the command line to use &lt;code&gt;docker&lt;/code&gt; and &lt;code&gt;privileged&lt;/code&gt;&#10;mode:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo gitlab-runner register -n &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --url https://gitlab.com/ &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --registration-token REGISTRATION_TOKEN &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --executor docker &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --description &lt;span class="s2"&gt;&amp;#34;My Docker Runner&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --docker-image &lt;span class="s2"&gt;&amp;#34;docker:stable&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --docker-privileged &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --docker-volumes &lt;span class="s2"&gt;&amp;#34;/certs/client&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;此处采用容器化注册runner命令为&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run --rm -t -i &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-v /etc/gitlab-runner/config:/etc/gitlab-runner &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gitlab/gitlab-runner:alpine-v12.1.0 register &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--url &lt;span class="s2"&gt;&amp;#34;https://gitlab.com/&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--registration-token REGISTRATION_TOKEN &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--executor docker &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--non-interactive &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--run-untagged &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--tag-list &lt;span class="s2"&gt;&amp;#34;Runner,Docker&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--run-untagged&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--locked&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;false&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--description &lt;span class="s2"&gt;&amp;#34;My Docker Runner&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--docker-image &lt;span class="s2"&gt;&amp;#34;docker:stable&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--docker-privileged &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--docker-volumes &lt;span class="s2"&gt;&amp;#34;/certs/client&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;主要的变化至于增加了证书挂载&lt;code&gt;--docker-volumes &amp;quot;/certs/client&amp;quot;&lt;/code&gt;配置，同时指定了&lt;code&gt;runner&lt;/code&gt;的版本号&lt;/p&gt;&#10;&lt;p&gt;启动&lt;code&gt;runner&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run --name gitlab-runner --restart always -d &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-v /etc/gitlab-runner/config:/etc/gitlab-runner &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-v /var/run/docker.sock:/var/run/docker.sock &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gitlab/gitlab-runner:alpine-v12.1.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="修改构建脚本"&gt;&lt;a href="#%e4%bf%ae%e6%94%b9%e6%9e%84%e5%bb%ba%e8%84%9a%e6%9c%ac" class="header-anchor"&gt;&lt;/a&gt;修改构建脚本&#10;&lt;/h3&gt;&lt;p&gt;官方对新版启用&lt;code&gt;TLS&lt;/code&gt;的构建脚本样例，指定了构建时使用的&lt;code&gt;docker&lt;/code&gt;版本与外部一直，防止不兼容的问题&lt;/p&gt;&#10;&lt;p&gt;同时加入了&lt;code&gt;TLS&lt;/code&gt;环境变量配置&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker:19.03&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# When using dind service we need to instruct docker, to talk with&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# the daemon started inside of the service. The daemon is&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# available with a network connection instead of the default&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# /var/run/docker.sock socket. docker:19.03-dind does this&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# automatically by setting the DOCKER_HOST in&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# https://github.com/docker-library/docker/blob/d45051476babc297257df490d22cbd806f1b11e4/19.03/docker-entrypoint.sh#L23-L29&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# The &amp;#39;docker&amp;#39; hostname is the alias of the service container as described at&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#accessing-the-services.&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Note that if you&amp;#39;re using the Kubernetes executor, the variable should be set to&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# tcp://localhost:2376/ because of how the Kubernetes executor connects services&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# to the job container&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# DOCKER_HOST: tcp://localhost:2376/&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# When using dind, it&amp;#39;s wise to use the overlayfs driver for&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# improved performance.&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_DRIVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;overlay2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Specify to Docker where to create the certificates, Docker will&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# create them automatically on boot, and will create&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# `/certs/client` that will be shared between the service and&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# build container.&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_TLS_CERTDIR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/certs&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker:19.03-dind&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;before_script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;echo $DOCKER_HOST&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker info&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;build&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker build -t my-docker-image .&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在此前自己的构建脚本是按照官网提供的样板，没有指定版本，因此会导致每次构建都会使用当前最新的版本作为基础，最终导致外部Docker和内部Docker容器版本不一致&lt;/p&gt;&#10;&lt;p&gt;官网示例DinD构建脚本&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker:stable&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker:dind&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;...&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;按照社区配置修改后重新构建则成功&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1564290149104.png" class="gallery-image" data-flex-basis="2658px" data-flex-grow="1107" height="117" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/07/28/5d3d2d213b81385192.png" width="1296"&gt;&lt;/p&gt;&#10;&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结&#10;&lt;/h2&gt;&lt;p&gt;对于Docker等云服务平台仍然需要特别注意版本变化，为了防止不兼容的情况，在生产环境尽量不要使用&lt;code&gt;latest&lt;/code&gt;版本标签，而是应该手动指定所有参与构建的版本环境&lt;/p&gt;&#10;</description></item><item><title>DevOps GitLab CICD 实践3——CI文件编写</title><link>https://blog.fjy8018.top/archives/207/</link><pubDate>Wed, 03 Apr 2019 16:32:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/207/</guid><description>&lt;p&gt;前置步骤：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Docker 版 GitLab CICD 实践1——GitLab 部署 [[Docker 版 GitLab CICD 实践]]&lt;/li&gt;&#10;&lt;li&gt;Docker 版 GitLab CICD 实践2——Runner 部署 [[Docker 版 GitLab CICD 实践——Runner 部署]]&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="官方文档"&gt;&lt;a href="#%e5%ae%98%e6%96%b9%e6%96%87%e6%a1%a3" class="header-anchor"&gt;&lt;/a&gt;官方文档&#10;&lt;/h2&gt;&lt;p&gt;编写结构类似Jenkins pineline流水线&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html" target="_blank" rel="noopener"&#10; &gt;GitLab CI/CD Pipeline Configuration Reference&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;h1 id="gitlab-cicd-pipeline-configuration-reference"&gt;&lt;a href="#gitlab-cicd-pipeline-configuration-reference" class="header-anchor"&gt;&lt;/a&gt;GitLab CI/CD Pipeline Configuration Reference&#10;&lt;/h1&gt;&lt;p&gt;GitLab CI/CD &lt;a class="link" href="https://docs.gitlab.com/ee/ci/pipelines.html" target="_blank" rel="noopener"&#10; &gt;pipelines&lt;/a&gt; are configured using a YAML file called &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; within each project.&lt;/p&gt;&#10;&lt;p&gt;The &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file defines the structure and order of the pipelines and determines:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;What to execute using &lt;a class="link" href="https://docs.gitlab.com/runner/" target="_blank" rel="noopener"&#10; &gt;GitLab Runner&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;What decisions to make when specific conditions are encountered. For example, when a process succeeds or fails.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;This topic covers CI/CD pipeline configuration. For other CI/CD configuration information, see:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/variables/README.html" target="_blank" rel="noopener"&#10; &gt;GitLab CI/CD Variables&lt;/a&gt;, for configuring the environment the pipelines run in.&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/configuration/advanced-configuration.html" target="_blank" rel="noopener"&#10; &gt;GitLab Runner advanced configuration&lt;/a&gt;, for configuring GitLab Runner.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;We have complete examples of configuring pipelines:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;For a quick introduction to GitLab CI, follow our &lt;a class="link" href="https://docs.gitlab.com/ee/ci/quick_start/README.html" target="_blank" rel="noopener"&#10; &gt;quick start guide&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;For a collection of examples, see &lt;a class="link" href="https://docs.gitlab.com/ee/ci/examples/README.html" target="_blank" rel="noopener"&#10; &gt;GitLab CI/CD Examples&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;To see a large &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file used in an enterprise, see the &lt;a class="link" href="https://gitlab.com/gitlab-org/gitlab-ce/blob/master/.gitlab-ci.yml" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file for &lt;code&gt;gitlab-ce&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="目标"&gt;&lt;a href="#%e7%9b%ae%e6%a0%87" class="header-anchor"&gt;&lt;/a&gt;目标&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;maven项目自动打包&lt;/li&gt;&#10;&lt;li&gt;&lt;del&gt;自动测试&lt;/del&gt;&lt;/li&gt;&#10;&lt;li&gt;自动镜像构建并上传&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;官方参数表列出了作业的可用参数：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;关键词&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;描述&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#script" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;script&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;由Runner执行的Shell脚本。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#image" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;image&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;使用泊坞窗图像。也可用：&lt;code&gt;image:name&lt;/code&gt;和&lt;code&gt;image:entrypoint&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#services" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;services&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;使用docker services图像。也可用：&lt;code&gt;services:name&lt;/code&gt;，&lt;code&gt;services:alias&lt;/code&gt;，&lt;code&gt;services:entrypoint&lt;/code&gt;，和&lt;code&gt;services:command&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#before_script-and-after_script" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;before_script&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;覆盖在作业之前执行的一组命令。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#before_script-and-after_script" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;after_script&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;覆盖作业后执行的一组命令。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#stages" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;stages&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定义管道中的阶段。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#stage" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;stage&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定义作业阶段（默认值:) &lt;code&gt;test&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#onlyexcept-basic" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;only&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;创建作业时限制。也可用：&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#onlyexcept-advanced" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;only:refs&lt;/code&gt;，&lt;code&gt;only:kubernetes&lt;/code&gt;，&lt;code&gt;only:variables&lt;/code&gt;，和&lt;code&gt;only:changes&lt;/code&gt;&lt;/a&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#onlyexcept-basic" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;except&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;在未创建作业时限制。也可用：&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#onlyexcept-advanced" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;except:refs&lt;/code&gt;，&lt;code&gt;except:kubernetes&lt;/code&gt;，&lt;code&gt;except:variables&lt;/code&gt;，和&lt;code&gt;except:changes&lt;/code&gt;&lt;/a&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#tags" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;tags&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;用于选择Runner的标签列表。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#allow_failure" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;allow_failure&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;让工作失败。失败的作业无助于提交状态。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#when" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;when&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;什么时候开始工作。也可用：&lt;code&gt;when:manual&lt;/code&gt;和&lt;code&gt;when:delayed&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#environment" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;environment&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;作业部署到的环境的名称。也可用：&lt;code&gt;environment:name&lt;/code&gt;，&lt;code&gt;environment:url&lt;/code&gt;，&lt;code&gt;environment:on_stop&lt;/code&gt;，和&lt;code&gt;environment:action&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#cache" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;cache&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;后续运行之间应缓存的文件列表。也可用：&lt;code&gt;cache:paths&lt;/code&gt;，&lt;code&gt;cache:key&lt;/code&gt;，&lt;code&gt;cache:untracked&lt;/code&gt;，和&lt;code&gt;cache:policy&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#artifacts" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;artifacts&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;成功附加到作业的文件和目录列表。也可用：&lt;code&gt;artifacts:paths&lt;/code&gt;，&lt;code&gt;artifacts:name&lt;/code&gt;，&lt;code&gt;artifacts:untracked&lt;/code&gt;，&lt;code&gt;artifacts:when&lt;/code&gt;，&lt;code&gt;artifacts:expire_in&lt;/code&gt;，&lt;code&gt;artifacts:reports&lt;/code&gt;，和&lt;code&gt;artifacts:reports:junit&lt;/code&gt;。 在GitLab &lt;a class="link" href="https://about.gitlab.com/pricing/" target="_blank" rel="noopener"&#10; &gt;企业版&lt;/a&gt;，这些都是可供选择：&lt;code&gt;artifacts:reports:codequality&lt;/code&gt;，&lt;code&gt;artifacts:reports:sast&lt;/code&gt;，&lt;code&gt;artifacts:reports:dependency_scanning&lt;/code&gt;，&lt;code&gt;artifacts:reports:container_scanning&lt;/code&gt;，&lt;code&gt;artifacts:reports:dast&lt;/code&gt;，&lt;code&gt;artifacts:reports:license_management&lt;/code&gt;，和&lt;code&gt;artifacts:reports:performance&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#dependencies" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;dependencies&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;作业所依赖的其他作业，以便您可以在它们之间传递工件。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#coverage" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;coverage&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;给定作业的代码覆盖率设置。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#retry" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;retry&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;在发生故障的情况下，可以自动重试作业的次数和次数。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#parallel" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;parallel&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;应该并行运行多少个作业实例。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#trigger-premium" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;trigger&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定义下游管道触发器。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#include" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;include&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;允许此作业包含外部YAML文件。也可用：&lt;code&gt;include:local&lt;/code&gt;，&lt;code&gt;include:file&lt;/code&gt;，&lt;code&gt;include:template&lt;/code&gt;，和&lt;code&gt;include:remote&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#extends" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;extends&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;此作业将继承的配置条目。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#pages" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;pages&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;上传作业结果以用于GitLab Pages。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#variables" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;variables&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;在作业级别定义作业变量。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;strong&gt;注：&lt;/strong&gt; 参数&lt;code&gt;types&lt;/code&gt;和&lt;code&gt;type&lt;/code&gt;被&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#deprecated-parameters" target="_blank" rel="noopener"&#10; &gt;弃用&lt;/a&gt;。&lt;/p&gt;&#10;&lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考&#10;&lt;/h2&gt;&lt;p&gt;官方构建案例&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/examples/deploy_spring_boot_to_cloud_foundry/index.html" target="_blank" rel="noopener"&#10; &gt;Deploy a Spring Boot application to Cloud Foundry with GitLab CI/CD&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;参考其脚本&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;h2 id="configure-gitlab-cicd-to-deploy-your-application"&gt;&lt;a href="#configure-gitlab-cicd-to-deploy-your-application" class="header-anchor"&gt;&lt;/a&gt;Configure GitLab CI/CD to deploy your application&#10;&lt;/h2&gt;&lt;p&gt;Now we need to add the GitLab CI/CD configuration file (&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;.gitlab-ci.yml&lt;/code&gt;&lt;/a&gt;) to our project’s root. This is how GitLab figures out what commands need to be run whenever code is pushed to our repository. We will add the following &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file to the root directory of the repository, GitLab will detect it automatically and run the steps defined once we push our code:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;java:8&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;stages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;build&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;deploy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;build&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./mvnw package&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;artifacts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;target/demo-0.0.1-SNAPSHOT.jar&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;production&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;deploy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;curl --location &amp;#34;https://cli.run.pivotal.io/stable?release=linux64-binary&amp;amp;source=github&amp;#34; | tar zx&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./cf login -u $CF_USERNAME -p $CF_PASSWORD -a api.run.pivotal.io&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./cf push&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;only&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;master&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="配置"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;配置&#10;&lt;/h2&gt;&lt;h3 id="全局变量"&gt;&lt;a href="#%e5%85%a8%e5%b1%80%e5%8f%98%e9%87%8f" class="header-anchor"&gt;&lt;/a&gt;全局变量&#10;&lt;/h3&gt;&lt;p&gt;进入工程CI设置配置全局变量脚本，包含镜像仓库登陆名称、密码、打包名称等&lt;/p&gt;&#10;&lt;p&gt;配置全局变量目的在于配置脚本中&lt;strong&gt;不应该&lt;/strong&gt;包含密码等敏感信息&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46d8dd6a74.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554278638713.png" class="gallery-image" data-flex-basis="755px" data-flex-grow="314" height="507" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46d8dd6a74.png" width="1597"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;若希望使用GitLab内置环境变量，可参考官方表格&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/variables/README.html" target="_blank" rel="noopener"&#10; &gt;GitLab CI/CD environment variables&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="ci脚本"&gt;&lt;a href="#ci%e8%84%9a%e6%9c%ac" class="header-anchor"&gt;&lt;/a&gt;CI脚本&#10;&lt;/h3&gt;&lt;p&gt;结合可用参数和样例配置，根据已经存在的SpringBoot项目编写响应的CI脚本&lt;code&gt;.gitlab-ci.yml&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker:stable&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker:dind&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_DRIVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;overlay&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;SPRING_PROFILES_ACTIVE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;gitlab-ci&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;stages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;build&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;package&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;maven-build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;maven:3-jdk-8&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;build&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mvn package -B&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;artifacts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;target/*.jar&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;docker-build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;package&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker build -t $CONTAINER_IMAGE:latest .&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker login -u $DOCKER_HUB_USER -p $DOCKER_HUB_PASS&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker push $CONTAINER_IMAGE:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;该脚本对于满足脚本目标的工程都可复用，若需要测试，则增加相关的测试步骤即可&lt;/p&gt;&#10;&lt;p&gt;此处由于工程包含外部依赖关系，不在构建时测试&lt;/p&gt;&#10;&lt;h3 id="自动构建"&gt;&lt;a href="#%e8%87%aa%e5%8a%a8%e6%9e%84%e5%bb%ba" class="header-anchor"&gt;&lt;/a&gt;自动构建&#10;&lt;/h3&gt;&lt;p&gt;默认的触发构建事件为&lt;code&gt;commit&lt;/code&gt;等&lt;/p&gt;&#10;&lt;p&gt;触发后会自动执行任务&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e940608c.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554278973797.png" class="gallery-image" data-flex-basis="1609px" data-flex-grow="670" height="194" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e940608c.png" width="1301"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e93a1220.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554279027476.png" class="gallery-image" data-flex-basis="621px" data-flex-grow="259" height="222" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e93a1220.png" width="575"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Maven自动触发构建，自动镜像打包&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e9490c9f.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554279219445.png" class="gallery-image" data-flex-basis="319px" data-flex-grow="132" height="619" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e9490c9f.png" width="823"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e935f2c2.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554279272711.png" class="gallery-image" data-flex-basis="438px" data-flex-grow="182" height="309" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e935f2c2.png" width="565"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;自动上传（推送）镜像&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e93137c7.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554279311054.png" class="gallery-image" data-flex-basis="407px" data-flex-grow="169" height="439" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e93137c7.png" width="745"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="执行结果"&gt;&lt;a href="#%e6%89%a7%e8%a1%8c%e7%bb%93%e6%9e%9c" class="header-anchor"&gt;&lt;/a&gt;执行结果&#10;&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e921bcd7.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554279508887.png" class="gallery-image" data-flex-basis="2119px" data-flex-grow="883" height="149" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e921bcd7.png" width="1316"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;若执行失败则会发送邮件给开发人员&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e94b500e.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554279616575.png" class="gallery-image" data-flex-basis="405px" data-flex-grow="168" height="945" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e94b500e.png" width="1595"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;CICD全套流程目标实现！&lt;/p&gt;&#10;&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结&#10;&lt;/h2&gt;&lt;p&gt;不管使用GitLab CICD或者是使用Jenkins+Ansible的方式，目标都在于践行DevOps，打通开发与运维流程，一旦配置好CICD流程，往后开发人员便不再操心打包、构建等操作，可以专注开发&lt;/p&gt;&#10;</description></item><item><title>DevOps GitLab CICD 实践2——Runner 部署</title><link>https://blog.fjy8018.top/archives/206/</link><pubDate>Wed, 03 Apr 2019 16:31:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/206/</guid><description>&lt;p&gt;前置步骤：&lt;a class="link" href="https://blog.fjy8018.top/archives/205/" &gt;DevOps GitLab CICD 实践1——GitLab 部署&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="官方文档"&gt;&lt;a href="#%e5%ae%98%e6%96%b9%e6%96%87%e6%a1%a3" class="header-anchor"&gt;&lt;/a&gt;官方文档&#10;&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/install/docker.html" target="_blank" rel="noopener"&#10; &gt;文档地址&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;虽然有官方指引，但个人感觉指引的不够清晰，导致初次配置可能频繁失败&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;h1 id="run-gitlab-runner-in-a-container"&gt;&lt;a href="#run-gitlab-runner-in-a-container" class="header-anchor"&gt;&lt;/a&gt;Run GitLab Runner in a container&#10;&lt;/h1&gt;&lt;p&gt;This is how you can run GitLab Runner inside a Docker container.&lt;/p&gt;&#10;&lt;h2 id="general-gitlab-runner-docker-image-usage"&gt;&lt;a href="#general-gitlab-runner-docker-image-usage" class="header-anchor"&gt;&lt;/a&gt;General GitLab Runner Docker image usage&#10;&lt;/h2&gt;&lt;p&gt;GitLab Runner Docker images (based on &lt;a class="link" href="https://docs.gitlab.com/runner/install/docker.html#docker-images" target="_blank" rel="noopener"&#10; &gt;Ubuntu or Alpine Linux&lt;/a&gt;) are designed as wrappers around the standard &lt;code&gt;gitlab-runner&lt;/code&gt; command, like if GitLab Runner was installed directly on the host.&lt;/p&gt;&#10;&lt;p&gt;The general rule is that every GitLab Runner command that normally would be executed as:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gitlab-runner &lt;span class="o"&gt;[&lt;/span&gt;Runner &lt;span class="nb"&gt;command&lt;/span&gt; and options...&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;can be executed with:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run &lt;span class="o"&gt;[&lt;/span&gt;chosen docker options...&lt;span class="o"&gt;]&lt;/span&gt; gitlab/gitlab-runner &lt;span class="o"&gt;[&lt;/span&gt;Runner &lt;span class="nb"&gt;command&lt;/span&gt; and options...&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For example, getting the top-level help information for GitLab Runner command could be executed as:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm -t -i gitlab/gitlab-runner --help&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gitlab-runner - a GitLab Runner&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;USAGE:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gitlab-runner &lt;span class="o"&gt;[&lt;/span&gt;global options&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt; options&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;arguments...&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VERSION:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 10.7.0 &lt;span class="o"&gt;(&lt;/span&gt;7c273476&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;(&lt;/span&gt;...&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In short, the &lt;code&gt;gitlab-runner&lt;/code&gt; part of the command is replaced with &lt;code&gt;docker run [docker options] gitlab/gitlab-runner&lt;/code&gt;, while the rest of Runner’s command stays as it is described in the &lt;a class="link" href="https://docs.gitlab.com/runner/register/index.html" target="_blank" rel="noopener"&#10; &gt;register documentation&lt;/a&gt;. The only difference is that the &lt;code&gt;gitlab-runner&lt;/code&gt; command is executed inside of a Docker container.&lt;/p&gt;&#10;&lt;h2 id="docker-image-installation-and-configuration"&gt;&lt;a href="#docker-image-installation-and-configuration" class="header-anchor"&gt;&lt;/a&gt;Docker image installation and configuration&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Install Docker first:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl -sSL https://get.docker.com/ &lt;span class="p"&gt;|&lt;/span&gt; sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;You need to mount a config volume into the &lt;code&gt;gitlab-runner&lt;/code&gt; container to be used for configs and other resources:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker run -d --name gitlab-runner --restart always &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /srv/gitlab-runner/config:/etc/gitlab-runner &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /var/run/docker.sock:/var/run/docker.sock &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gitlab/gitlab-runner:latest&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; On macOS, use &lt;code&gt;/Users/Shared&lt;/code&gt; instead of &lt;code&gt;/srv&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Or, you can use a config container to mount your custom data volume:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker run -d --name gitlab-runner-config &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /etc/gitlab-runner &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; busybox:latest &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /bin/true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then, run the Runner:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker run -d --name gitlab-runner --restart always &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /var/run/docker.sock:/var/run/docker.sock &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --volumes-from gitlab-runner-config &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gitlab/gitlab-runner:latest&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Register the runner you just launched by following the instructions in the &lt;a class="link" href="https://docs.gitlab.com/runner/register/index.html#docker" target="_blank" rel="noopener"&#10; &gt;Docker section of Registering Runners&lt;/a&gt;. The runner won’t pick up any jobs until it’s registered.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="安装步骤"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e6%ad%a5%e9%aa%a4" class="header-anchor"&gt;&lt;/a&gt;安装步骤&#10;&lt;/h2&gt;&lt;h3 id="获取gitlab-runner秘钥"&gt;&lt;a href="#%e8%8e%b7%e5%8f%96gitlab-runner%e7%a7%98%e9%92%a5" class="header-anchor"&gt;&lt;/a&gt;获取Gitlab Runner秘钥&#10;&lt;/h3&gt;&lt;p&gt;可以通过Gitlab管理员账号获取，也可以让每一个用户自行配置&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;普通用户查看秘钥&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;进入任意一个仓库的设置中，查看CICD配置&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d8f7ec77.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554266163188.png" class="gallery-image" data-flex-basis="148px" data-flex-grow="61" height="776" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d8f7ec77.png" width="480"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;准备注册专用Runner令牌&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d8ff2aa9.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554266217632.png" class="gallery-image" data-flex-basis="179px" data-flex-grow="74" height="612" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d8ff2aa9.png" width="457"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;管理员查看令牌&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;进入总设置页面，配置全局Runner令牌&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d907392b.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554266287842.png" class="gallery-image" data-flex-basis="913px" data-flex-grow="380" height="446" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d907392b.png" width="1698"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="runner注册"&gt;&lt;a href="#runner%e6%b3%a8%e5%86%8c" class="header-anchor"&gt;&lt;/a&gt;Runner注册&#10;&lt;/h3&gt;&lt;p&gt;由于Runner一般运行复杂构建、打包任务，推荐配置在性能、带宽更大的机房&lt;/p&gt;&#10;&lt;h4 id="准备docker环境"&gt;&lt;a href="#%e5%87%86%e5%a4%87docker%e7%8e%af%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;准备Docker环境&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -sSL https://get.docker.com/ &lt;span class="p"&gt;|&lt;/span&gt; sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="注册"&gt;&lt;a href="#%e6%b3%a8%e5%86%8c" class="header-anchor"&gt;&lt;/a&gt;注册&#10;&lt;/h4&gt;&lt;p&gt;可以根据需要选择注册Runner类型&lt;/p&gt;&#10;&lt;p&gt;同时，为了方便配置，使用单行注册并且关闭交互&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/register/index.html#one-line-registration-command" target="_blank" rel="noopener"&#10; &gt;单行注册官方文档&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;命令说明：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;-v&lt;/code&gt;挂载的目的是为了将注册后的配置文件持久化，用于运行容器&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--rm&lt;/code&gt;指定容器运行结束后自动删除停止的容器&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-it&lt;/code&gt;指定使用命令行交互方式运行，便于查看注册结果&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run --rm -it &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /www/wwwroot/gitlab/srv/gitlab-runner/config:/etc/gitlab-runner &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gitlab/gitlab-runner:alpine-v11.8.0 register &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --non-interactive &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --executor &lt;span class="s2"&gt;&amp;#34;docker&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --docker-image docker:stable &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --url &lt;span class="s2"&gt;&amp;#34;Gitlab URL&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --registration-token &lt;span class="s2"&gt;&amp;#34;令牌&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --description &lt;span class="s2"&gt;&amp;#34;描述&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --tag-list &lt;span class="s2"&gt;&amp;#34;标签1,标签2&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --run-untagged &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --docker-privileged &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --locked&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注册成功提示&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d8cb31ce.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554277014308.png" class="gallery-image" data-flex-basis="3007px" data-flex-grow="1253" height="81" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d8cb31ce.png" width="1015"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;此时管理面板显示新的Runner已经注册&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d8db2078.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554277086811.png" class="gallery-image" data-flex-basis="663px" data-flex-grow="276" height="484" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d8db2078.png" width="1339"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="runner-启动"&gt;&lt;a href="#runner-%e5%90%af%e5%8a%a8" class="header-anchor"&gt;&lt;/a&gt;Runner 启动&#10;&lt;/h3&gt;&lt;p&gt;挂载本地配置信息并启动Runner&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -d --name gitlab-runner --restart always &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#9;-v /www/wwwroot/gitlab/srv/gitlab-runner/config:/etc/gitlab-runner &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /var/run/docker.sock:/var/run/docker.sock &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gitlab/gitlab-runner:alpine-v11.8.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此时可见Runner已经保持和Gitlab的联系&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d8c56a69.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554277457677.png" class="gallery-image" data-flex-basis="2026px" data-flex-grow="844" height="158" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d8c56a69.png" width="1334"&gt;&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>DevOps GitLab CICD 实践1——GitLab 部署</title><link>https://blog.fjy8018.top/archives/205/</link><pubDate>Wed, 03 Apr 2019 16:30:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/205/</guid><description>&lt;h2 id="配置目标"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae%e7%9b%ae%e6%a0%87" class="header-anchor"&gt;&lt;/a&gt;配置目标&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;邮件提示&lt;/li&gt;&#10;&lt;li&gt;GitHub第三方授权登陆&lt;/li&gt;&#10;&lt;li&gt;GitLab Runner&lt;/li&gt;&#10;&lt;li&gt;Docker私服注册&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="官方介绍"&gt;&lt;a href="#%e5%ae%98%e6%96%b9%e4%bb%8b%e7%bb%8d" class="header-anchor"&gt;&lt;/a&gt;官方介绍&#10;&lt;/h2&gt;&lt;p&gt;目前微服务盛行环境下，服务部署优先考虑Docker方式，便于迁移和弹性伸缩&lt;/p&gt;&#10;&lt;p&gt;官方镜像介绍 &lt;a class="link" href="https://docs.gitlab.com/omnibus/docker/" target="_blank" rel="noopener"&#10; &gt;GitLab Docker images&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;h1 id="gitlab-docker-images"&gt;&lt;a href="#gitlab-docker-images" class="header-anchor"&gt;&lt;/a&gt;GitLab Docker images&#10;&lt;/h1&gt;&lt;p&gt;Both GitLab CE and EE are in Docker Hub:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://registry.hub.docker.com/u/gitlab/gitlab-ce/" target="_blank" rel="noopener"&#10; &gt;GitLab CE Docker image&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://registry.hub.docker.com/u/gitlab/gitlab-ee/" target="_blank" rel="noopener"&#10; &gt;GitLab EE Docker image&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The GitLab Docker images are monolithic images of GitLab running all the necessary services on a single container.&lt;/p&gt;&#10;&lt;p&gt;In the following examples we are using the image of GitLab CE. To use GitLab EE instead of GitLab CE, replace the image name to &lt;code&gt;gitlab/gitlab-ee:latest&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;If you want to use the latest RC image, use &lt;code&gt;gitlab/gitlab-ce:rc&lt;/code&gt; or &lt;code&gt;gitlab/gitlab-ee:rc&lt;/code&gt; for GitLab CE and GitLab EE respectively.&lt;/p&gt;&#10;&lt;p&gt;The GitLab Docker images can be run in multiple ways:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/docker/#run-the-image" target="_blank" rel="noopener"&#10; &gt;Run the image in Docker Engine&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/docker/#install-gitlab-into-a-cluster" target="_blank" rel="noopener"&#10; &gt;Install GitLab into a cluster&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/docker/#install-gitlab-using-docker-compose" target="_blank" rel="noopener"&#10; &gt;Install GitLab using docker-compose&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="docker-compose-脚本"&gt;&lt;a href="#docker-compose-%e8%84%9a%e6%9c%ac" class="header-anchor"&gt;&lt;/a&gt;docker-compose 脚本&#10;&lt;/h2&gt;&lt;p&gt;此处选择社区版(CE)安装，同时为了便于参数配置，使用&lt;code&gt;docker-compose&lt;/code&gt;方式编写脚本文件&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;h2 id="install-gitlab-using-docker-compose"&gt;&lt;a href="#install-gitlab-using-docker-compose" class="header-anchor"&gt;&lt;/a&gt;Install GitLab using docker-compose&#10;&lt;/h2&gt;&lt;p&gt;With &lt;a class="link" href="https://docs.docker.com/compose/" target="_blank" rel="noopener"&#10; &gt;Docker compose&lt;/a&gt; you can easily configure, install, and upgrade your Docker-based GitLab installation.&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://docs.docker.com/compose/install/" target="_blank" rel="noopener"&#10; &gt;Install&lt;/a&gt; Docker Compose&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Create a &lt;code&gt;docker-compose.yml&lt;/code&gt; file (or &lt;a class="link" href="https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/docker/docker-compose.yml" target="_blank" rel="noopener"&#10; &gt;download an example&lt;/a&gt;):&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;web&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gitlab/gitlab-ce:latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gitlab.example.com&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;GITLAB_OMNIBUS_CONFIG&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; external_url &amp;#39;https://gitlab.example.com&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; # Add any other gitlab.rb configuration here, each on its own line&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;80:80&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;443:443&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;22:22&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;/srv/gitlab/config:/etc/gitlab&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;/srv/gitlab/logs:/var/log/gitlab&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;/srv/gitlab/data:/var/opt/gitlab&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Make sure you are in the same directory as &lt;code&gt;docker-compose.yml&lt;/code&gt; and run &lt;code&gt;docker-compose up -d&lt;/code&gt; to start GitLab&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Read &lt;a class="link" href="https://docs.gitlab.com/omnibus/docker/#pre-configure-docker-container" target="_blank" rel="noopener"&#10; &gt;“Pre-configure Docker container”&lt;/a&gt; to see how the &lt;code&gt;GITLAB_OMNIBUS_CONFIG&lt;/code&gt; variable works.&lt;/p&gt;&#10;&lt;p&gt;Below is another &lt;code&gt;docker-compose.yml&lt;/code&gt; example with GitLab running on a custom HTTP and SSH port. Notice how the &lt;code&gt;GITLAB_OMNIBUS_CONFIG&lt;/code&gt; variables match the &lt;code&gt;ports&lt;/code&gt; section:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;web&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gitlab/gitlab-ce:latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gitlab.example.com&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;GITLAB_OMNIBUS_CONFIG&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; external_url &amp;#39;http://gitlab.example.com:9090&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;gitlab_shell_ssh_port&amp;#39;] = 2224&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;9090:9090&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;2224:22&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;/srv/gitlab/config:/etc/gitlab&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;/srv/gitlab/logs:/var/log/gitlab&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;/srv/gitlab/data:/var/opt/gitlab&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is the same as using &lt;code&gt;--publish 9090:9090 --publish 2224:22&lt;/code&gt;.&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;官方提示说明Docker CE版基于&lt;code&gt;Omnibus&lt;/code&gt;版本，故环境配置也可参考相关文档&lt;/p&gt;&#10;&lt;h3 id="omnibus文档目录"&gt;&lt;a href="#omnibus%e6%96%87%e6%a1%a3%e7%9b%ae%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;Omnibus文档目录&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;h4 id="installation-and-configuration-using-omnibus-package"&gt;&lt;a href="#installation-and-configuration-using-omnibus-package" class="header-anchor"&gt;&lt;/a&gt;Installation and Configuration using omnibus package&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This section describes the commonly used configuration settings. Check &lt;a class="link" href="https://docs.gitlab.com/omnibus/README.html#configuring" target="_blank" rel="noopener"&#10; &gt;configuration&lt;/a&gt; section of the documentation for complete configuration settings.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Installing GitLab&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/manual_install.html" target="_blank" rel="noopener"&#10; &gt;Manually downloading and installing a GitLab package&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab" target="_blank" rel="noopener"&#10; &gt;Setting up a domain name/URL&lt;/a&gt; for the GitLab Instance so that it can be accessed easily&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/settings/nginx.html#enable-https" target="_blank" rel="noopener"&#10; &gt;Enabling HTTPS&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/settings/smtp.html#smtp-settings" target="_blank" rel="noopener"&#10; &gt;Enabling notification EMails&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Enabling replying via email&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/ce/administration/reply_by_email_postfix_setup.html" target="_blank" rel="noopener"&#10; &gt;Installing and configuring postfix&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Enabling container registry on GitLab&#10;&lt;ul&gt;&#10;&lt;li&gt;You will require SSL certificates for the domain used for container registry&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Enabling GitLab Pages&#10;&lt;ul&gt;&#10;&lt;li&gt;If you want HTTPS enabled, you will have to get wildcard certificates&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/integration/elasticsearch.html" target="_blank" rel="noopener"&#10; &gt;Enabling Elasticsearch&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/gitlab-mattermost/README.html" target="_blank" rel="noopener"&#10; &gt;GitLab Mattermost&lt;/a&gt; Set up the Mattermost messaging app that ships with Omnibus GitLab package.&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/ce/administration/monitoring/performance/prometheus.html" target="_blank" rel="noopener"&#10; &gt;GitLab Prometheus&lt;/a&gt; Set up the Prometheus monitoring included in the Omnibus GitLab package.&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/roles/README.html" target="_blank" rel="noopener"&#10; &gt;GitLab High Availability Roles&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;结合配置目标编写yaml文件&lt;/p&gt;&#10;&lt;p&gt;注意：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;此处邮件使用163邮箱（官方没有提供163邮箱支持案例）&lt;/li&gt;&#10;&lt;li&gt;Docker私服公钥执行从私服上获取&lt;/li&gt;&#10;&lt;li&gt;由于特殊原因，目标配置未启动SSL安全连接，但GitLab可以通过简单配置支持SSL并&lt;strong&gt;自动更新证书&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/settings/ssl.html#lets-encrypthttpsletsencryptorg-integration" target="_blank" rel="noopener"&#10; &gt;配置文档&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;h3 id="lets-encrypt-integration"&gt;&lt;a href="#lets-encrypt-integration" class="header-anchor"&gt;&lt;/a&gt;&lt;a class="link" href="https://letsencrypt.org/" target="_blank" rel="noopener"&#10; &gt;Let’s Encrypt&lt;/a&gt; Integration&#10;&lt;/h3&gt;&lt;h4 id="primary-gitlab-instance"&gt;&lt;a href="#primary-gitlab-instance" class="header-anchor"&gt;&lt;/a&gt;Primary GitLab Instance&#10;&lt;/h4&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Introduced in GitLab version &lt;strong&gt;10.5&lt;/strong&gt; and disabled by default. Enabled by default in GitLab version &lt;strong&gt;10.7&lt;/strong&gt; and later if &lt;code&gt;external_url&lt;/code&gt; is set with the &lt;em&gt;https&lt;/em&gt;protocol and no certificates are configured.&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: In order for Let’s Encrypt verification to work correctly, ports 80 and 443 will need to be accessible to the Let’s Encrypt servers that run the validation. Also note that the validation currently &lt;a class="link" href="https://gitlab.com/gitlab-org/omnibus-gitlab/issues/3580" target="_blank" rel="noopener"&#10; &gt;does not work with non-standard ports&lt;/a&gt;.&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;Caution&lt;/strong&gt; Administrators installing or upgrading to GitLab version &lt;strong&gt;10.7&lt;/strong&gt; or later and do not plan on using &lt;strong&gt;Let’s Encrypt&lt;/strong&gt; should set the following in &lt;code&gt;/etc/gitlab/gitlab.rb&lt;/code&gt; to disable:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-properties" data-lang="properties"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;letsencrypt[&amp;#39;enable&amp;#39;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;Add the following entries to &lt;code&gt;/etc/gitlab/gitlab.rb&lt;/code&gt; to enable &lt;strong&gt;Let’s Encrypt&lt;/strong&gt; support for the primary domain:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-properties" data-lang="properties"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;letsencrypt[&amp;#39;enable&amp;#39;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true # GitLab 10.5 and 10.6 require this option&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;external_url&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;https://gitlab.example.com&amp;#34;&#9; # Must use https protocol&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;letsencrypt[&amp;#39;contact_emails&amp;#39;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;[&amp;#39;foo@email.com&amp;#39;] # Optional&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;生成163邮箱授权密码&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d909bef7.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554263126117.png" class="gallery-image" data-flex-basis="397px" data-flex-grow="165" height="567" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d909bef7.png" width="938"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;生成GitHub授权秘钥&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d8fef5f8.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554262788318.png" class="gallery-image" data-flex-basis="945px" data-flex-grow="393" height="311" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d8fef5f8.png" width="1225"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d9022cde.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554262821319.png" class="gallery-image" data-flex-basis="336px" data-flex-grow="140" height="559" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d9022cde.png" width="784"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;最终配置&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;gitlab&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;GITLAB_OMNIBUS_CONFIG&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; external_url &amp;#39;外部访问地址&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;gitlab_shell_ssh_port&amp;#39;] = 外部SSH端口&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; registry_external_url &amp;#39;Docker私服地址&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; registry_nginx[&amp;#39;ssl_certificate&amp;#39;] = &amp;#34;Docker 私服CA证书 crt文件&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; registry_nginx[&amp;#39;ssl_certificate_key&amp;#39;] = &amp;#34;Docker 私服公钥 pem文件&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_enable&amp;#39;] = true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_address&amp;#39;] = &amp;#34;smtp.163.com&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_port&amp;#39;] = 465&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_user_name&amp;#39;] = &amp;#34;邮件发送者名称&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;gitlab_email_from&amp;#39;] = &amp;#39;邮件发送地址&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_password&amp;#39;] = &amp;#34;授权密码&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_domain&amp;#39;] = &amp;#34;163.com&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_authentication&amp;#39;] = &amp;#34;login&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_enable_starttls_auto&amp;#39;] = true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_tls&amp;#39;] = true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;omniauth_enabled&amp;#39;] = true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;omniauth_allow_single_sign_on&amp;#39;] = true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;omniauth_block_auto_created_users&amp;#39;] = true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;omniauth_providers&amp;#39;] = [&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;#34;name&amp;#34; =&amp;gt; &amp;#34;github&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;#34;app_id&amp;#34; =&amp;gt; &amp;#34;Client ID&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;#34;app_secret&amp;#34; =&amp;gt; &amp;#34;Client Secret&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;#34;url&amp;#34; =&amp;gt; &amp;#34;https://github.com/&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;#34;args&amp;#34; =&amp;gt; { &amp;#34;scope&amp;#34; =&amp;gt; &amp;#34;user:email&amp;#34; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; ]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;gitlab/gitlab-ce:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;gitlab.fjy8018.top&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;devops-service-bridge&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;8443:443&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;8099:8099&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;8022:22&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./srv/gitlab/config:/etc/gitlab&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./srv/gitlab/logs:/var/log/gitlab&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./srv/gitlab/data:/var/opt/gitlab&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/etc/docker/certs.d:/etc/docker/certs.d&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;devops-service-bridge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;bridge&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>