<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://blog.17lai.site</id>
    <title>夜法之书 • Posts by &#34;devops&#34; category</title>
    <link href="https://blog.17lai.site" />
    <updated>2023-03-24T13:21:22.000Z</updated>
    <category term="github" />
    <category term="jekyll" />
    <category term="blog" />
    <category term="embeded" />
    <category term="hisilicon" />
    <category term="linux" />
    <category term="driver" />
    <category term="3798m" />
    <category term="mpp" />
    <category term="unf" />
    <category term="kernel" />
    <category term="gitlab" />
    <category term="git" />
    <category term="crack" />
    <category term="hardlink" />
    <category term="bt" />
    <category term="pt" />
    <category term="qnap" />
    <category term="硬盘" />
    <category term="nas" />
    <category term="markdown" />
    <category term="picgo" />
    <category term="wiz" />
    <category term="joplin" />
    <category term="typora" />
    <category term="3G" />
    <category term="4G" />
    <category term="3531a" />
    <category term="移植" />
    <category term="嵌入式" />
    <category term="宝塔" />
    <category term="vps" />
    <category term="建站" />
    <category term="nginx" />
    <category term="apache" />
    <category term="mysql" />
    <category term="docker" />
    <category term="lamp" />
    <category term="php" />
    <category term="tomcat" />
    <category term="registry" />
    <category term="教程" />
    <category term="email" />
    <category term="https" />
    <category term="ssl" />
    <category term="debian" />
    <category term="laptop" />
    <category term="ed2k" />
    <category term="ati" />
    <category term="qbittorrent" />
    <category term="ssd" />
    <category term="hdd" />
    <category term="transmission" />
    <category term="pdca" />
    <category term="5w2h" />
    <category term="smart" />
    <category term="swot" />
    <category term="grow" />
    <category term="okr" />
    <category term="wbs" />
    <category term="启动" />
    <category term="emby" />
    <category term="sonarr" />
    <category term="jeckett" />
    <category term="portainer" />
    <category term="tls" />
    <category term="隐私" />
    <category term="安全" />
    <category term="优化" />
    <category term="gitbook" />
    <category term="mariadb" />
    <category term="note" />
    <category term="mermaid" />
    <category term="webdav" />
    <category term="hexo" />
    <category term="matery" />
    <category term="npm" />
    <category term="web" />
    <category term="http" />
    <category term="css" />
    <category term="js" />
    <category term="ai" />
    <category term="face" />
    <category term="3a" />
    <category term="ae" />
    <category term="image" />
    <category term="ccs" />
    <category term="vim" />
    <category term="ide" />
    <category term="music" />
    <category term="韩红" />
    <category term="thinkpad" />
    <category term="sound" />
    <category term="speaker" />
    <category term="刮削" />
    <category term="musicbrainz" />
    <category term="mp3tag" />
    <category term="tmm" />
    <category term="字幕" />
    <category term="plex" />
    <category term="cmake" />
    <category term="develop" />
    <category term="ipv6" />
    <category term="traefik" />
    <category term="proxy" />
    <category term="swarm" />
    <category term="ubuntu" />
    <category term="vscode" />
    <category term="插件" />
    <category term="编码" />
    <category term="plantuml" />
    <category term="mathjax" />
    <category term="ci/cd" />
    <category term="earthly" />
    <category term="mstream" />
    <category term="selfhost" />
    <category term="中岛美嘉" />
    <category term="node" />
    <category term="jenkins" />
    <category term="shell" />
    <category term="tools" />
    <category term="winrar" />
    <category term="emoji" />
    <category term="isp" />
    <category term="awb" />
    <category term="mywork" />
    <category term="cdn" />
    <category term="seo" />
    <category term="fitness" />
    <category term="健身" />
    <category term="运动" />
    <category term="devops" />
    <category term="k8s" />
    <category term="harbor" />
    <category term="pmbok" />
    <category term="管理" />
    <category term="ipd" />
    <category term="绩效" />
    <category term="drowio" />
    <category term="man" />
    <category term="框架" />
    <category term="图解" />
    <category term="doxygen" />
    <category term="bash" />
    <category term="中医" />
    <category term="西医" />
    <category term="文化历史" />
    <category term="竞品分析" />
    <category term="rss" />
    <category term="rsshub" />
    <category term="社会观察" />
    <category term="知识" />
    <category term="智慧" />
    <category term="os" />
    <category term="自制" />
    <category term="编译器" />
    <category term="C" />
    <category term="compiler" />
    <category term="驱动" />
    <category term="sensor" />
    <category term="故事" />
    <category term="nodeppt" />
    <category term="echarts" />
    <category term="写作" />
    <category term="vercel" />
    <category term="potplayer" />
    <category term="action" />
    <category term="workflow" />
    <category term="概率" />
    <category term="普朗克" />
    <category term="投资" />
    <category term="理财" />
    <category term="金融" />
    <category term="yandex" />
    <category term="source" />
    <category term="hack" />
    <category term="download" />
    <category term="chatgpt" />
    <category term="openai" />
    <category term="calibre" />
    <category term="douban" />
    <category term="book" />
    <category term="不可能三角" />
    <category term="waline" />
    <category term="IPD" />
    <category term="MM方法论" />
    <category term="端到端" />
    <category term="信用卡" />
    <category term="定制服务器" />
    <category term="search" />
    <category term="开源" />
    <category term="读书评鉴" />
    <category term="穿越必备" />
    <category term="易学" />
    <category term="高考" />
    <category term="专业" />
    <category term="google" />
    <category term="人性" />
    <category term="人格分析" />
    <category term="profile" />
    <category term="tampermonkey" />
    <category term="zhihu" />
    <category term="csdn" />
    <category term="juejin" />
    <category term="webhook" />
    <category term="密码" />
    <category term="bitwarden" />
    <category term="office" />
    <category term="kms" />
    <category term="破解" />
    <category term="健康" />
    <category term="恢复" />
    <category term="养生" />
    <category term="刀郎" />
    <category term="study" />
    <category term="english" />
    <category term="雅思" />
    <category term="umami" />
    <category term="windows" />
    <category term="垃圾清理" />
    <category term="速度优化" />
    <category term="阳历" />
    <category term="阴历" />
    <category term="阴阳和历" />
    <category term="天干" />
    <category term="地支" />
    <category term="热水器" />
    <category term="维护" />
    <category term="汽车" />
    <category term="测速" />
    <category term="nat" />
    <category term="光猫" />
    <category term="ipfs" />
    <category term="zlibrary" />
    <category term="sql" />
    <category term="postgresql" />
    <category term="sqlite" />
    <category term="dns" />
    <category term="smartdns" />
    <category term="dnsmasq" />
    <category term="物理" />
    <category term="广义相对论" />
    <category term="科学" />
    <category term="侠义相对论" />
    <category term="高薪" />
    <category term="传媒" />
    <category term="llm" />
    <category term="api" />
    <category term="免费" />
    <category term="ollama" />
    <entry>
        <id>https://blog.17lai.site/posts/bd70a73c/</id>
        <title>开源观察之到底是谁在主导开源软件生态的发展？</title>
        <link rel="alternate" href="https://blog.17lai.site/posts/bd70a73c/"/>
        <content type="html">&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;很多人对于开源生态误解很深，这里对开源软件生态的一些介绍和解释，使用ChatGPT辅助编写了一篇对于外行的介绍，使其可以快速了解开源生态&lt;/p&gt;
&lt;/blockquote&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2023/03/24/20230324213857.webp&#34; alt=&#34;Open Source&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;对话开源&#34;&gt;对话开源&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;使用了很多很久的开源软件，也参与了一些开源软件的发展，现在软件的选择首选的就是开源软件，对于开源软件生态算是有一个初步的了解和映像。很多外行对于开源有一些错误的认知，很早就有写一篇关于开源生态的文章了，最近使用ChatGPT辅助，很快就完成了一篇文章。&lt;/p&gt;
&lt;p&gt;在思考是否把对话过程整理成文之后，最终决定还是保留交流对话的过程！&lt;/p&gt;
&lt;p&gt;ChatGPT很强大，但你也得具备很多专业知识才能用好它&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;chat-container&#34;&gt;
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;开源软件是什么&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;开源软件指的是源代码可以被公开查看、使用、修改和分发的软件。与之相对的是闭源软件，它的源代码是私有的，不公开供大众使用和修改。&lt;/p&gt;
&lt;p&gt;开源软件的特点是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;可以被公开查看和修改：任何人都可以查看开源软件的源代码，并且可以根据自己的需要进行修改和定制。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可以被免费使用：大部分开源软件都是免费提供给用户使用的，用户不需要支付版权费用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;具有较高的安全性：由于源代码公开，开源软件的漏洞和安全问题可以被更多人发现和修复，从而提高了软件的安全性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;具有良好的社区支持：开源软件通常有一个庞大的社区支持，用户可以通过社区获得帮助、交流和分享。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可以被广泛应用和推广：由于开源软件具有免费和开放的特点，它可以被广泛应用和推广，从而提高了软件的影响力和普及率。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;常见的开源软件有Linux操作系统、Apache Web服务器、MySQL数据库、Firefox浏览器、WordPress网站建设平台等等。开源软件已经成为现代软件开发中的重要组成部分，为用户和开发者带来了诸多的好处。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;开源软件的优点是什么&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;开源软件有以下优点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;透明性：开源软件的源代码是公开的，用户可以查看代码并了解软件的实现原理，这种透明性使得用户可以更好地理解软件的功能和运行机制。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;自由度：开源软件的用户可以自由地复制、分发、修改和使用软件，而且不需要支付任何费用。这种自由度使得用户可以根据自己的需要来定制软件，从而更好地满足自己的需求。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安全性：由于开源软件的源代码是公开的，任何人都可以查看代码并发现其中的漏洞和安全问题，这种开放的审查机制可以使得开源软件具有更高的安全性和稳定性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可定制性：开源软件通常具有很好的可定制性，用户可以根据自己的需求和特定的场景对软件进行修改和定制，从而更好地满足自己的需求。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;社区支持：由于开源软件的用户和开发者通常组成一个庞大的社区，这种社区可以为用户提供技术支持、问题解答、开发经验和资源共享等支持。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;兼容性：开源软件通常具有更好的兼容性，因为开源软件通常遵循开放标准，不受私有标准的限制，可以更好地与其他软件和系统进行协作。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;综上所述，开源软件的优点包括透明性、自由度、安全性、可定制性、社区支持和兼容性等。这些优点使得开源软件成为现代软件开发中不可或缺的一部分，为用户和开发者带来了巨大的价值和好处。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;那么，开源软件有什么缺点了？&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;虽然开源软件具有很多优点，但也存在一些缺点，包括以下几个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;缺乏专业支持：开源软件通常由社区维护和支持，缺乏专业支持，这可能导致用户在使用和维护软件时遇到困难。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可能存在安全问题：虽然开源软件的源代码可以被公开审查，但这也可能导致黑客更容易找到软件中的漏洞和安全问题，因此开源软件也需要及时修复漏洞以保障安全。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;兼容性问题：虽然开源软件通常遵循开放标准，但在实际应用中，与其他软件或系统的兼容性可能存在问题，这可能会导致软件无法正常工作。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;学习成本较高：由于开源软件的源代码是公开的，用户可能需要具有一定的编程知识和技能才能进行定制和修改，因此需要付出一定的学习成本。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可能存在版本更新不及时的问题：由于开源软件通常由社区维护，因此可能存在版本更新不及时的问题，用户需要自己去维护和更新软件，这可能会增加用户的工作量。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;综上所述，开源软件的缺点包括缺乏专业支持、安全问题、兼容性问题、学习成本较高和版本更新不及时等。对于这些缺点，用户可以通过选择专业的开源软件提供商、参与社区维护和支持、及时更新软件版本等方式来解决。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;只要投入金钱，开源软件的这些问题可以解决么&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;投入金钱确实可以解决一些开源软件存在的问题，例如提供专业支持、加强软件安全等，但并不能完全解决所有问题。以下是一些例子：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;提供专业支持：企业可以选择购买专业的开源软件支持服务，获得专业的技术支持、问题解答和定制服务，从而解决由于缺乏专业支持而导致的困难。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;加强软件安全：企业可以选择购买安全软件，对开源软件进行加固和安全管理，从而提高软件的安全性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;定制和维护：企业可以选择雇佣开源软件开发人员，进行定制和维护，从而解决开源软件的兼容性和版本更新等问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;增加社区投入：企业可以向开源社区投入资金，促进社区的发展和维护，从而帮助解决一些开源软件存在的问题。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;然而，开源软件的自由性和透明性也意味着，用户可以根据自己的需求和资源选择是否投入金钱。在一些情况下，投入金钱可能并不是必要的，用户可以通过自己的努力和学习来解决开源软件存在的问题。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;redhat就是一家很成功的开源软件公司，并创造了巨大的利润，redhat的商业模式是否解决了开源软件的问题&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;Red Hat 确实是一家非常成功的开源软件公司，它的商业模式可以说是解决了开源软件的问题之一。Red Hat 的商业模式主要是基于以下两个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;提供专业支持：Red Hat 提供针对企业级用户的 Linux 操作系统和其他开源软件的专业支持，包括技术支持、培训、咨询和服务等，这可以解决企业在使用和维护开源软件时遇到的困难。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;付费订阅服务：Red Hat 基于其开源软件产品提供付费订阅服务，订阅用户可以获得 Red Hat 官方提供的软件更新、安全修复、新功能和技术支持等服务，这可以解决开源软件版本更新和安全性问题。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Red Hat 的商业模式的成功不仅在于它提供了专业的支持和服务，而且在于其能够让企业在同时获得开源软件的好处和商业化的优势。Red Hat 的开源软件产品在大多数情况下是免费的，但企业需要付费订阅服务才能获得更好的服务和支持，这既保证了开源软件的自由性和透明性，又能够为企业提供可靠的商业支持。&lt;/p&gt;
&lt;p&gt;总之，Red Hat 的商业模式是非常成功的，但并不能完全解决所有开源软件存在的问题。其他开源软件公司和社区也在不断探索和创新商业模式，以解决开源软件存在的问题。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;在互联网领域，几乎都是使用的开源软件，未来，开源软件会统治所有的互联网标准么？&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;开源软件在互联网领域确实得到了广泛的应用，成为了很多公司和组织选择的首选。然而，要说开源软件会统治所有的互联网标准，还是有一定的困难。&lt;/p&gt;
&lt;p&gt;首先，虽然开源软件在很多领域已经达到了很高的水平，但在某些特定领域，闭源软件仍然具有更好的性能和效率。例如，在一些高性能计算领域，闭源软件仍然是不可替代的选择。&lt;/p&gt;
&lt;p&gt;其次，开源软件也存在一些问题和限制。例如，开源软件的发展和更新速度可能会比较慢，有时候可能存在安全和兼容性问题，需要用户花费时间和精力进行自我调试和维护。&lt;/p&gt;
&lt;p&gt;最后，由于开源软件的自由性和透明性，它们存在着无法控制的风险。如果在开源软件的代码中存在漏洞或安全问题，攻击者可以很容易地获取代码并利用其中的漏洞进行攻击。这可能会对企业和组织的安全带来潜在风险。&lt;/p&gt;
&lt;p&gt;综上所述，虽然开源软件在互联网领域中得到了广泛应用，但是它们并不一定会成为统治所有互联网标准的唯一选择。在未来，我们可能会看到开源软件和闭源软件之间的协同发展，以提供更好的解决方案。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;但是，我看到，越来越多的闭源软件公司倒闭了，或者转为开源软件模式，例如firefox，谷歌的chrome，开源软件的占比越来越高，你有什么看法&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;是的，确实有越来越多的闭源软件公司倒闭或者转为开源软件模式，而开源软件在互联网领域中的占比也越来越高。这是因为开源软件具有很多优势，包括透明性、自由性、灵活性、可定制性等，而这些优势正好能够满足当前互联网应用的需求。&lt;/p&gt;
&lt;p&gt;另外，随着云计算和开放云平台的发展，开源软件也得到了更多的应用机会。云计算和开放云平台为开源软件提供了更好的部署和使用方式，同时也提高了开源软件在企业和组织中的接受度和应用价值。&lt;/p&gt;
&lt;p&gt;最后，开源软件社区的活跃度和贡献者数量也在不断增加，这进一步促进了开源软件的发展和普及。开源软件社区的活跃度和贡献者数量越多，开源软件的功能和性能就越强大，这也让更多的企业和组织愿意选择开源软件。&lt;/p&gt;
&lt;p&gt;综上所述，开源软件在互联网领域中的占比确实越来越高，这是因为开源软件具有很多优势，并且得到了更多的应用机会和社区支持。不过，仍然需要注意开源软件本身的一些问题和限制，并且需要根据实际情况选择最适合自己的软件解决方案。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;开源软件是由谁主导的？&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;开源软件的开发和推广通常是由开源社区和贡献者主导的。这些社区由一群热爱技术和开源理念的人组成，他们相信共享和协作的力量，致力于开发和维护开源软件项目。&lt;/p&gt;
&lt;p&gt;开源社区是由志愿者、爱好者、开发者和公司等组成的多方参与的群体，其成员之间通过互相交流和合作来推动软件的开发和改进。开源社区通常拥有完善的组织结构和开发流程，例如开发者的代码提交、审查和合并流程、用户的反馈和贡献流程等，这些流程可以帮助开发者更好地协作、沟通和共同推进软件的发展。&lt;/p&gt;
&lt;p&gt;除了开源社区，一些公司也在开源软件的发展中扮演了重要的角色。这些公司可以是开源软件的赞助者、贡献者或用户，也可以是基于开源软件构建自己产品和服务的企业。一些知名的开源软件公司，例如Red Hat、Canonical、MongoDB等，不仅为开源社区提供了财务和技术上的支持，同时也为企业用户提供了开源软件的商业服务和支持，从而帮助开源软件在企业中得到更广泛的应用。&lt;/p&gt;
&lt;p&gt;总之，开源软件的开发和推广主要由开源社区和贡献者主导，同时得到了一些公司的支持和参与。这种多方参与的开发模式可以使得开源软件具有更广泛的用户和应用范围，也可以让软件得到更多人的参与和贡献，从而推动软件的不断发展和完善。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;有人或者组织能够独裁控制开源软件走向么？例如只支持某个操作系统，或者不准某些企业或国家使用&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;在开源软件的开发和推广过程中，由于开放的自由性和民主性，很难有人或组织能够完全独裁控制开源软件的走向和应用范围。这是因为开源软件是基于开放源代码的共享和协作模式，其代码和文档等资源都是公开的，并且可以被其他人自由地使用、修改和再分发。&lt;/p&gt;
&lt;p&gt;开源软件通常采用自由软件许可证进行授权，这些许可证保障了用户的自由，例如选择软件的使用、复制、修改和再分发等。这些自由是在法律框架下保护的，因此，无论是个人、企业还是国家，都可以使用和参与开源软件的开发和推广。&lt;/p&gt;
&lt;p&gt;开源软件的发展和应用也是一个开放和民主的过程，任何人都可以参与到开源社区中，提交代码、提出建议和反馈、进行讨论等等，从而共同推动软件的发展和改进。在开源社区中，没有人或组织能够完全控制软件的走向和应用范围，而是基于开放和民主的原则，通过共同协作和讨论来制定和决定软件的发展方向和应用范围。&lt;/p&gt;
&lt;p&gt;因此，开源软件的开放性和民主性是其成功的关键之一，也是其能够避免独裁控制的重要保障。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;你对谷歌禁止华为使用android，导致华为开发鸿蒙操作系统有什么看法&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;谷歌决定禁止向华为提供Android许可证，导致华为无法获得最新的Android更新和支持。这一决定是由于华为与美国政府的关系引起的，谷歌也只是在执行美国政府的规定。这对华为造成了一定的影响，需要花费更多的时间和资源开发自己的操作系统。&lt;/p&gt;
&lt;p&gt;从另一个角度来看，这也提醒了人们开源软件的优势，即开放的自由性和可控性。由于Android的源代码是公开的，华为可以根据自身需求自主开发和修改操作系统，降低了对其他公司的依赖和控制。这也促使华为加快了自主操作系统鸿蒙的研发和推广，增强了技术自主性和可控性。&lt;/p&gt;
&lt;p&gt;总的来说，谷歌禁止华为使用Android虽然给华为带来了一定的困扰，但也加快了自主操作系统的研发和推广，体现了开源软件的优势和技术自主性的重要性。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;我看到现实生活中，谁掌握了金钱，谁有大量的工程师开发人员，谁就有能力创建分支，或者主导开源软件的走向，对么？&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;在某种程度上，金钱和人力资源的掌控确实可以对开源软件的走向产生一定的影响。但是，开源软件的社区是由广泛的利益相关方组成的，不仅包括了公司和组织，也包括了个人用户和开发者。在这个社区中，每个人都有权利和能力发表自己的意见和建议，参与到开源软件的开发和讨论中。&lt;/p&gt;
&lt;p&gt;因此，即使某些公司或组织拥有更多的资源和影响力，但是也需要考虑到广泛的利益相关方的需求和利益。如果一个公司或组织试图独断地掌控开源软件的走向，可能会面临社区成员的反对和抵制。此外，开源软件的代码是公开的，任何人都可以自由地复制、修改和分支，因此即使某个公司或组织试图掌控某个开源软件，也无法完全控制其走向。&lt;/p&gt;
&lt;p&gt;因此，开源软件的发展是由整个社区共同推动和影响的，任何单一的利益相关方都无法完全控制其走向。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;你对oracle收购mysql后，mysql的创始人出走，创建mariadb，有什么看法&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;Oracle收购MySQL后，MySQL的创始人Michael Widenius确实离开了Oracle，随后创建了MariaDB这个分支，这也是开源软件的一种特点，任何人都可以基于原有代码分支出去创建一个新的项目，这样可以实现更加个性化的需求和自由度。&lt;/p&gt;
&lt;p&gt;从MariaDB的角度来看，他们希望继续发展MySQL所代表的关系数据库的优点，并且希望推出一些新的功能和特性，以此吸引更多的用户。同时，MariaDB也注重开源社区的参与和贡献，这一点和MySQL的开源文化类似。在开源软件的世界里，分支和创新是非常普遍的现象，而这些分支往往会针对特定的用户需求，从而推出更加优秀的解决方案。&lt;/p&gt;
&lt;p&gt;总的来说，Oracle收购MySQL后，MySQL的创始人离开创建MariaDB，也展现了开源软件的另外一种特点，即开源社区的自由度和创新性，任何人都可以基于原有代码进行修改和分支，从而创建出更适合自己需求的解决方案。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;我看到，越来越多的大公司采用开源的模式开发软件，谁不做开源，谁就会被业界淘汰，这种说法对么&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;在当前的软件开发领域，开源软件确实已经变得越来越普遍，越来越多的大公司也开始采用开源的模式进行软件开发，这是因为开源软件具有很多优点，比如可以节约成本、提高软件质量、增加开发效率等等。因此，采用开源的模式来开发软件的公司和项目越来越多，这也是一种趋势。&lt;/p&gt;
&lt;p&gt;然而，不能简单地说谁不做开源就会被业界淘汰。闭源软件也有其存在的合理性，比如有些公司需要保护商业机密或是保持技术优势等等，因此不会选择开源软件。此外，对于某些领域或特定的应用场景，闭源软件可能会更为适合。&lt;/p&gt;
&lt;p&gt;总之，开源软件的普及是一个趋势，但是不能简单地说谁不做开源就会被业界淘汰，应该根据具体情况来选择采用开源还是闭源的方式。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;你了解v2ray, v2fly, xray之间的关系么，这对于了解开源软件的分裂和发展是一个很好地观察对象&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;是的，我了解v2ray、v2fly和xray之间的关系。这三个项目都是开源的代理软件，都基于v2ray核心代码开发而来，但是它们之间又有一些不同之处。&lt;/p&gt;
&lt;p&gt;v2ray是最早的一个项目，由一个叫做&amp;quot;逆向太阳&amp;quot;的开发者发起，并得到了很多社区贡献者的支持。后来，由于一些开发方面的分歧，v2ray的主要开发者&amp;quot;逆向太阳&amp;quot;和其他核心开发者决裂，最终导致了v2ray项目的分裂。&lt;/p&gt;
&lt;p&gt;v2fly是在v2ray分裂后成立的一个新项目，由一些原来的v2ray社区贡献者和其他开发者组成的团队共同开发，旨在继续推进v2ray的发展。与v2ray不同的是，v2fly更加注重用户体验，提供了更加友好的界面和更多的功能。&lt;/p&gt;
&lt;p&gt;xray是最近出现的一个项目，也是基于v2ray核心代码开发而来，但是它在性能方面进行了很大的优化，并增加了一些新的功能。与v2ray和v2fly不同的是，xray由一个商业公司进行开发和支持。&lt;/p&gt;
&lt;p&gt;这三个项目之间的关系反映了开源软件的分裂和发展的一般规律。在开源社区中，由于人员变动、技术分歧、商业利益等因素的影响，很容易出现项目分裂的情况，而且分裂后的项目往往会根据各自的方向和目标进行不同的发展。但是，这些项目之间也会有合作和交流，共同推进整个领域的发展。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;对于一些新的操作系统挑战者，只能选择开源的方式才能和闭源的微软操作系统相对抗，对么？&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;可以这么说。操作系统是一个非常复杂的软件系统，需要大量的研发资源和技术积累才能打造出一款稳定、安全、易用的产品。相对于成熟的闭源操作系统，新的操作系统挑战者往往面临着技术和资源上的巨大压力。选择开源的方式，可以借鉴已有的开源技术和社区资源，降低开发成本和风险，提高开发效率。同时，开源的方式也可以吸引更多的开发者和用户参与到项目中来，形成一个更加广泛的社区和生态系统，增强产品的可持续发展能力。因此，对于一些新的操作系统挑战者来说，选择开源的方式确实是一个比较明智的选择。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;开源就是免费，对么？&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;不完全正确。开源软件和免费软件是不同的概念。开源软件是指软件源代码开放给公众，并允许公众在遵循特定协议的情况下自由使用、修改、分发和分享的软件。而免费软件是指在价格上免费提供给用户使用的软件，这并不意味着软件的源代码一定是开放的。实际上，开源软件往往是免费的，因为任何人都可以自由获取和使用源代码来构建软件。但是，也有一些开源软件提供商会提供商业版的软件，这些商业版的软件可能是收费的。因此，开源软件不一定就是免费的，而且免费软件也不一定就是开源的。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message user&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/2.jpg&#34; 
               alt=&#34;User&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;开源有哪些协议，商用使用能用那些协议的软件？&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      
        &lt;div class=&#34;chat-message assistant&#34;&gt;
          &lt;img no-lazy class=&#34;avatar&#34; 
               src=&#34;/medias_webp/avatar/1.jpg&#34; 
               alt=&#34;Assistant&#34;&gt;
          &lt;div class=&#34;chat-content&#34;&gt;&lt;p&gt;开源软件有很多种协议，其中比较常见的包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;GNU通用公共许可证（GPL）：允许自由使用、修改、发布和再授权源代码，但只有在使用相同的许可证下发布其衍生作品。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BSD许可证：允许自由使用、修改、发布和再授权源代码，但要求在衍生作品中包含原始版权声明和许可证。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MIT许可证：允许自由使用、修改、发布和再授权源代码，但不需要在衍生作品中包含原始版权声明和许可证。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apache许可证：允许自由使用、修改、发布和再授权源代码，但要求在衍生作品中包含原始版权声明、许可证和贡献者声明。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;商用使用开源软件需要注意的是，不同的开源协议有不同的限制和要求。一些协议（如MIT许可证）对商业使用没有限制，而其他协议（如GPL许可证）可能会要求发布衍生作品的源代码，或者要求将使用的其他组件的源代码公开。因此，在商业使用开源软件之前，需要仔细阅读相关的许可证并遵守其规定。&lt;/p&gt;
&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
&lt;h2 id=&#34;参考-致谢&#34;&gt;参考&amp;amp;致谢&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;chatGPT&lt;/li&gt;
&lt;/ul&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10/dist/style.css&#34;&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/d3@7&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-view@0.18.10&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10&#34;&gt;&lt;/script&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;/css/markmap.css&#34;&gt;

&lt;script src=&#34;/js/markmap.js&#34;&gt;&lt;/script&gt;
</content>
        <category term="devops" />
        <category term="chatgpt" />
        <category term="开源" />
        <updated>2023-03-24T13:21:22.000Z</updated>
    </entry>
    <entry>
        <id>https://blog.17lai.site/posts/78c3371/</id>
        <title>那些有用的Github工具介绍！Action、app、workflow等</title>
        <link rel="alternate" href="https://blog.17lai.site/posts/78c3371/"/>
        <content type="html">&lt;blockquote&gt;
&lt;p&gt;Github Actoins 是 GitHub 推出的持续集成 (Con­tin­u­ous in­te­gra­tion，简称 CI) 服务，它提供了配置非常不错的虚拟服务器环境，基于它可以进行构建、测试、打包、部署项目。是CICD的强力工具！&lt;/p&gt;
&lt;p&gt;本文介绍几个常用的极为有用的Action工具！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706.webp&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;GitHub-Actions-是什么？&#34;&gt;GitHub Actions 是什么？&lt;/h2&gt;
&lt;p&gt;大家知道，持续集成由很多操作组成，比如抓取代码、运行测试、登录远程服务器，发布到第三方服务等等。GitHub 把这些操作就称为 actions。&lt;/p&gt;
&lt;p&gt;很多操作在不同项目里面是类似的，完全可以共享。GitHub 注意到了这一点，想出了一个很妙的点子，允许开发者把每个操作写成独立的脚本文件，存放到代码仓库，使得其他开发者可以引用。&lt;/p&gt;
&lt;p&gt;如果你需要某个 action，不必自己写复杂的脚本，直接引用他人写好的 action 即可，整个持续集成过程，就变成了一个 actions 的组合。这就是 GitHub Actions 最特别的地方。&lt;/p&gt;
&lt;p&gt;GitHub 做了一个&lt;a href=&#34;https://github.com/marketplace?type=actions&#34;&gt;官方市场&lt;/a&gt;，可以搜索到他人提交的 actions。另外，还有一个 &lt;a href=&#34;https://github.com/sdras/awesome-actions&#34;&gt;awesome actions&lt;/a&gt; 的仓库，也可以找到不少 action。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-1.webp&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;上面说了，每个 action 就是一个独立脚本，因此可以做成代码仓库，使用&lt;code&gt;userName/repoName&lt;/code&gt;的语法引用 action。比如，&lt;code&gt;actions/setup-node&lt;/code&gt;就表示&lt;code&gt;github.com/actions/setup-node&lt;/code&gt;这个&lt;a href=&#34;https://github.com/actions/setup-node&#34;&gt;仓库&lt;/a&gt;，它代表一个 action，作用是安装 Node.js。事实上，GitHub 官方的 actions 都放在 &lt;a href=&#34;https://github.com/actions&#34;&gt;github.com/actions&lt;/a&gt; 里面。&lt;/p&gt;
&lt;p&gt;更多 Github action 介绍&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sdras/awesome-actions&#34;&gt;awesome-actions&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;Github-Action-使用限制：&#34;&gt;Github Action 使用限制：&lt;/h2&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.github.com/cn/actions/learn-github-actions/usage-limits-billing-and-administration&#34;&gt;官方文档：使用限制、计费和管理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;在复刻公共仓库时，默认情况下将禁用计划的工作流程。&lt;/li&gt;
&lt;li&gt;在公共仓库中，当 60 天内未发生仓库活动时，将自动禁用计划的工作流程。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;每个仓库只能同时支持20个 workflow 并行。&lt;/li&gt;
&lt;li&gt;每小时可以调用1000次 GitHub API 。&lt;/li&gt;
&lt;li&gt;每个 job 最多可以执行6个小时。&lt;/li&gt;
&lt;li&gt;免费版的用户最大支持20个 job 并发执行，macOS 最大只支持5个。&lt;/li&gt;
&lt;li&gt;私有仓库每月累计使用时间为2000分钟，超过后$ 0.008/分钟，公共仓库则无限制。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;Github-仓库与上游自动同步&#34;&gt;Github 仓库与上游自动同步&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;保持自己github的forks自动和上游仓库同步的&lt;/p&gt;
&lt;p&gt;信息来源于 &lt;a href=&#34;https://github.com/wei/pull&#34;&gt;https://github.com/wei/pull&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;只同步默认分支的教程&#34;&gt;只同步默认分支的教程&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;当上游的仓库仅有一个默认分支。或者上游仓库有两个分支，我们仅需要同步他的默认分支，其他分支对内容对我们来说无关紧要。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-2.webp&#34; alt=&#34;git1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;a)  登录自己的github账号，另开网页打开 &lt;a href=&#34;https://github.com/wei/pull&#34;&gt;https://github.com/wei/pull&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;b)  点击Pull app进行安装。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-3.webp&#34; alt=&#34;git2.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;c)  安装过程中会让你选择要选择那一种方式，All repositories(就是同步已经frok的仓库以及未来fork的仓库)，Only select repositories(仅选择要自己需要同步的仓库，其他fork的仓库不会被同步)，根据自己需求选择，实在不知道怎么选择，就选All repositories；点击install，完成安装。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-4.webp&#34; alt=&#34;git3.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;d)  后续，如果要调整1.c中的选项，打开 &lt;a href=&#34;https://github.com/apps/pull&#34;&gt;https://github.com/apps/pull&lt;/a&gt; ，点击Configure，输入github密码进入pull的相关设置。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-5.webp&#34; alt=&#34;git4.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;e)  进入后，找到Repository access，根据自己的需求，重新选择：All repositories(就是同步已经frok的仓库以及未来fork的仓库)，Only select repositories(仅选择要自己需要同步的仓库，其他fork的仓库不会被同步)，Save后保存生效。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-6.webp&#34; alt=&#34;git5.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;f)  Pull app作者虽然在项目中写道keeps your forks up-to-date with upstream via automated pull requests，但当上游仓库有更改时，自己的仓库会在3个小时内完成与上游的同步，3个小时是Pull app作者说的最长时间。当然也可以通过手动触发同步上游仓库，手动触发方式：&lt;code&gt;https://pull.git.ci/process/你的GitHub名字/你的仓库名字&lt;/code&gt; （例如：&lt;code&gt;https://pull.git.ci/process/xxxxx/test&lt;/code&gt; ），手动触发可能会进行人机验证，验证通过后会显示Success。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-7.webp&#34; alt=&#34;git12.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-8.webp&#34; alt=&#34;git13.jpg&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;同步其他分支的教程&#34;&gt;同步其他分支的教程&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-9.webp&#34; alt=&#34;git8.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;a)  假设你fork了上游仓库后，你fork后的地址为 &lt;code&gt;https://github.com/你的仓库名字/test&lt;/code&gt; ，首先设置完成第1部分内容，注意在1.c步骤没有设置全部同步的，要回到1.e步，确认是否设置同步了 &lt;code&gt;你的仓库名字/test&lt;/code&gt;，如果没有,请添加上。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-10.webp&#34; alt=&#34;git9.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;b)  在默认分支下添加一个文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-11.webp&#34; alt=&#34;git10.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;c)  复制 &lt;code&gt;.github/pull.yml&lt;/code&gt; 粘贴后看到以下页面，注意github前面的那个.别漏掉了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-12.webp&#34; alt=&#34;git11.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;d)  请在&lt;a href=&#34;https://github.com/wei/pull%5C#advanced-setup-with-config&#34;&gt;https://github.com/wei/pull\#advanced-setup-with-config&lt;/a&gt; 页复制代码，&lt;/p&gt;
&lt;p&gt;注意：upstream处要修改为上游仓库作者名字。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-13.webp&#34; alt=&#34;git12.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-14.webp&#34; alt=&#34;git13.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;e)  最终的示例如下，假设上游作者是zhangsan，所有的注意点都用红线圈出来了，保存后生效。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-15.webp&#34; alt=&#34;git14.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;f)  Pull app作者虽然在项目中写道keeps your forks up-to-date with upstream via automated pull requests，但当上游仓库有更改时，自己的仓库会在3个小时内完成与上游的同步，3个小时是Pull app作者说的最长时间。当然也可以通过手动触发同步上游仓库，手动触发方式：&lt;code&gt;https://pull.git.ci/process/你的GitHub名字/你的仓库名字&lt;/code&gt; （例如：&lt;code&gt;https://pull.git.ci/process/xxxxx/test&lt;/code&gt;），手动触发可能会进行人机验证，验证通过后会显示Success。具体见1.f提供的图片。&lt;/p&gt;
&lt;p&gt;g)  本人仅测试过forks一个仓库只有2个分支的项目，如果有多个分支，不能保证是否可行，请自行测试，或者是使用本教程第3部分高级玩法。&lt;/p&gt;
&lt;h3 id=&#34;高级玩法&#34;&gt;高级玩法&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;当然，作者还有其他更好的项目用于同步所有分支，例如使用 GitHub actions 进行同步。请参考原作者的项目&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/wei/git-sync&#34;&gt;https://github.com/wei/git-sync&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/repo-sync/github-sync&#34;&gt;https://github.com/repo-sync/github-sync&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;Github-自动合并-PR&#34;&gt;Github 自动合并 PR&lt;/h2&gt;
&lt;h3 id=&#34;renovate&#34;&gt;renovate&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/marketplace/renovate&#34;&gt;renovate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.renovatebot.com/&#34;&gt;使用文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.renovatebot.com/configuration-options/#automerge&#34;&gt;自动合并&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-16.webp&#34; alt=&#34;renovate free&#34;&gt;&lt;/p&gt;
&lt;p&gt;自动合并example  renovate.json&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-json&#34; data-language=&#34;json&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-json&#34;&gt;&amp;#123;
  &amp;quot;extends&amp;quot;: [&amp;quot;config:base&amp;quot;],
  &amp;quot;assignees&amp;quot;: [&amp;quot;17lai&amp;quot;],
  &amp;quot;separateMinorPatch&amp;quot;: true,
  &amp;quot;packageRules&amp;quot;: [
    &amp;#123;
      &amp;quot;updateTypes&amp;quot;: [&amp;quot;minor&amp;quot;, &amp;quot;patch&amp;quot;],
      &amp;quot;automerge&amp;quot;: true,
      &amp;quot;automergeType&amp;quot;: &amp;quot;branch&amp;quot;
    &amp;#125;
  ]
&amp;#125;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;mergify&#34;&gt;mergify&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/marketplace/mergify&#34;&gt;mergify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;开源项目这个工具是免费使用的！&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-17.webp&#34; alt=&#34;mergify free for open source&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;使用-Github-Dependabot-自动更新依赖版本&#34;&gt;使用 Github Dependabot 自动更新依赖版本&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;通过将配置文件检入仓库，可启用 Dependabot 版本更新。 配置文件指定存储在仓库中的清单或其他包定义文件的位置。 Dependabot 使用此信息来检查过时的软件包和应用程序。 Dependabot 确定依赖项是否有新版本，它通过查看依赖的语义版本 (semver) 来决定是否应更新该版本。 对于某些软件包管理器，Dependabot 版本更新 也支持供应。 供应（或缓存）的依赖项是检入仓库中特定目录的依赖项，而不是在清单中引用的依赖项。 即使包服务器不可用，供应的依赖项在生成时也可用。 Dependabot 版本更新可以配置为检查为新版本供应的依赖项，并在必要时更新它们。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;以上内容来自 GitHub 官方文档，简单的讲 Dependabot 就是一个没有感情的依赖更新机器人，在您的项目所依赖的上游软件包或应用程序发布新版本后，它会在您的 GitHub 仓库自动创建一个 PR 来更新依赖文件，并说明依赖更新内容，用户自己选择是否 merge 该 PR，效果如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-18.webp&#34; alt=&#34;Dependabot PR&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;开启-Dependabot&#34;&gt;开启 Dependabot&lt;/h3&gt;
&lt;p&gt;开启方式比较简单，仅需将 &lt;code&gt;dependabot.yml&lt;/code&gt; 配置文件放入仓库的 &lt;code&gt;.github&lt;/code&gt; 目录中即可开启。之后 Dependabot 就会自动提交 PR 来更新您项目中的依赖项了。您也可以在 GitHub 页面上进行操作，在仓库页面通过 &lt;code&gt;Insights&lt;/code&gt; -&amp;gt; &lt;code&gt;Dependency graph&lt;/code&gt; -&amp;gt; &lt;code&gt;Dependabot&lt;/code&gt; -&amp;gt; &lt;code&gt;Enable Dependabot&lt;/code&gt; 路径即可开启，之后就可以点击 &lt;code&gt;Create config file&lt;/code&gt; 来创建配置文件了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-19.webp&#34; alt=&#34;开启 Dependabot&#34;&gt;&lt;/p&gt;
&lt;p&gt;配置完成后，即可看到需要监控的依赖文件和上次检查更新的时间。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-20.webp&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;配置-dependabot-yml&#34;&gt;配置 dependabot.yml&lt;/h3&gt;
&lt;p&gt;文件的配置也相对较为简单的直接，&lt;code&gt;version&lt;/code&gt;、&lt;code&gt;updates&lt;/code&gt;、&lt;code&gt;package-ecosystem&lt;/code&gt; 、&lt;code&gt;schedule&lt;/code&gt; 是必填的，还可以配置 &lt;code&gt;registries&lt;/code&gt; 来指定私有仓库地址及认证信息。下面这个是官方示例，该示例中为 &lt;code&gt;npm&lt;/code&gt; 和 &lt;code&gt;Docker&lt;/code&gt; 配置了依赖自动更新，同时指定其依赖文件的地址和更新频率。有意思的是，在下面这个示例中，如果 Docker 依赖项已过时很久，可能会先执行 &lt;code&gt;daily&lt;/code&gt; 安排，直到这些依赖项达到最新状态，然后降回每周安排。更多内容，可以参考&lt;a href=&#34;https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates&#34;&gt;官方文档&lt;/a&gt;。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;# Basic dependabot.yml file with
# minimum configuration for two package managers

version: 2
updates:
  # Enable version updates for npm
  - package-ecosystem: &amp;quot;npm&amp;quot;
    # Look for &amp;#96;package.json&amp;#96; and &amp;#96;lock&amp;#96; files in the &amp;#96;root&amp;#96; directory
    directory: &amp;quot;&amp;#x2F;&amp;quot;
    # Check the npm registry for updates every day (weekdays)
    schedule:
      interval: &amp;quot;daily&amp;quot;

  # Enable version updates for Docker
  - package-ecosystem: &amp;quot;docker&amp;quot;
    # Look for a &amp;#96;Dockerfile&amp;#96; in the &amp;#96;root&amp;#96; directory
    directory: &amp;quot;&amp;#x2F;&amp;quot;
    # Check for updates once a week
    schedule:
      interval: &amp;quot;weekly&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;支持的包管理器&#34;&gt;支持的包管理器&lt;/h3&gt;
&lt;p&gt;目前 Dependabot 支持很多包管理器，具体内容可以参考下表：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;要用于 &lt;code&gt;dependabot.yml&lt;/code&gt; 文件中的 YAML 值&lt;/li&gt;
&lt;li&gt;支持的包管理器版本&lt;/li&gt;
&lt;li&gt;是否支持私有 GitHub 仓库或注册表中的依赖项&lt;/li&gt;
&lt;li&gt;是否支持供应的依赖项&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package manager&lt;/th&gt;
&lt;th&gt;YAML value&lt;/th&gt;
&lt;th&gt;Supported versions&lt;/th&gt;
&lt;th&gt;Private repositories&lt;/th&gt;
&lt;th&gt;Private registries&lt;/th&gt;
&lt;th&gt;Vendoring&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bundler&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bundler&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v1, v2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cargo&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cargo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Composer&lt;/td&gt;
&lt;td&gt;&lt;code&gt;composer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v1, v2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hex&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;elm-package&lt;/td&gt;
&lt;td&gt;&lt;code&gt;elm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v0.19&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git submodule&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gitsubmodule&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;N/A (no version)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Actions&lt;/td&gt;
&lt;td&gt;&lt;code&gt;github-actions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;N/A (no version)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go modules&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gomod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gradle&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gradle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;N/A (no version)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maven&lt;/td&gt;
&lt;td&gt;&lt;code&gt;maven&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;N/A (no version)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v6, v7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NuGet&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nuget&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;= 4.8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pip&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v21.1.2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pipenv&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt;= 2021-05-29&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pip-compile&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;6.1.0&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;poetry&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terraform&lt;/td&gt;
&lt;td&gt;&lt;code&gt;terraform&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;gt;= 0.13, &amp;lt;= 1.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;yarn&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✓&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;更多内容可以参考&lt;a href=&#34;https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/about-dependabot-version-updates#supported-repositories-and-ecosystems&#34;&gt;官方文档&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&#34;Gitlab-镜像-Github&#34;&gt;Gitlab 镜像 Github&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;这个功能需要 gitlab ee 版本，CE版本是不支持镜像的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;个人用户可以参考 &lt;a href=&#34;/posts/29a820b3/&#34;&gt;破解Gitlab EE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;企业用户去付费买授权&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/10/02/20221002200706-21.webp&#34; alt=&#34;Gitlab Mirror&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;Github-仓库备份&#34;&gt;Github 仓库备份&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;最优秀的资源，大多只在短时间内出现！&lt;/p&gt;
&lt;p&gt;平时多备份你重要的仓库，以及你使用的仓库的重要上下游仓库！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/appotry/docker-github-backup&#34;&gt;github-backup Githb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://hub.docker.com/r/lnxd/github-backup&#34;&gt;github-backup Dockerhub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;githubback:
  image: lnxd&amp;#x2F;github-backup
  container_name: &amp;quot;githubback&amp;quot;
  hostname: githubback
  # ports:
    # - &amp;quot;80:80&amp;quot;
  volumes:
    - &amp;quot;$&amp;#123;USERDIR&amp;#125;&amp;#x2F;githubback&amp;#x2F;data:&amp;#x2F;home&amp;#x2F;docker&amp;#x2F;backups:rw&amp;quot;
  env_file:
    - .env
  environment:
    - HTTP_PROXY&amp;#x3D;http:&amp;#x2F;&amp;#x2F;[ip]:[port]
    - HTTPS_PROXY&amp;#x3D;http:&amp;#x2F;&amp;#x2F;[ip]:[port]
  restart: always&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;自动翻译&#34;&gt;自动翻译&lt;/h2&gt;
&lt;p&gt;实例 GitHub Action &lt;a href=&#34;https://github.com/walinejs/waline/blob/main/.github/workflows/issue-translator.yml&#34;&gt;https://github.com/walinejs/waline/blob/main/.github/workflows/issue-translator.yml&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;源码 &lt;a href=&#34;https://github.com/lizheming/issues-translate-action&#34;&gt;https://github.com/lizheming/issues-translate-action&lt;/a&gt; 基于 &lt;a href=&#34;https://github.com/dromara/issues-translate-action&#34;&gt;https://github.com/dromara/issues-translate-action&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;后记&#34;&gt;后记&lt;/h2&gt;
&lt;p&gt;github action 太多强大，这里仅仅只能介绍一点点，有太多好东西了，太多宝藏值得去挖掘！&lt;/p&gt;
&lt;p&gt;这就是开源的力量！在被大公司白嫖的同时，创造了无与伦比的社区生态！&lt;/p&gt;
&lt;h2 id=&#34;参考-致谢&#34;&gt;参考&amp;amp;致谢&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ruanyifeng.com/blog/2019/09/getting-started-with-github-actions.html&#34;&gt;GitHub Actions 入门教程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://guoxudong.io/post/github-dependabot/&#34;&gt;使用 Github Dependabot 自动更新依赖版本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://p3terx.com/archives/github-actions-started-tutorial.html&#34;&gt;GitHub Actions 入门教程&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;系列教程&#34;&gt;&lt;strong&gt;系列教程&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;全部文章RSS订阅&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&#34;Devops系列&#34;&gt;&lt;strong&gt;Devops系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/devops/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;Devops 分类 RSS 订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ab63eb8f/&#34;&gt;自建全套开源Devops开发系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d32a07a7/&#34;&gt;Git介绍以及分支模型图解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/39563241/&#34;&gt;三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/3437994a/&#34;&gt;DevOps系列—【Jenkinsfile+Dockerfile+nginx+vue】&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/f4c3ad41/&#34;&gt;项目开发管理工具推荐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/acc13b70/&#34;&gt;Gitlab的安装及使用教程完全版&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d08eb7b/&#34;&gt;Gitlab的安装及使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/78c3371/&#34;&gt;那些有用的Github工具介绍！Action、app、workflow等&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;Gitbook使用系列&#34;&gt;&lt;strong&gt;Gitbook使用系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/gitbook/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;Gitbook分类RSS订阅&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/7fe86002/&#34;&gt;GitBook+GitLab撰写发布技术文档-Part1:GitBook篇&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/7790e989/&#34;&gt;GitBook+GitLab撰写发布技术文档-Part2:GitLab篇&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d6bad1e5/&#34;&gt;自己动手制作电子书的最佳方式（支持PDF、ePub、mobi等格式）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;Gitlab-使用系列&#34;&gt;&lt;strong&gt;Gitlab 使用系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/gitlab/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;Gitlab RSS 分类订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/acc13b70/&#34;&gt;&lt;strong&gt;Gitlab的安装及使用教程完全版&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/29a820b3/&#34;&gt;破解Gitlab EE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d08eb7b/&#34;&gt;Gitlab的安装及使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/1879721e/&#34;&gt;CI/CD与Git Flow与GitLab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;link rel=&#34;stylesheet&#34; href=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10/dist/style.css&#34;&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/d3@7&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-view@0.18.10&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10&#34;&gt;&lt;/script&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;/css/markmap.css&#34;&gt;

&lt;script src=&#34;/js/markmap.js&#34;&gt;&lt;/script&gt;
</content>
        <category term="github" />
        <category term="action" />
        <category term="workflow" />
        <updated>2022-10-02T11:16:04.000Z</updated>
    </entry>
    <entry>
        <id>https://blog.17lai.site/posts/ab63eb8f/</id>
        <title>自建全套开源Devops开发系统</title>
        <link rel="alternate" href="https://blog.17lai.site/posts/ab63eb8f/"/>
        <content type="html">&lt;blockquote&gt;
&lt;p&gt;国内的Devops云平台动辄封号，删库，屏蔽，还多次发生数据泄密，项目被云平台克隆事件，国内云平台devops已死！数据安全没法保证，自建私有Devops平台才靠谱。这里采用开源项目建立一个完善的低成本Devops系统，基本运行良好！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;目标：单节点，以最低成本，最低消耗，使用开源软件实现一个可用的DevOps！满足中小企业的研发、测试、运维需求。并对后续如何扩展本套DevOps系统做了项目，成本，路线升级规划，可以一直扩展到业界最前沿最大系统。&lt;/p&gt;
&lt;p&gt;整套系统已经跑起来很长时间了！单节点Nas服务器，32G内存，共运行了约80个Docker，优化到平均负载10以下。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/05/14/20220514113906.webp&#34; alt=&#34;devops&#34;&gt;&lt;/p&gt;
&lt;span id=&#34;more&#34;&gt;&lt;/span&gt;
&lt;h2 id=&#34;Devops框架图解&#34;&gt;Devops框架图解&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;下面系统大多可以做负载平衡，多节点备份，可以扩展为一个高可用，大中央平台。&lt;/p&gt;
&lt;p&gt;珍爱生命，使用&lt;code&gt;Docker&lt;/code&gt;！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/05/09/20220509132230.webp&#34; alt=&#34;自建Devops.drawio&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;开源云平台生死连问&#34;&gt;开源云平台生死连问&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;珍爱生命，不建议使用国内云平台。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;什么是大教堂？&lt;/p&gt;
&lt;p&gt;什么是集市？&lt;/p&gt;
&lt;p&gt;什么是信任链？&lt;/p&gt;
&lt;p&gt;什么是开源生态？&lt;/p&gt;
&lt;p&gt;为什么要做开源生态？&lt;/p&gt;
&lt;p&gt;怎么做开源生态？&lt;/p&gt;
&lt;p&gt;开源生态的土壤肥力维护如何做？&lt;/p&gt;
&lt;p&gt;这些问题没想明白，没想到如何做的是没法做开源的。&lt;/p&gt;
&lt;p&gt;国内平台连种子嫩芽都要收割，到处收费，动辄删库，屏蔽，封号，注定做不了开源生态。&lt;/p&gt;
&lt;h2 id=&#34;Consul自动负载均衡&#34;&gt;&lt;code&gt;Consul&lt;/code&gt;自动负载均衡&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;基于服务自动发现和注册的负载均衡，负载均衡的方式没有变，只是多了一些&lt;strong&gt;外围组件&lt;/strong&gt;，当然这些组件对 &lt;code&gt;Client&lt;/code&gt; 是不可见的，&lt;code&gt;client&lt;/code&gt; 依然只能看到 &lt;code&gt;Nginx&lt;/code&gt; 入口，访问方式也没变化。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/29/20220429190914-1.webp&#34; alt=&#34;Consul&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;Github仓库备份&#34;&gt;&lt;code&gt;Github&lt;/code&gt;仓库备份&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;最优秀的资源，大多只在短时间内出现！&lt;/p&gt;
&lt;p&gt;平时多备份你重要的仓库，以及你使用的仓库的重要上下游仓库！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/appotry/docker-github-backup&#34;&gt;github-backup Githb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://hub.docker.com/r/lnxd/github-backup&#34;&gt;github-backup Dockerhub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;githubback:
  image: lnxd&amp;#x2F;github-backup
  container_name: &amp;quot;githubback&amp;quot;
  hostname: githubback
  # ports:
    # - &amp;quot;80:80&amp;quot;
  volumes:
    - &amp;quot;$&amp;#123;USERDIR&amp;#125;&amp;#x2F;githubback&amp;#x2F;data:&amp;#x2F;home&amp;#x2F;docker&amp;#x2F;backups:rw&amp;quot;
  env_file:
    - .env
  environment:
    - HTTP_PROXY&amp;#x3D;http:&amp;#x2F;&amp;#x2F;[ip]:[port]
    - HTTPS_PROXY&amp;#x3D;http:&amp;#x2F;&amp;#x2F;[ip]:[port]
  restart: always&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;配置要求&#34;&gt;配置要求&lt;/h2&gt;
&lt;p&gt;个人Nas配置&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;cpu j4125 4 核 14nm 2.00 GHz ~2.70 GHz&lt;/li&gt;
&lt;li&gt;SSD sata 接口的 读写 500MB/S&lt;/li&gt;
&lt;li&gt;32G DDR4. 2x16G 双通道&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;上图中介绍的系统都是上面配置的单服务器中可以运行的。&lt;/p&gt;
&lt;p&gt;如何以最低的配置，最少的内存运行起来最多的功能才是本文的追求，花费更多金钱去满足极少数情况的高压力是钱多的没处花。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;8G&lt;/code&gt;内存的nas 就可以运行 &lt;code&gt;gitea + drone&lt;/code&gt; ，&lt;code&gt;zentao&lt;/code&gt; 想用就用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gitlab&lt;/code&gt; 要跑起来至少要2核 &lt;code&gt;8G&lt;/code&gt; 内存，&lt;code&gt;jenkins&lt;/code&gt; 也是内存 &lt;code&gt;cpu&lt;/code&gt; 占用大户。大于 &lt;code&gt;16G&lt;/code&gt; 内存时考虑上这个&lt;/li&gt;
&lt;li&gt;4核 &lt;code&gt;32G&lt;/code&gt; 内存的nas，图片中介绍的可以全都跑起来！&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;可靠性&#34;&gt;可靠性&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ELK&lt;/code&gt;集群监控对于单服务器来说完全多余，&lt;code&gt;netdata&lt;/code&gt;监控也不错，&lt;code&gt;portainer&lt;/code&gt;就够用了，以后为了节约资源，&lt;code&gt;portainer&lt;/code&gt;说不定也会被干掉，大多数时候命令行监控就够了。少于200节点&lt;code&gt;K8S&lt;/code&gt;就是多余的。&lt;/p&gt;
&lt;h3 id=&#34;数据安全&#34;&gt;数据安全&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;云平台把数据交给别人，赌别人的道德不会私自偷拿你的数据？真是想多了。&lt;/p&gt;
&lt;p&gt;某垄断社交平台内部有专门的团队分析客户的数据，看有什么有价值的没有，是很多年前就爆出来的消息。&lt;/p&gt;
&lt;p&gt;自建&lt;code&gt;DevOps&lt;/code&gt;成本其实相当的低！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;整套系统可以从少到多，从小到大，慢慢优化，扩展的。硬件成本也是随着需求变化而变化的，随着业务扩展而增加成本，一开始单节点单服务器就可以满足要求了，后面业务增加慢慢扩展为集群，k8s 等。&lt;/p&gt;
&lt;p&gt;数据，代码是公司核心资产与竞争力的公司，上云赌别人的人品就是找死。你注册账户的时候，就同意了，无论别人随意删除你的数据，或者窃取你的数据都是不用付任何责任的，再说，整个系统数据都在别人手上，你要维权也没有证据。&lt;/p&gt;
&lt;h3 id=&#34;备份&#34;&gt;备份&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;UPS&lt;/code&gt;电源，防止意外断电&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rsync&lt;/code&gt; 备份，对于大多数人，已经够用了&lt;/li&gt;
&lt;li&gt;文件系统快照&lt;/li&gt;
&lt;li&gt;离线每日，或者每周冷备份&lt;/li&gt;
&lt;li&gt;大系统，多台服务器的时候可以用多节点集群备灾。&lt;code&gt;nginx&lt;/code&gt;,&lt;code&gt;harbor&lt;/code&gt;，&lt;code&gt;gitlab&lt;/code&gt;，&lt;code&gt;elasticsearch&lt;/code&gt;等都可以使用集群&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;扩展性&#34;&gt;扩展性&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;上面说的都可以单服务器搞定。多台服务器的时候可以用多节点集群备灾。&lt;code&gt;nginx&lt;/code&gt;,&lt;code&gt;harbor&lt;/code&gt;，&lt;code&gt;gitlab&lt;/code&gt;，&lt;code&gt;elasticsearch&lt;/code&gt;等都可以使用集群。&lt;/p&gt;
&lt;p&gt;多于200节点，大于3台服务器以后考虑上&lt;code&gt;K8S&lt;/code&gt;。ELK监控之类的这时候可以上了。&lt;a href=&#34;https://github.com/Tencent/bk-sops&#34;&gt;蓝鲸智云标准运维&lt;/a&gt;这时候也可以考虑了。&lt;/p&gt;
&lt;p&gt;再次扩大的时候可以考虑&lt;code&gt;Proxmox VE（PVE）&lt;/code&gt; + &lt;code&gt;ceph&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;更大的系统，或者对外提供云平台服务的时候可以考虑上&lt;code&gt;OpenStack&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;项目介绍&#34;&gt;项目介绍&lt;/h2&gt;
&lt;h3 id=&#34;ELK&#34;&gt;ELK&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;消耗资源很多，至少上百节点以上再考虑上这个&lt;/p&gt;
&lt;p&gt;&lt;code&gt;portainer&lt;/code&gt; -&amp;gt; &lt;code&gt;netdata &lt;/code&gt;-&amp;gt; &lt;code&gt;ELK&lt;/code&gt;，&lt;code&gt;zabbix &lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0520210805165405.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;cacti&#34;&gt;&lt;a href=&#34;https://www.cacti.net/&#34;&gt;cacti&lt;/a&gt;&lt;/h3&gt;

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;Cacti&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;Cacti&#34; data-repo=&#34;cacti&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    
&lt;h3 id=&#34;zabbix&#34;&gt;zabbix&lt;/h3&gt;

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;zabbix&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;zabbix&#34; data-repo=&#34;zabbix&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    
&lt;h3 id=&#34;ansible&#34;&gt;ansible&lt;/h3&gt;

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;ansible&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;ansible&#34; data-repo=&#34;ansible&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    
&lt;h3 id=&#34;CMDB&#34;&gt;CMDB&lt;/h3&gt;

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;netbox-community&#34; data-repo=&#34;netbox&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;open-cmdb&#34; data-repo=&#34;cmdb&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    
&lt;h3 id=&#34;PVE&#34;&gt;PVE&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Proxmox VE（PVE）&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;proxmox&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    
&lt;h3 id=&#34;CEPH&#34;&gt;&lt;a href=&#34;https://ceph.io/&#34;&gt;CEPH&lt;/a&gt;&lt;/h3&gt;

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;ceph&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;ceph&#34; data-repo=&#34;ceph&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    
&lt;h3 id=&#34;OpenStack&#34;&gt;OpenStack&lt;/h3&gt;

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;openstack&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;openstack&#34; data-repo=&#34;openstack&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    
&lt;h2 id=&#34;其它项目&#34;&gt;其它项目&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;大家还有啥好项目建议？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;onedev&#34;&gt;onedev&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/theonedev/onedev&#34;&gt;onedev&lt;/a&gt; 是替代&lt;code&gt;Gitlab&lt;/code&gt;的极佳候补，看文档介绍，潜力无限！&lt;/p&gt;

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;theonedev&#34; data-repo=&#34;onedev&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    
&lt;h3 id=&#34;smartdns&#34;&gt;smartdns&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;一个本地DNS服务器，获取最快的网站IP，获得最佳上网体验。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;pymumu&#34; data-repo=&#34;smartdns&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    
&lt;h3 id=&#34;awesome-selfhosted&#34;&gt;&lt;a href=&#34;https://github.com/awesome-selfhosted/awesome-selfhosted&#34;&gt;awesome-selfhosted&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;这里你能找到各种各样的自建 Docker 服务&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&#34;github-card-container&#34; style=&#34;position: relative; min-height: 150px;&#34;&gt;
  &lt;div class=&#34;github-card&#34; data-user=&#34;awesome-selfhosted&#34; data-repo=&#34;awesome-selfhosted&#34;&gt;&lt;/div&gt;
  &lt;noscript&gt;
    &lt;div class=&#34;github-card-error&#34;&gt;
      JavaScript is required to load GitHub Cards
    &lt;/div&gt;
  &lt;/noscript&gt;
&lt;/div&gt;
    
&lt;h3 id=&#34;私有Git服务器整理&#34;&gt;私有Git服务器整理&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;ruby系：&lt;a href=&#34;https://gitlab.com/gitlab-org/gitlab&#34;&gt;GitLab&lt;/a&gt;。这个没什么好说的，说到私有git服务器第一反应必然是这个，似乎也是目前已知的开源git服务器中体量最大的，功能齐全，界面美观。&lt;/li&gt;
&lt;li&gt;golang系：&lt;a href=&#34;https://github.com/gogs/gogs&#34;&gt;Gogs&lt;/a&gt;、&lt;a href=&#34;https://github.com/go-gitea/gitea&#34;&gt;gitea&lt;/a&gt;、&lt;a href=&#34;https://codeberg.org/forgejo/forgejo&#34;&gt;forgejo&lt;/a&gt;。这仨一脉相传，简单概括来说，就是先有的gogs，然后一群贡献者嫌gogs更新慢、不加新功能，然后fork出了gitea；然后gitea搞了几年之后开公司了，codeberg担心gitea搞收费，就又从gitea代码fork出了一个forgejo自己开发。&lt;/li&gt;
&lt;li&gt;Java系：&lt;a href=&#34;https://github.com/gitbucket/gitbucket&#34;&gt;gitbucket&lt;/a&gt;、&lt;a href=&#34;https://github.com/gitblit-org/gitblit&#34;&gt;GitBlit&lt;/a&gt;、&lt;a href=&#34;https://github.com/theonedev/onedev&#34;&gt;OneDev&lt;/a&gt;。这三家都是个搞个的，其中OneDev比较新，界面做的也比较现代化。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;系列教程&#34;&gt;&lt;strong&gt;系列教程&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;全部文章RSS订阅&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&#34;Devops系列&#34;&gt;&lt;strong&gt;Devops系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/devops/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;Devops 分类 RSS 订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ab63eb8f/&#34;&gt;自建全套开源Devops开发系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d32a07a7/&#34;&gt;Git介绍以及分支模型图解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/39563241/&#34;&gt;三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/3437994a/&#34;&gt;DevOps系列—【Jenkinsfile+Dockerfile+nginx+vue】&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/f4c3ad41/&#34;&gt;项目开发管理工具推荐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/acc13b70/&#34;&gt;Gitlab的安装及使用教程完全版&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d08eb7b/&#34;&gt;Gitlab的安装及使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/78c3371/&#34;&gt;那些有用的Github工具介绍！Action、app、workflow等&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;相关文档&#34;&gt;相关文档&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://dbaselife.com/project-3/&#34;&gt;Devops&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10/dist/style.css&#34;&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/d3@7&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-view@0.18.10&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10&#34;&gt;&lt;/script&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;/css/markmap.css&#34;&gt;

&lt;script src=&#34;/js/markmap.js&#34;&gt;&lt;/script&gt;
</content>
        <category term="docker" />
        <category term="devops" />
        <category term="框架" />
        <category term="图解" />
        <updated>2022-05-09T05:00:25.000Z</updated>
    </entry>
    <entry>
        <id>https://blog.17lai.site/posts/d32a07a7/</id>
        <title>Git介绍以及分支模型图解</title>
        <link rel="alternate" href="https://blog.17lai.site/posts/d32a07a7/"/>
        <content type="html">&lt;blockquote&gt;
&lt;p&gt;不废话，直接上图。&lt;/p&gt;
&lt;p&gt;由 Drawio 绘制&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1920220419221343.svg&#34; alt=&#34;git使用&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;GIT架构&#34;&gt;&lt;strong&gt;GIT架构&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;GIT的架构，可以分为几个部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本地工作区(working directory)&lt;/li&gt;
&lt;li&gt;暂存区(stage area, 又称为索引区, index)、&lt;/li&gt;
&lt;li&gt;本地仓库(local repository)、&lt;/li&gt;
&lt;li&gt;远程仓库副本&lt;/li&gt;
&lt;li&gt;远程仓库(remote repository)。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;工作区(working directory)&lt;/strong&gt; 简言之就是你工作的区域。对于git而言，就是的本地工作目录。工作区的内容会包含提交到暂存区和版本库(当前提交点)的内容，同时也包含自己的修改内容。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;暂存区(stage area, 又称为索引区index)&lt;/strong&gt; 是git中一个非常重要的概念。是我们把修改提交版本库前的一个过渡阶段。查看GIT自带帮助手册的时候，通常以index来表示暂存区。在工作目录下有一个.git的目录，里面有个index文件，存储着关于暂存区的内容。git add命令将工作区内容添加到暂存区。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本地仓库(local repository)&lt;/strong&gt; 版本控制系统的仓库，存在于本地。当执行git commit命令后，会将暂存区内容提交到仓库之中。在工作区下面有.git的目录，这个目录下的内容不属于工作区，里面便是仓库的数据信息，暂存区相关内容也在其中。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;远程版本库(remote repository)&lt;/strong&gt; 与本地仓库概念基本一致，不同之处在于一个存在远程，可用于远程协作，一个却是存在于本地。通过push/pull可实现本地与远程的交互；&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;远程仓库副本&lt;/strong&gt; 可以理解为存在于本地的远程仓库缓存。如需更新，可通过git fetch/pull命令获取远程仓库内容。使用fech获取时，并未合并到本地仓库，此时可使用git merge实现远程仓库副本与本地仓库的合并。&lt;/p&gt;
&lt;h2 id=&#34;git介绍&#34;&gt;&lt;code&gt;.git&lt;/code&gt;介绍&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.git&lt;/code&gt;目录下各个文件中所存放的内容信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;HEAD&lt;/strong&gt; 当前所在位置，其实就是工作区的在版本库中的那个提交点，最终会指向一个40位的HASH值；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;config&lt;/strong&gt; 当前版本库的专有配置文件，如使用命令git config &lt;a href=&#34;http://user.name&#34;&gt;user.name&lt;/a&gt; poloxue便会记录在此文件；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;description&lt;/strong&gt; 被gitweb (Github的原型)用来显示对repo的描述。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;hooks&lt;/strong&gt; git有可自动运行在 git 任有意义阶段的脚本hooks, 如commit/release/pull/push等状态之前或者之后。个人思考的一个用处，如pre-push可以用来强制进行代码检查。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;index&lt;/strong&gt; 存放暂存区(stage area)的相关信息；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;info/exclue&lt;/strong&gt; 可以做到和.gitignore相同的事情，用于排除不要包含进版本库的文件。区别就是，此文件不会被共享。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;refs/heads&lt;/strong&gt; 目录下有关于本地仓库的所有分支；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;refs/remote&lt;/strong&gt; 目录下有关于远程仓库的所有分支；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;object&lt;/strong&gt; 目录下存放的就是实际的数据文件&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;Commitizen&#34;&gt;Commitizen&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Commitizen——标准化的Git commit工具&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2024/06/15/20240615121259.webp&#34; alt=&#34;Commitizen&#34;&gt;&lt;/p&gt;
&lt;p&gt;Commitizen 分为两部分，&lt;a href=&#34;https://github.com/commitizen/cz-cli&#34;&gt;脚手架（cz-cli）&lt;/a&gt; 和 &lt;a href=&#34;https://github.com/commitizen/cz-cli#adapters&#34;&gt;规范（Adapters）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;脚手架可以帮助我们初始化和构建 Commitizen，而规范是开发者可以自定义的内容&lt;/p&gt;
&lt;p&gt;官方默认提供的规范是 &lt;a href=&#34;https://www.npmjs.com/package/cz-conventional-changelog&#34;&gt;cz-conventional-changelog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;同时，官方也提供了一些优秀的第三方规范，例如你肯定想要的表情包commit规范：&lt;a href=&#34;https://www.npmjs.com/package/cz-emoji-conventional&#34;&gt;cz-emoji-conventional&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本文也将提供这两种规范的安装和使用方式&lt;/p&gt;
&lt;h2 id=&#34;安装&#34;&gt;安装&lt;/h2&gt;
&lt;p&gt;一条命令搞定&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;npm install -g commitizen&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;这就安装成功了，而且是全局安装，以后再用就不用重复安装了&lt;/p&gt;
&lt;p&gt;当然，安装成功的只是一个脚手架，现在还不能使用&lt;/p&gt;
&lt;h2 id=&#34;创建-package-json&#34;&gt;创建 package.json&lt;/h2&gt;
&lt;p&gt;Commitizen 基于 nodejs，想要使用的话，在你的项目中自然需要一个 package.json&lt;/p&gt;
&lt;p&gt;如果已经存在了那最好，没有的话，例如是一个 java 项目，那么你可以在项目根目录执行以下命令&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;npm init&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;当然，如果不是 nodejs 的项目，你肯定不需要将这些文件也上传到 git&lt;/p&gt;
&lt;p&gt;你可以在 &lt;code&gt;.gitignore&lt;/code&gt; 文件中加入下面几句来忽略这些文件&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-none&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;package-lock.json
package.json
node_modules&amp;#x2F;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;初始化&#34;&gt;初始化&lt;/h2&gt;
&lt;p&gt;这一步就可以选择我们需要的规范了&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;windows&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;commitizen init 规范名称 --save-dev --save-exact&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;linux&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;commitizen init 规范名称 --yarn --dev --exact&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;hr&gt;
&lt;p&gt;commitizen 脚手架会自动帮我们导入规范的依赖并进行下载，所以你只要注意不要写错规范名称就好了&lt;/p&gt;
&lt;p&gt;关于这些名称，可以参考 &lt;a href=&#34;https://github.com/commitizen/cz-cli#adapters&#34;&gt;这里推荐的规范&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;例如你想使用默认的规范&lt;/p&gt;
&lt;p&gt;那么可以这样写：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;commitizen init cz-conventional-changelog --save-dev --save-exact&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;而如果你想使用带表情包的，就这样写：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;commitizen init cz-emoji-conventional --save-dev --save-exact&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;使用&#34;&gt;使用&lt;/h2&gt;
&lt;p&gt;使用的方式很简单，将你原本要输入的 &lt;code&gt;git commit&lt;/code&gt; 命令替换为 &lt;code&gt;git cz&lt;/code&gt; 即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2024/06/15/20240615121259-1.webp&#34; alt=&#34;Commitizen&#34;&gt;&lt;/p&gt;
&lt;p&gt;当你的控制台出现这样的界面，你可以使用方向键的 ↑ 和 ↓ 来移动光标选择这次 commit 的 type&lt;/p&gt;
&lt;p&gt;按回车 enter 进行选择&lt;/p&gt;
&lt;p&gt;常用的 type 有：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;英文&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;feat&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;新特性，新功能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;fix&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;修bug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;docs&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;更新文档&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;style&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;修改代码风格、代码格式（不影响代码运行的变动）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;refactor&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;重构代码（既不是新增功能，也不是修改bug，可以理解为觉得原本写太烂了，重新写了一遍）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;perf&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;优化性能、优化体验&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;test&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;测试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;chore&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;构建过程或者辅助工具的变动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;revert&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;回滚版本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;merge&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;代码合并&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;sync&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;同步主线或分支&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;随后，根据提示输入相关信息即可&lt;/p&gt;
&lt;p&gt;例如&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;scope 作用域，也就是这次变动影响的范围，例如数据层，控制层，或者单单某个类&lt;/li&gt;
&lt;li&gt;subject / description 描述，cz 将描述分为简短描述和详细描述，使用几下就清楚了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;除此以外，cz 还会提示你这次变动是否与某个 issue 有关等等&lt;/p&gt;
&lt;h2 id=&#34;变更规范&#34;&gt;变更规范&lt;/h2&gt;
&lt;p&gt;上面是在初始化时选择的规范，如果在后期我们想要变更该怎么做？&lt;/p&gt;
&lt;p&gt;首先，脚手架只有在初始化才能帮我们自动管理依赖&lt;/p&gt;
&lt;p&gt;后期想要变动，就得手动下载依赖了&lt;/p&gt;
&lt;p&gt;例如初始化时用的是官方默认的规范&lt;/p&gt;
&lt;p&gt;那么这时候你的package.json里面会有这样一段代码&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-json&#34; data-language=&#34;json&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-json&#34;&gt;&amp;quot;config&amp;quot;: &amp;#123;
    &amp;quot;commitizen&amp;quot;: &amp;#123;
        &amp;quot;path&amp;quot;: &amp;quot;node_modules&amp;#x2F;cz-conventional-changelog&amp;quot;
    &amp;#125;
&amp;#125;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;我们如果想要换成有表情包的规范形式 &lt;code&gt;cz-emoji-conventional&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;首先需要下载依赖，当然是要在项目根目录执行：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;npm i cz-emoji-conventional&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;然后修改上面 package.json 中的配置&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-json&#34; data-language=&#34;json&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-json&#34;&gt;&amp;quot;config&amp;quot;: &amp;#123;
    &amp;quot;commitizen&amp;quot;: &amp;#123;
        &amp;quot;path&amp;quot;: &amp;quot;node_modules&amp;#x2F;cz-emoji-conventional&amp;quot;
    &amp;#125;
&amp;#125;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;到这里，规范就修改完成了&lt;/p&gt;
&lt;h2 id=&#34;全局安装&#34;&gt;全局安装&lt;/h2&gt;
&lt;p&gt;上面所讲的安装方式仅适用于项目内，也就是每一个项目都会创建node_modules并安装依赖。&lt;/p&gt;
&lt;p&gt;如果需要在电脑上任意地方都能用 &lt;code&gt;git cz&lt;/code&gt; 命令，需要进行全局安装：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;脚手架 &lt;code&gt;npm install -g commitizen&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择一个&lt;strong&gt;规范&lt;/strong&gt;，参考上文：&lt;code&gt;npm install -g cz-emoji-conventional&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在用户目录下创建文件 &lt;code&gt;.czrc&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Windows：C:\user\用户名&lt;/p&gt;
&lt;p&gt;Linux: /home&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编辑 &lt;code&gt;.czrc&lt;/code&gt; 文件，写入&lt;strong&gt;规范&lt;/strong&gt;名称：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-json&#34; data-language=&#34;json&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-json&#34;&gt;&amp;#123;
    &amp;quot;path&amp;quot;: &amp;quot;cz-emoji-conventional&amp;quot;
&amp;#125;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;参考&#34;&gt;&lt;strong&gt;参考&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000&#34;&gt;Git 教程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://git-scm.com/book/zh/v2&#34;&gt;Git book&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;系列教程&#34;&gt;&lt;strong&gt;系列教程&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;全部文章RSS订阅&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&#34;Devops系列&#34;&gt;&lt;strong&gt;Devops系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/devops/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;Devops 分类 RSS 订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ab63eb8f/&#34;&gt;自建全套开源Devops开发系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d32a07a7/&#34;&gt;Git介绍以及分支模型图解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/39563241/&#34;&gt;三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/3437994a/&#34;&gt;DevOps系列—【Jenkinsfile+Dockerfile+nginx+vue】&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/f4c3ad41/&#34;&gt;项目开发管理工具推荐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/acc13b70/&#34;&gt;Gitlab的安装及使用教程完全版&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d08eb7b/&#34;&gt;Gitlab的安装及使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/78c3371/&#34;&gt;那些有用的Github工具介绍！Action、app、workflow等&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;link rel=&#34;stylesheet&#34; href=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10/dist/style.css&#34;&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/d3@7&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-view@0.18.10&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10&#34;&gt;&lt;/script&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;/css/markmap.css&#34;&gt;

&lt;script src=&#34;/js/markmap.js&#34;&gt;&lt;/script&gt;
</content>
        <category term="git" />
        <category term="devops" />
        <category term="drowio" />
        <updated>2022-04-19T12:07:16.000Z</updated>
    </entry>
    <entry>
        <id>https://blog.17lai.site/posts/39563241/</id>
        <title>三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境</title>
        <link rel="alternate" href="https://blog.17lai.site/posts/39563241/"/>
        <content type="html">&lt;blockquote&gt;
&lt;p&gt;最近在 K8S 1.18.2 版本的集群上搭建DevOps环境，期间遇到了各种坑。目前，搭建环境的过程中出现的各种坑均已被填平，特此记录，并分享给大家！&lt;/p&gt;
&lt;p&gt;文章和搭建环境所需要的yml文件已收录到：&lt;a href=&#34;https://github.com/sunshinelyz/technology-binghe&#34;&gt;https://github.com/sunshinelyz/technology-binghe&lt;/a&gt; 和 &lt;a href=&#34;https://gitee.com/binghe001/technology-binghe&#34;&gt;https://gitee.com/binghe001/technology-binghe&lt;/a&gt; 。如果文件对你有点帮助，别忘记给个Star哦！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;服务器规划&#34;&gt;服务器规划&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;IP&lt;/th&gt;
&lt;th&gt;主机名&lt;/th&gt;
&lt;th&gt;节点&lt;/th&gt;
&lt;th&gt;操作系统&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;192.168.175.101&lt;/td&gt;
&lt;td&gt;binghe101&lt;/td&gt;
&lt;td&gt;K8S Master&lt;/td&gt;
&lt;td&gt;CentOS 8.0.1905&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;192.168.175.102&lt;/td&gt;
&lt;td&gt;binghe102&lt;/td&gt;
&lt;td&gt;K8S Worker&lt;/td&gt;
&lt;td&gt;CentOS 8.0.1905&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;192.168.175.103&lt;/td&gt;
&lt;td&gt;binghe103&lt;/td&gt;
&lt;td&gt;K8S Worker&lt;/td&gt;
&lt;td&gt;CentOS 8.0.1905&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;安装环境版本&#34;&gt;安装环境版本&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;软件名称&lt;/th&gt;
&lt;th&gt;软件版本&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;19.03.8&lt;/td&gt;
&lt;td&gt;提供容器环境&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;docker-compose&lt;/td&gt;
&lt;td&gt;1.25.5&lt;/td&gt;
&lt;td&gt;定义和运行由多个容器组成的应用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;K8S&lt;/td&gt;
&lt;td&gt;1.8.12&lt;/td&gt;
&lt;td&gt;是一个开源的，用于管理云平台中多个主机上的容器化的应用，Kubernetes的目标是让部署容器化的应用简单并且高效（powerful）,Kubernetes提供了应用部署，规划，更新，维护的一种机制。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitLab&lt;/td&gt;
&lt;td&gt;12.1.6&lt;/td&gt;
&lt;td&gt;代码仓库（与SVN安装一个即可）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harbor&lt;/td&gt;
&lt;td&gt;1.10.2&lt;/td&gt;
&lt;td&gt;私有镜像仓库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jenkins&lt;/td&gt;
&lt;td&gt;2.89.3&lt;/td&gt;
&lt;td&gt;持续集成交付&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SVN&lt;/td&gt;
&lt;td&gt;1.10.2&lt;/td&gt;
&lt;td&gt;代码仓库（与GitLab安装一个即可）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JDK&lt;/td&gt;
&lt;td&gt;1.8.0_202&lt;/td&gt;
&lt;td&gt;Java运行基础环境&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;maven&lt;/td&gt;
&lt;td&gt;3.6.3&lt;/td&gt;
&lt;td&gt;构建项目的基础插件&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;服务器免密码登录&#34;&gt;服务器免密码登录&lt;/h2&gt;
&lt;p&gt;在各服务器执行如下命令。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;ssh-keygen -t rsa
cat ~&amp;#x2F;.ssh&amp;#x2F;id_rsa.pub &amp;gt;&amp;gt; ~&amp;#x2F;.ssh&amp;#x2F;authorized_keys 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;将binghe102和binghe103服务器上的id_rsa.pub文件复制到binghe101服务器。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe102 ~]# scp .ssh&amp;#x2F;id_rsa.pub binghe101:&amp;#x2F;root&amp;#x2F;.ssh&amp;#x2F;102
[root@binghe103 ~]# scp .ssh&amp;#x2F;id_rsa.pub binghe101:&amp;#x2F;root&amp;#x2F;.ssh&amp;#x2F;103
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;在binghe101服务器上执行如下命令。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;cat ~&amp;#x2F;.ssh&amp;#x2F;102 &amp;gt;&amp;gt; ~&amp;#x2F;.ssh&amp;#x2F;authorized_keys
cat ~&amp;#x2F;.ssh&amp;#x2F;103 &amp;gt;&amp;gt; ~&amp;#x2F;.ssh&amp;#x2F;authorized_keys
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;然后将authorized_keys文件分别复制到binghe102、binghe103服务器。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 ~]# scp .ssh&amp;#x2F;authorized_keys binghe102:&amp;#x2F;root&amp;#x2F;.ssh&amp;#x2F;authorized_keys
[root@binghe101 ~]# scp .ssh&amp;#x2F;authorized_keys binghe103:&amp;#x2F;root&amp;#x2F;.ssh&amp;#x2F;authorized_keys
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;删除binghe101节点上~/.ssh下的102和103文件。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;rm ~&amp;#x2F;.ssh&amp;#x2F;102
rm ~&amp;#x2F;.ssh&amp;#x2F;103
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;安装JDK&#34;&gt;安装JDK&lt;/h2&gt;
&lt;p&gt;需要在每台服务器上安装JDK环境。到Oracle官方下载JDK，我这里下的JDK版本为1.8.0_202，下载后解压并配置系统环境变量。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tar -zxvf jdk1.8.0_212.tar.gz
mv jdk1.8.0_212 &amp;#x2F;usr&amp;#x2F;local
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;接下来，配置系统环境变量。&lt;/p&gt;
&lt;p&gt;配置项内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;JAVA_HOME&amp;#x3D;&amp;#x2F;usr&amp;#x2F;local&amp;#x2F;jdk1.8.0_212
CLASS_PATH&amp;#x3D;.:$JAVA_HOME&amp;#x2F;lib
PATH&amp;#x3D;$JAVA_HOME&amp;#x2F;bin:$PATH
export JAVA_HOME CLASS_PATH PATH
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;接下来执行如下命令使系统环境变量生效。&lt;/p&gt;
&lt;h2 id=&#34;安装Maven&#34;&gt;安装Maven&lt;/h2&gt;
&lt;p&gt;到Apache官方下载Maven，我这里下载的Maven版本为3.6.3。下载后直接解压并配置系统环境变量。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tar -zxvf apache-maven-3.6.3-bin.tar.gz
mv apache-maven-3.6.3-bin &amp;#x2F;usr&amp;#x2F;local
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;接下来，就是配置系统环境变量。&lt;/p&gt;
&lt;p&gt;配置项内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;JAVA_HOME&amp;#x3D;&amp;#x2F;usr&amp;#x2F;local&amp;#x2F;jdk1.8.0_212
MAVEN_HOME&amp;#x3D;&amp;#x2F;usr&amp;#x2F;local&amp;#x2F;apache-maven-3.6.3-bin
CLASS_PATH&amp;#x3D;.:$JAVA_HOME&amp;#x2F;lib
PATH&amp;#x3D;$MAVEN_HOME&amp;#x2F;bin:$JAVA_HOME&amp;#x2F;bin:$PATH
export JAVA_HOME CLASS_PATH MAVEN_HOME PATH
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;接下来执行如下命令使系统环境变量生效。&lt;/p&gt;
&lt;p&gt;接下来，修改Maven的配置文件，如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&amp;lt;localRepository&amp;gt;&amp;#x2F;home&amp;#x2F;repository&amp;lt;&amp;#x2F;localRepository&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;将Maven下载的Jar包存储到/home/repository目录下。&lt;/p&gt;
&lt;h2 id=&#34;安装Docker环境&#34;&gt;安装Docker环境&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;本文档基于Docker 19.03.8 版本搭建Docker环境。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在所有服务器上创建install_docker.sh脚本，脚本内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;export REGISTRY_MIRROR&amp;#x3D;https:&amp;#x2F;&amp;#x2F;registry.cn-hangzhou.aliyuncs.com
dnf install yum*
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http:&amp;#x2F;&amp;#x2F;mirrors.aliyun.com&amp;#x2F;docker-ce&amp;#x2F;linux&amp;#x2F;centos&amp;#x2F;docker-ce.repo
dnf install https:&amp;#x2F;&amp;#x2F;mirrors.aliyun.com&amp;#x2F;docker-ce&amp;#x2F;linux&amp;#x2F;centos&amp;#x2F;7&amp;#x2F;x86_64&amp;#x2F;stable&amp;#x2F;Packages&amp;#x2F;containerd.io-1.2.13-3.1.el7.x86_64.rpm
yum install -y docker-ce-19.03.8 docker-ce-cli-19.03.8
systemctl enable docker.service
systemctl start docker.service
docker version
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;在每台服务器上为install_docker.sh脚本赋予可执行权限，并执行脚本即可。&lt;/p&gt;
&lt;h2 id=&#34;安装docker-compose&#34;&gt;安装docker-compose&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;注意：在每台服务器上安装docker-compose&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.下载docker-compose文件&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;curl -L https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;docker&amp;#x2F;compose&amp;#x2F;releases&amp;#x2F;download&amp;#x2F;1.25.5&amp;#x2F;docker-compose-&amp;#96;uname -s&amp;#96;-&amp;#96;uname -m&amp;#96; -o &amp;#x2F;usr&amp;#x2F;local&amp;#x2F;bin&amp;#x2F;docker-compose 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-为docker-compose文件赋予可执行权限&#34;&gt;2.为docker-compose文件赋予可执行权限&lt;/h3&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;chmod a+x &amp;#x2F;usr&amp;#x2F;local&amp;#x2F;bin&amp;#x2F;docker-compose
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;3-查看docker-compose版本&#34;&gt;3.查看docker-compose版本&lt;/h3&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe ~]# docker-compose version
docker-compose version 1.25.5, build 8a1c60f6
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;安装K8S集群环境&#34;&gt;安装K8S集群环境&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;本文档基于K8S 1.8.12版本来搭建K8S集群&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;安装K8S基础环境&#34;&gt;安装K8S基础环境&lt;/h3&gt;
&lt;p&gt;在所有服务器上创建install_k8s.sh脚本文件，脚本文件的内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;#配置阿里云镜像加速器
mkdir -p &amp;#x2F;etc&amp;#x2F;docker
tee &amp;#x2F;etc&amp;#x2F;docker&amp;#x2F;daemon.json &amp;lt;&amp;lt;-&amp;#39;EOF&amp;#39;
&amp;#123;
  &amp;quot;registry-mirrors&amp;quot;: [&amp;quot;https:&amp;#x2F;&amp;#x2F;zz3sblpi.mirror.aliyuncs.com&amp;quot;]
&amp;#125;
EOF
systemctl daemon-reload
systemctl restart docker

#安装nfs-utils
yum install -y nfs-utils
yum install -y wget

#启动nfs-server
systemctl start nfs-server
systemctl enable nfs-server

#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

#关闭SeLinux
setenforce 0
sed -i &amp;quot;s&amp;#x2F;SELINUX&amp;#x3D;enforcing&amp;#x2F;SELINUX&amp;#x3D;disabled&amp;#x2F;g&amp;quot; &amp;#x2F;etc&amp;#x2F;selinux&amp;#x2F;config

# 关闭 swap
swapoff -a
yes | cp &amp;#x2F;etc&amp;#x2F;fstab &amp;#x2F;etc&amp;#x2F;fstab_bak
cat &amp;#x2F;etc&amp;#x2F;fstab_bak |grep -v swap &amp;gt; &amp;#x2F;etc&amp;#x2F;fstab

#修改 &amp;#x2F;etc&amp;#x2F;sysctl.conf
# 如果有配置，则修改
sed -i &amp;quot;s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward&amp;#x3D;1#g&amp;quot;  &amp;#x2F;etc&amp;#x2F;sysctl.conf
sed -i &amp;quot;s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables&amp;#x3D;1#g&amp;quot;  &amp;#x2F;etc&amp;#x2F;sysctl.conf
sed -i &amp;quot;s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables&amp;#x3D;1#g&amp;quot;  &amp;#x2F;etc&amp;#x2F;sysctl.conf
sed -i &amp;quot;s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6&amp;#x3D;1#g&amp;quot;  &amp;#x2F;etc&amp;#x2F;sysctl.conf
sed -i &amp;quot;s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6&amp;#x3D;1#g&amp;quot;  &amp;#x2F;etc&amp;#x2F;sysctl.conf
sed -i &amp;quot;s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6&amp;#x3D;1#g&amp;quot;  &amp;#x2F;etc&amp;#x2F;sysctl.conf
sed -i &amp;quot;s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding&amp;#x3D;1#g&amp;quot;  &amp;#x2F;etc&amp;#x2F;sysctl.conf
# 可能没有，追加
echo &amp;quot;net.ipv4.ip_forward &amp;#x3D; 1&amp;quot; &amp;gt;&amp;gt; &amp;#x2F;etc&amp;#x2F;sysctl.conf
echo &amp;quot;net.bridge.bridge-nf-call-ip6tables &amp;#x3D; 1&amp;quot; &amp;gt;&amp;gt; &amp;#x2F;etc&amp;#x2F;sysctl.conf
echo &amp;quot;net.bridge.bridge-nf-call-iptables &amp;#x3D; 1&amp;quot; &amp;gt;&amp;gt; &amp;#x2F;etc&amp;#x2F;sysctl.conf
echo &amp;quot;net.ipv6.conf.all.disable_ipv6 &amp;#x3D; 1&amp;quot; &amp;gt;&amp;gt; &amp;#x2F;etc&amp;#x2F;sysctl.conf
echo &amp;quot;net.ipv6.conf.default.disable_ipv6 &amp;#x3D; 1&amp;quot; &amp;gt;&amp;gt; &amp;#x2F;etc&amp;#x2F;sysctl.conf
echo &amp;quot;net.ipv6.conf.lo.disable_ipv6 &amp;#x3D; 1&amp;quot; &amp;gt;&amp;gt; &amp;#x2F;etc&amp;#x2F;sysctl.conf
echo &amp;quot;net.ipv6.conf.all.forwarding &amp;#x3D; 1&amp;quot;  &amp;gt;&amp;gt; &amp;#x2F;etc&amp;#x2F;sysctl.conf
# 执行命令以应用
sysctl -p

# 配置K8S的yum源
cat &amp;lt;&amp;lt;EOF &amp;gt; &amp;#x2F;etc&amp;#x2F;yum.repos.d&amp;#x2F;kubernetes.repo
[kubernetes]
name&amp;#x3D;Kubernetes
baseurl&amp;#x3D;http:&amp;#x2F;&amp;#x2F;mirrors.aliyun.com&amp;#x2F;kubernetes&amp;#x2F;yum&amp;#x2F;repos&amp;#x2F;kubernetes-el7-x86_64
enabled&amp;#x3D;1
gpgcheck&amp;#x3D;0
repo_gpgcheck&amp;#x3D;0
gpgkey&amp;#x3D;http:&amp;#x2F;&amp;#x2F;mirrors.aliyun.com&amp;#x2F;kubernetes&amp;#x2F;yum&amp;#x2F;doc&amp;#x2F;yum-key.gpg
       http:&amp;#x2F;&amp;#x2F;mirrors.aliyun.com&amp;#x2F;kubernetes&amp;#x2F;yum&amp;#x2F;doc&amp;#x2F;rpm-package-key.gpg
EOF

# 卸载旧版本K8S
yum remove -y kubelet kubeadm kubectl

# 安装kubelet、kubeadm、kubectl，这里我安装的是1.18.2版本，你也可以安装1.17.2版本
yum install -y kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2

# 修改docker Cgroup Driver为systemd
# # 将&amp;#x2F;usr&amp;#x2F;lib&amp;#x2F;systemd&amp;#x2F;system&amp;#x2F;docker.service文件中的这一行 ExecStart&amp;#x3D;&amp;#x2F;usr&amp;#x2F;bin&amp;#x2F;dockerd -H fd:&amp;#x2F;&amp;#x2F; --containerd&amp;#x3D;&amp;#x2F;run&amp;#x2F;containerd&amp;#x2F;containerd.sock
# # 修改为 ExecStart&amp;#x3D;&amp;#x2F;usr&amp;#x2F;bin&amp;#x2F;dockerd -H fd:&amp;#x2F;&amp;#x2F; --containerd&amp;#x3D;&amp;#x2F;run&amp;#x2F;containerd&amp;#x2F;containerd.sock --exec-opt native.cgroupdriver&amp;#x3D;systemd
# 如果不修改，在添加 worker 节点时可能会碰到如下错误
# [WARNING IsDockerSystemdCheck]: detected &amp;quot;cgroupfs&amp;quot; as the Docker cgroup driver. The recommended driver is &amp;quot;systemd&amp;quot;. 
# Please follow the guide at https:&amp;#x2F;&amp;#x2F;kubernetes.io&amp;#x2F;docs&amp;#x2F;setup&amp;#x2F;cri&amp;#x2F;
sed -i &amp;quot;s#^ExecStart&amp;#x3D;&amp;#x2F;usr&amp;#x2F;bin&amp;#x2F;dockerd.*#ExecStart&amp;#x3D;&amp;#x2F;usr&amp;#x2F;bin&amp;#x2F;dockerd -H fd:&amp;#x2F;&amp;#x2F; --containerd&amp;#x3D;&amp;#x2F;run&amp;#x2F;containerd&amp;#x2F;containerd.sock --exec-opt native.cgroupdriver&amp;#x3D;systemd#g&amp;quot; &amp;#x2F;usr&amp;#x2F;lib&amp;#x2F;systemd&amp;#x2F;system&amp;#x2F;docker.service

# 设置 docker 镜像，提高 docker 镜像下载速度和稳定性
# 如果访问 https:&amp;#x2F;&amp;#x2F;hub.docker.io 速度非常稳定，亦可以跳过这个步骤
# curl -sSL https:&amp;#x2F;&amp;#x2F;kuboard.cn&amp;#x2F;install-script&amp;#x2F;set_mirror.sh | sh -s $&amp;#123;REGISTRY_MIRROR&amp;#125;

# 重启 docker，并启动 kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet &amp;amp;&amp;amp; systemctl start kubelet

docker version
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;在每台服务器上为install_k8s.sh脚本赋予可执行权限，并执行脚本即可。&lt;/p&gt;
&lt;h3 id=&#34;初始化Master节点&#34;&gt;初始化Master节点&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;只在binghe101服务器上执行的操作。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.初始化Master节点的网络环境&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;注意：下面的命令需要在命令行手动执行。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 只在 master 节点执行
# export 命令只在当前 shell 会话中有效，开启新的 shell 窗口后，如果要继续安装过程，请重新执行此处的 export 命令
export MASTER_IP&amp;#x3D;192.168.175.101
# 替换 k8s.master 为 您想要的 dnsName
export APISERVER_NAME&amp;#x3D;k8s.master
# Kubernetes 容器组所在的网段，该网段安装完成后，由 kubernetes 创建，事先并不存在于物理网络中
export POD_SUBNET&amp;#x3D;172.18.0.1&amp;#x2F;16
echo &amp;quot;$&amp;#123;MASTER_IP&amp;#125;    $&amp;#123;APISERVER_NAME&amp;#125;&amp;quot; &amp;gt;&amp;gt; &amp;#x2F;etc&amp;#x2F;hosts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;2.初始化Master节点&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在binghe101服务器上创建init_master.sh脚本文件，文件内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;#!&amp;#x2F;bin&amp;#x2F;bash
# 脚本出错时终止执行
set -e

if [ $&amp;#123;#POD_SUBNET&amp;#125; -eq 0 ] || [ $&amp;#123;#APISERVER_NAME&amp;#125; -eq 0 ]; then
  echo -e &amp;quot;\033[31;1m请确保您已经设置了环境变量 POD_SUBNET 和 APISERVER_NAME \033[0m&amp;quot;
  echo 当前POD_SUBNET&amp;#x3D;$POD_SUBNET
  echo 当前APISERVER_NAME&amp;#x3D;$APISERVER_NAME
  exit 1
fi


# 查看完整配置选项 https:&amp;#x2F;&amp;#x2F;godoc.org&amp;#x2F;k8s.io&amp;#x2F;kubernetes&amp;#x2F;cmd&amp;#x2F;kubeadm&amp;#x2F;app&amp;#x2F;apis&amp;#x2F;kubeadm&amp;#x2F;v1beta2
rm -f .&amp;#x2F;kubeadm-config.yaml
cat &amp;lt;&amp;lt;EOF &amp;gt; .&amp;#x2F;kubeadm-config.yaml
apiVersion: kubeadm.k8s.io&amp;#x2F;v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.18.2
imageRepository: registry.cn-hangzhou.aliyuncs.com&amp;#x2F;google_containers
controlPlaneEndpoint: &amp;quot;$&amp;#123;APISERVER_NAME&amp;#125;:6443&amp;quot;
networking:
  serviceSubnet: &amp;quot;10.96.0.0&amp;#x2F;16&amp;quot;
  podSubnet: &amp;quot;$&amp;#123;POD_SUBNET&amp;#125;&amp;quot;
  dnsDomain: &amp;quot;cluster.local&amp;quot;
EOF

# kubeadm init
# 根据服务器网速的情况，您需要等候 3 - 10 分钟
kubeadm init --config&amp;#x3D;kubeadm-config.yaml --upload-certs

# 配置 kubectl
rm -rf &amp;#x2F;root&amp;#x2F;.kube&amp;#x2F;
mkdir &amp;#x2F;root&amp;#x2F;.kube&amp;#x2F;
cp -i &amp;#x2F;etc&amp;#x2F;kubernetes&amp;#x2F;admin.conf &amp;#x2F;root&amp;#x2F;.kube&amp;#x2F;config

# 安装 calico 网络插件
# 参考文档 https:&amp;#x2F;&amp;#x2F;docs.projectcalico.org&amp;#x2F;v3.13&amp;#x2F;getting-started&amp;#x2F;kubernetes&amp;#x2F;self-managed-onprem&amp;#x2F;onpremises
echo &amp;quot;安装calico-3.13.1&amp;quot;
rm -f calico-3.13.1.yaml
wget https:&amp;#x2F;&amp;#x2F;kuboard.cn&amp;#x2F;install-script&amp;#x2F;calico&amp;#x2F;calico-3.13.1.yaml
kubectl apply -f calico-3.13.1.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;赋予init_master.sh脚本文件可执行权限并执行脚本。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.查看Master节点的初始化结果&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;（1）确保所有容器组处于Running状态&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 执行如下命令，等待 3-10 分钟，直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;具体执行如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 ~]# watch kubectl get pod -n kube-system -o wide
Every 2.0s: kubectl get pod -n kube-system -o wide                                                                                                                          binghe101: Sun May 10 11:01:32 2020

NAME                                       READY   STATUS    RESTARTS   AGE    IP                NODE        NOMINATED NODE   READINESS GATES          
calico-kube-controllers-5b8b769fcd-5dtlp   1&amp;#x2F;1     Running   0          118s   172.18.203.66     binghe101   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;          
calico-node-fnv8g                          1&amp;#x2F;1     Running   0          118s   192.168.175.101   binghe101   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;          
coredns-546565776c-27t7h                   1&amp;#x2F;1     Running   0          2m1s   172.18.203.67     binghe101   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;          
coredns-546565776c-hjb8z                   1&amp;#x2F;1     Running   0          2m1s   172.18.203.65     binghe101   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;          
etcd-binghe101                             1&amp;#x2F;1     Running   0          2m7s   192.168.175.101   binghe101   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;          
kube-apiserver-binghe101                   1&amp;#x2F;1     Running   0          2m7s   192.168.175.101   binghe101   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;          
kube-controller-manager-binghe101          1&amp;#x2F;1     Running   0          2m7s   192.168.175.101   binghe101   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;          
kube-proxy-dvgsr                           1&amp;#x2F;1     Running   0          2m1s   192.168.175.101   binghe101   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;          
kube-scheduler-binghe101                   1&amp;#x2F;1     Running   0          2m7s   192.168.175.101   binghe101   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;（2） 查看 Master 节点初始化结果&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl get nodes -o wide
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;具体执行如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 ~]# kubectl get nodes -o wide
NAME        STATUS   ROLES    AGE     VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION         CONTAINER-RUNTIME
binghe101   Ready    master   3m28s   v1.18.2   192.168.175.101   &amp;lt;none&amp;gt;        CentOS Linux 8 (Core)   4.18.0-80.el8.x86_64   docker:&amp;#x2F;&amp;#x2F;19.3.8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;初始化Worker节点&#34;&gt;初始化Worker节点&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1.获取join命令参数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在Master节点（binghe101服务器）上执行如下命令获取join命令参数。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubeadm token create --print-join-command
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;具体执行如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 ~]# kubeadm token create --print-join-command
W0510 11:04:34.828126   56132 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join k8s.master:6443 --token 8nblts.62xytoqufwsqzko2     --discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;其中，有如下一行输出。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubeadm join k8s.master:6443 --token 8nblts.62xytoqufwsqzko2     --discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;这行代码就是获取到的join命令。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：join命令中的token的有效时间为 2 个小时，2小时内，可以使用此 token 初始化任意数量的 worker 节点。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;2.初始化Worker节点&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;针对所有的 worker 节点执行，在这里，就是在binghe102服务器和binghe103服务器上执行。&lt;/p&gt;
&lt;p&gt;在命令分别手动执行如下命令。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 只在 worker 节点执行
# 192.168.175.101 为 master 节点的内网 IP
export MASTER_IP&amp;#x3D;192.168.175.101
# 替换 k8s.master 为初始化 master 节点时所使用的 APISERVER_NAME
export APISERVER_NAME&amp;#x3D;k8s.master
echo &amp;quot;$&amp;#123;MASTER_IP&amp;#125;    $&amp;#123;APISERVER_NAME&amp;#125;&amp;quot; &amp;gt;&amp;gt; &amp;#x2F;etc&amp;#x2F;hosts

# 替换为 master 节点上 kubeadm token create 命令输出的join
kubeadm join k8s.master:6443 --token 8nblts.62xytoqufwsqzko2     --discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;具体执行如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe102 ~]# export MASTER_IP&amp;#x3D;192.168.175.101
[root@binghe102 ~]# export APISERVER_NAME&amp;#x3D;k8s.master
[root@binghe102 ~]# echo &amp;quot;$&amp;#123;MASTER_IP&amp;#125;    $&amp;#123;APISERVER_NAME&amp;#125;&amp;quot; &amp;gt;&amp;gt; &amp;#x2F;etc&amp;#x2F;hosts
[root@binghe102 ~]# kubeadm join k8s.master:6443 --token 8nblts.62xytoqufwsqzko2     --discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d 
W0510 11:08:27.709263   42795 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set.
[preflight] Running pre-flight checks
        [WARNING FileExisting-tc]: tc not found in system path
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with &amp;#39;kubectl -n kube-system get cm kubeadm-config -oyaml&amp;#39;
[kubelet-start] Downloading configuration for the kubelet from the &amp;quot;kubelet-config-1.18&amp;quot; ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file &amp;quot;&amp;#x2F;var&amp;#x2F;lib&amp;#x2F;kubelet&amp;#x2F;config.yaml&amp;quot;
[kubelet-start] Writing kubelet environment file with flags to file &amp;quot;&amp;#x2F;var&amp;#x2F;lib&amp;#x2F;kubelet&amp;#x2F;kubeadm-flags.env&amp;quot;
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run &amp;#39;kubectl get nodes&amp;#39; on the control-plane to see this node join the cluster.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;根据输出结果可以看出，Worker节点加入了K8S集群。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：kubeadm join…就是master 节点上 kubeadm token create 命令输出的join。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;3.查看初始化结果&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在Master节点（binghe101服务器）执行如下命令查看初始化结果。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl get nodes -o wide
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;具体执行如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 ~]# kubectl get nodes
NAME        STATUS   ROLES    AGE     VERSION
binghe101   Ready    master   20m     v1.18.2
binghe102   Ready    &amp;lt;none&amp;gt;   2m46s   v1.18.2
binghe103   Ready    &amp;lt;none&amp;gt;   2m46s   v1.18.2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：kubectl get nodes命令后面加上-o wide参数可以输出更多的信息。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;重启K8S集群引起的问题&#34;&gt;重启K8S集群引起的问题&lt;/h2&gt;
&lt;h3 id=&#34;1-Worker节点故障不能启动&#34;&gt;1.Worker节点故障不能启动&lt;/h3&gt;
&lt;p&gt;Master 节点的 IP 地址发生变化，导致 worker 节点不能启动。需要重新安装K8S集群，并确保所有节点都有固定的内网 IP 地址。&lt;/p&gt;
&lt;h3 id=&#34;2-Pod崩溃或不能正常访问&#34;&gt;2.Pod崩溃或不能正常访问&lt;/h3&gt;
&lt;p&gt;重启服务器后使用如下命令查看Pod的运行状态。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl get pods --all-namespaces
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;发现很多 Pod 不在 Running 状态，此时，需要使用如下命令删除运行不正常的Pod。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl delete pod &amp;lt;pod-name&amp;gt; -n &amp;lt;pod-namespece&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：如果Pod 是使用 Deployment、StatefulSet 等控制器创建的，K8S 将创建新的 Pod 作为替代，重新启动的 Pod 通常能够正常工作。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;K8S安装ingress-nginx&#34;&gt;K8S安装ingress-nginx&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;注意：在Master节点（binghe101服务器上执行）&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;1-创建ingress-nginx命名空间&#34;&gt;1.创建ingress-nginx命名空间&lt;/h3&gt;
&lt;p&gt;创建ingress-nginx-namespace.yaml文件，文件内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: Namespace
metadata:
  name: ingress-nginx
  labels:
    name: ingress-nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;执行如下命令创建ingress-nginx命名空间。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f ingress-nginx-namespace.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-安装ingress-controller&#34;&gt;2.安装ingress controller&lt;/h3&gt;
&lt;p&gt;创建ingress-nginx-mandatory.yaml文件，文件内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: Namespace
metadata:
  name: ingress-nginx

---

apiVersion: apps&amp;#x2F;v1
kind: Deployment
metadata:
  name: default-http-backend
  labels:
    app.kubernetes.io&amp;#x2F;name: default-http-backend
    app.kubernetes.io&amp;#x2F;part-of: ingress-nginx
  namespace: ingress-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io&amp;#x2F;name: default-http-backend
      app.kubernetes.io&amp;#x2F;part-of: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io&amp;#x2F;name: default-http-backend
        app.kubernetes.io&amp;#x2F;part-of: ingress-nginx
    spec:
      terminationGracePeriodSeconds: 60
      containers:
        - name: default-http-backend
          
          
          
          image: registry.cn-qingdao.aliyuncs.com&amp;#x2F;kubernetes_xingej&amp;#x2F;defaultbackend-amd64:1.5
          livenessProbe:
            httpGet:
              path: &amp;#x2F;healthz
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 30
            timeoutSeconds: 5
          ports:
            - containerPort: 8080
          resources:
            limits:
              cpu: 10m
              memory: 20Mi
            requests:
              cpu: 10m
              memory: 20Mi

---
apiVersion: v1
kind: Service
metadata:
  name: default-http-backend
  namespace: ingress-nginx
  labels:
    app.kubernetes.io&amp;#x2F;name: default-http-backend
    app.kubernetes.io&amp;#x2F;part-of: ingress-nginx
spec:
  ports:
    - port: 80
      targetPort: 8080
  selector:
    app.kubernetes.io&amp;#x2F;name: default-http-backend
    app.kubernetes.io&amp;#x2F;part-of: ingress-nginx

---

kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
  labels:
    app.kubernetes.io&amp;#x2F;name: ingress-nginx
    app.kubernetes.io&amp;#x2F;part-of: ingress-nginx

---

kind: ConfigMap
apiVersion: v1
metadata:
  name: tcp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io&amp;#x2F;name: ingress-nginx
    app.kubernetes.io&amp;#x2F;part-of: ingress-nginx

---

kind: ConfigMap
apiVersion: v1
metadata:
  name: udp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io&amp;#x2F;name: ingress-nginx
    app.kubernetes.io&amp;#x2F;part-of: ingress-nginx

---

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nginx-ingress-serviceaccount
  namespace: ingress-nginx
  labels:
    app.kubernetes.io&amp;#x2F;name: ingress-nginx
    app.kubernetes.io&amp;#x2F;part-of: ingress-nginx

---
apiVersion: rbac.authorization.k8s.io&amp;#x2F;v1beta1
kind: ClusterRole
metadata:
  name: nginx-ingress-clusterrole
  labels:
    app.kubernetes.io&amp;#x2F;name: ingress-nginx
    app.kubernetes.io&amp;#x2F;part-of: ingress-nginx
rules:
  - apiGroups:
      - &amp;quot;&amp;quot;
    resources:
      - configmaps
      - endpoints
      - nodes
      - pods
      - secrets
    verbs:
      - list
      - watch
  - apiGroups:
      - &amp;quot;&amp;quot;
    resources:
      - nodes
    verbs:
      - get
  - apiGroups:
      - &amp;quot;&amp;quot;
    resources:
      - services
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - &amp;quot;extensions&amp;quot;
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - &amp;quot;&amp;quot;
    resources:
      - events
    verbs:
      - create
      - patch
  - apiGroups:
      - &amp;quot;extensions&amp;quot;
    resources:
      - ingresses&amp;#x2F;status
    verbs:
      - update

---
apiVersion: rbac.authorization.k8s.io&amp;#x2F;v1beta1
kind: Role
metadata:
  name: nginx-ingress-role
  namespace: ingress-nginx
  labels:
    app.kubernetes.io&amp;#x2F;name: ingress-nginx
    app.kubernetes.io&amp;#x2F;part-of: ingress-nginx
rules:
  - apiGroups:
      - &amp;quot;&amp;quot;
    resources:
      - configmaps
      - pods
      - secrets
      - namespaces
    verbs:
      - get
  - apiGroups:
      - &amp;quot;&amp;quot;
    resources:
      - configmaps
    resourceNames:
      
      
      
      
      - &amp;quot;ingress-controller-leader-nginx&amp;quot;
    verbs:
      - get
      - update
  - apiGroups:
      - &amp;quot;&amp;quot;
    resources:
      - configmaps
    verbs:
      - create
  - apiGroups:
      - &amp;quot;&amp;quot;
    resources:
      - endpoints
    verbs:
      - get

---
apiVersion: rbac.authorization.k8s.io&amp;#x2F;v1beta1
kind: RoleBinding
metadata:
  name: nginx-ingress-role-nisa-binding
  namespace: ingress-nginx
  labels:
    app.kubernetes.io&amp;#x2F;name: ingress-nginx
    app.kubernetes.io&amp;#x2F;part-of: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: nginx-ingress-role
subjects:
  - kind: ServiceAccount
    name: nginx-ingress-serviceaccount
    namespace: ingress-nginx

---
apiVersion: rbac.authorization.k8s.io&amp;#x2F;v1beta1
kind: ClusterRoleBinding
metadata:
  name: nginx-ingress-clusterrole-nisa-binding
  labels:
    app.kubernetes.io&amp;#x2F;name: ingress-nginx
    app.kubernetes.io&amp;#x2F;part-of: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: nginx-ingress-clusterrole
subjects:
  - kind: ServiceAccount
    name: nginx-ingress-serviceaccount
    namespace: ingress-nginx

---

apiVersion: apps&amp;#x2F;v1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
  labels:
    app.kubernetes.io&amp;#x2F;name: ingress-nginx
    app.kubernetes.io&amp;#x2F;part-of: ingress-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io&amp;#x2F;name: ingress-nginx
      app.kubernetes.io&amp;#x2F;part-of: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io&amp;#x2F;name: ingress-nginx
        app.kubernetes.io&amp;#x2F;part-of: ingress-nginx
      annotations:
        prometheus.io&amp;#x2F;port: &amp;quot;10254&amp;quot;
        prometheus.io&amp;#x2F;scrape: &amp;quot;true&amp;quot;
    spec:
      serviceAccountName: nginx-ingress-serviceaccount
      containers:
        - name: nginx-ingress-controller
          image: registry.cn-qingdao.aliyuncs.com&amp;#x2F;kubernetes_xingej&amp;#x2F;nginx-ingress-controller:0.20.0
          args:
            - &amp;#x2F;nginx-ingress-controller
            - --default-backend-service&amp;#x3D;$(POD_NAMESPACE)&amp;#x2F;default-http-backend
            - --configmap&amp;#x3D;$(POD_NAMESPACE)&amp;#x2F;nginx-configuration
            - --tcp-services-configmap&amp;#x3D;$(POD_NAMESPACE)&amp;#x2F;tcp-services
            - --udp-services-configmap&amp;#x3D;$(POD_NAMESPACE)&amp;#x2F;udp-services
            - --publish-service&amp;#x3D;$(POD_NAMESPACE)&amp;#x2F;ingress-nginx
            - --annotations-prefix&amp;#x3D;nginx.ingress.kubernetes.io
          securityContext:
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
            
            runAsUser: 33
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
            - name: http
              containerPort: 80
            - name: https
              containerPort: 443
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: &amp;#x2F;healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: &amp;#x2F;healthz
              port: 10254
              scheme: HTTP
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1

---
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;执行如下命令安装ingress controller。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f ingress-nginx-mandatory.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;3-安装K8S-SVC：ingress-nginx&#34;&gt;3.安装K8S SVC：ingress-nginx&lt;/h3&gt;
&lt;p&gt;主要是用来用于暴露pod：nginx-ingress-controller。&lt;/p&gt;
&lt;p&gt;创建service-nodeport.yaml文件，文件内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io&amp;#x2F;name: ingress-nginx
    app.kubernetes.io&amp;#x2F;part-of: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
      nodePort: 30080
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
      nodePort: 30443
  selector:
    app.kubernetes.io&amp;#x2F;name: ingress-nginx
    app.kubernetes.io&amp;#x2F;part-of: ingress-nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;执行如下命令安装。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f service-nodeport.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;4-访问K8S-SVC：ingress-nginx&#34;&gt;4.访问K8S SVC：ingress-nginx&lt;/h3&gt;
&lt;p&gt;查看ingress-nginx命名空间的部署情况，如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 k8s]# kubectl get pod -n ingress-nginx
NAME                                        READY   STATUS    RESTARTS   AGE
default-http-backend-796ddcd9b-vfmgn        1&amp;#x2F;1     Running   1          10h
nginx-ingress-controller-58985cc996-87754   1&amp;#x2F;1     Running   2          10h
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;在命令行服务器命令行输入如下命令查看ingress-nginx的端口映射情况。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl get svc -n ingress-nginx 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;具体如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 k8s]# kubectl get svc -n ingress-nginx 
NAME                   TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
default-http-backend   ClusterIP   10.96.247.2   &amp;lt;none&amp;gt;        80&amp;#x2F;TCP                       7m3s
ingress-nginx          NodePort    10.96.40.6    &amp;lt;none&amp;gt;        80:30080&amp;#x2F;TCP,443:30443&amp;#x2F;TCP   4m35s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;所以，可以通过Master节点（binghe101服务器）的IP地址和30080端口号来访问ingress-nginx，如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 k8s]# curl 192.168.175.101:30080       
default backend - 404
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;也可以在浏览器打开&lt;a href=&#34;http://192.168.175.101:30080&#34;&gt;http://192.168.175.101:30080&lt;/a&gt; 来访问ingress-nginx，如下所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;K8S安装gitlab代码仓库&#34;&gt;K8S安装gitlab代码仓库&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;注意：在Master节点（binghe101服务器上执行）&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;1-创建k8s-ops命名空间&#34;&gt;1.创建k8s-ops命名空间&lt;/h3&gt;
&lt;p&gt;创建k8s-ops-namespace.yaml文件，文件内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: Namespace
metadata:
  name: k8s-ops
  labels:
    name: k8s-ops
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;执行如下命令创建命名空间。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f k8s-ops-namespace.yaml 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-安装gitlab-redis&#34;&gt;2.安装gitlab-redis&lt;/h3&gt;
&lt;p&gt;创建gitlab-redis.yaml文件，文件的内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: apps&amp;#x2F;v1
kind: Deployment
metadata:
  name: redis
  namespace: k8s-ops
  labels:
    name: redis
spec:
  selector:
    matchLabels:
      name: redis
  template:
    metadata:
      name: redis
      labels:
        name: redis
    spec:
      containers:
      - name: redis
        image: sameersbn&amp;#x2F;redis
        imagePullPolicy: IfNotPresent
        ports:
        - name: redis
          containerPort: 6379
        volumeMounts:
        - mountPath: &amp;#x2F;var&amp;#x2F;lib&amp;#x2F;redis
          name: data
        livenessProbe:
          exec:
            command:
            - redis-cli
            - ping
          initialDelaySeconds: 30
          timeoutSeconds: 5
        readinessProbe:
          exec:
            command:
            - redis-cli
            - ping
          initialDelaySeconds: 10
          timeoutSeconds: 5
      volumes:
      - name: data
        hostPath:
          path: &amp;#x2F;data1&amp;#x2F;docker&amp;#x2F;xinsrv&amp;#x2F;redis

---
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: k8s-ops
  labels:
    name: redis
spec:
  ports:
    - name: redis
      port: 6379
      targetPort: redis
  selector:
    name: redis
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;首先，在命令行执行如下命令创建/data1/docker/xinsrv/redis目录。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;mkdir -p &amp;#x2F;data1&amp;#x2F;docker&amp;#x2F;xinsrv&amp;#x2F;redis
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;执行如下命令安装gitlab-redis。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f gitlab-redis.yaml 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;3-安装gitlab-postgresql&#34;&gt;3.安装gitlab-postgresql&lt;/h3&gt;
&lt;p&gt;创建gitlab-postgresql.yaml，文件内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: apps&amp;#x2F;v1
kind: Deployment
metadata:
  name: postgresql
  namespace: k8s-ops
  labels:
    name: postgresql
spec:
  selector:
    matchLabels:
      name: postgresql
  template:
    metadata:
      name: postgresql
      labels:
        name: postgresql
    spec:
      containers:
      - name: postgresql
        image: sameersbn&amp;#x2F;postgresql
        imagePullPolicy: IfNotPresent
        env:
        - name: DB_USER
          value: gitlab
        - name: DB_PASS
          value: passw0rd
        - name: DB_NAME
          value: gitlab_production
        - name: DB_EXTENSION
          value: pg_trgm
        ports:
        - name: postgres
          containerPort: 5432
        volumeMounts:
        - mountPath: &amp;#x2F;var&amp;#x2F;lib&amp;#x2F;postgresql
          name: data
        livenessProbe:
          exec:
            command:
            - pg_isready
            - -h
            - localhost
            - -U
            - postgres
          initialDelaySeconds: 30
          timeoutSeconds: 5
        readinessProbe:
          exec:
            command:
            - pg_isready
            - -h
            - localhost
            - -U
            - postgres
          initialDelaySeconds: 5
          timeoutSeconds: 1
      volumes:
      - name: data
        hostPath:
          path: &amp;#x2F;data1&amp;#x2F;docker&amp;#x2F;xinsrv&amp;#x2F;postgresql
---
apiVersion: v1
kind: Service
metadata:
  name: postgresql
  namespace: k8s-ops
  labels:
    name: postgresql
spec:
  ports:
    - name: postgres
      port: 5432
      targetPort: postgres
  selector:
    name: postgresql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;首先，执行如下命令创建/data1/docker/xinsrv/postgresql目录。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;mkdir -p &amp;#x2F;data1&amp;#x2F;docker&amp;#x2F;xinsrv&amp;#x2F;postgresql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;接下来，安装gitlab-postgresql，如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f gitlab-postgresql.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;4-安装gitlab&#34;&gt;4.安装gitlab&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;（1）配置用户名和密码&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先，在命令行使用base64编码为用户名和密码进行转码，本示例中，使用的用户名为admin，密码为admin.1231&lt;/p&gt;
&lt;p&gt;转码情况如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 k8s]# echo -n &amp;#39;admin&amp;#39; | base64 
YWRtaW4&amp;#x3D;
[root@binghe101 k8s]# echo -n &amp;#39;admin.1231&amp;#39; | base64 
YWRtaW4uMTIzMQ&amp;#x3D;&amp;#x3D;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;转码后的用户名为：YWRtaW4= 密码为：YWRtaW4uMTIzMQ==&lt;/p&gt;
&lt;p&gt;也可以对base64编码后的字符串解码，例如，对密码字符串解码，如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 k8s]# echo &amp;#39;YWRtaW4uMTIzMQ&amp;#x3D;&amp;#x3D;&amp;#39; | base64 --decode 
admin.1231
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;接下来，创建secret-gitlab.yaml文件，主要是用户来配置GitLab的用户名和密码，文件内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: Secret
metadata:
  namespace: k8s-ops
  name: git-user-pass
type: Opaque
data:
  username: YWRtaW4&amp;#x3D;
  password: YWRtaW4uMTIzMQ&amp;#x3D;&amp;#x3D;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;执行配置文件的内容，如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl create -f .&amp;#x2F;secret-gitlab.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;（2）安装GitLab&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;创建gitlab.yaml文件，文件的内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: apps&amp;#x2F;v1
kind: Deployment
metadata:
  name: gitlab
  namespace: k8s-ops
  labels:
    name: gitlab
spec:
  selector:
    matchLabels:
      name: gitlab
  template:
    metadata:
      name: gitlab
      labels:
        name: gitlab
    spec:
      containers:
      - name: gitlab
        image: sameersbn&amp;#x2F;gitlab:12.1.6
        imagePullPolicy: IfNotPresent
        env:
        - name: TZ
          value: Asia&amp;#x2F;Shanghai
        - name: GITLAB_TIMEZONE
          value: Beijing
        - name: GITLAB_SECRETS_DB_KEY_BASE
          value: long-and-random-alpha-numeric-string
        - name: GITLAB_SECRETS_SECRET_KEY_BASE
          value: long-and-random-alpha-numeric-string
        - name: GITLAB_SECRETS_OTP_KEY_BASE
          value: long-and-random-alpha-numeric-string
        - name: GITLAB_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: git-user-pass
              key: password
        - name: GITLAB_ROOT_EMAIL
          value: 12345678@qq.com
        - name: GITLAB_HOST
          value: gitlab.binghe.com
        - name: GITLAB_PORT
          value: &amp;quot;80&amp;quot;
        - name: GITLAB_SSH_PORT
          value: &amp;quot;30022&amp;quot;
        - name: GITLAB_NOTIFY_ON_BROKEN_BUILDS
          value: &amp;quot;true&amp;quot;
        - name: GITLAB_NOTIFY_PUSHER
          value: &amp;quot;false&amp;quot;
        - name: GITLAB_BACKUP_SCHEDULE
          value: daily
        - name: GITLAB_BACKUP_TIME
          value: 01:00
        - name: DB_TYPE
          value: postgres
        - name: DB_HOST
          value: postgresql
        - name: DB_PORT
          value: &amp;quot;5432&amp;quot;
        - name: DB_USER
          value: gitlab
        - name: DB_PASS
          value: passw0rd
        - name: DB_NAME
          value: gitlab_production
        - name: REDIS_HOST
          value: redis
        - name: REDIS_PORT
          value: &amp;quot;6379&amp;quot;
        ports:
        - name: http
          containerPort: 80
        - name: ssh
          containerPort: 22
        volumeMounts:
        - mountPath: &amp;#x2F;home&amp;#x2F;git&amp;#x2F;data
          name: data
        livenessProbe:
          httpGet:
            path: &amp;#x2F;
            port: 80
          initialDelaySeconds: 180
          timeoutSeconds: 5
        readinessProbe:
          httpGet:
            path: &amp;#x2F;
            port: 80
          initialDelaySeconds: 5
          timeoutSeconds: 1
      volumes:
      - name: data
        hostPath:
          path: &amp;#x2F;data1&amp;#x2F;docker&amp;#x2F;xinsrv&amp;#x2F;gitlab
---
apiVersion: v1
kind: Service
metadata:
  name: gitlab
  namespace: k8s-ops
  labels:
    name: gitlab
spec:
  ports:
    - name: http
      port: 80
      nodePort: 30088
    - name: ssh
      port: 22
      targetPort: ssh
      nodePort: 30022
  type: NodePort
  selector:
    name: gitlab

---
apiVersion: extensions&amp;#x2F;v1beta1
kind: Ingress
metadata:
  name: gitlab
  namespace: k8s-ops
  annotations:
    kubernetes.io&amp;#x2F;ingress.class: traefik
spec:
  rules:
  - host: gitlab.binghe.com
    http:
      paths:
      - backend:
          serviceName: gitlab
          servicePort: http
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;注意：在配置GitLab时，监听主机时，不能使用IP地址，需要使用主机名或者域名，上述配置中，我使用的是gitlab.binghe.com主机名。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在命令行执行如下命令创建/data1/docker/xinsrv/gitlab目录。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;mkdir -p &amp;#x2F;data1&amp;#x2F;docker&amp;#x2F;xinsrv&amp;#x2F;gitlab
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;安装GitLab，如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f gitlab.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;5-安装完成&#34;&gt;5.安装完成&lt;/h3&gt;
&lt;p&gt;查看k8s-ops命名空间部署情况，如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 k8s]# kubectl get pod -n k8s-ops
NAME                          READY   STATUS    RESTARTS   AGE
gitlab-7b459db47c-5vk6t       0&amp;#x2F;1     Running   0          11s
postgresql-79567459d7-x52vx   1&amp;#x2F;1     Running   0          30m
redis-67f4cdc96c-h5ckz        1&amp;#x2F;1     Running   1          10h
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;也可以使用如下命令查看。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 k8s]# kubectl get pod --namespace&amp;#x3D;k8s-ops
NAME                          READY   STATUS    RESTARTS   AGE
gitlab-7b459db47c-5vk6t       0&amp;#x2F;1     Running   0          36s
postgresql-79567459d7-x52vx   1&amp;#x2F;1     Running   0          30m
redis-67f4cdc96c-h5ckz        1&amp;#x2F;1     Running   1          10h
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;二者效果一样。&lt;/p&gt;
&lt;p&gt;接下来，查看GitLab的端口映射，如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 k8s]# kubectl get svc -n k8s-ops
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                     AGE
gitlab       NodePort    10.96.153.100   &amp;lt;none&amp;gt;        80:30088&amp;#x2F;TCP,22:30022&amp;#x2F;TCP   2m42s
postgresql   ClusterIP   10.96.203.119   &amp;lt;none&amp;gt;        5432&amp;#x2F;TCP                    32m
redis        ClusterIP   10.96.107.150   &amp;lt;none&amp;gt;        6379&amp;#x2F;TCP                    10h
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;此时，可以看到，可以通过Master节点（binghe101）的主机名gitlab.binghe.com和端口30088就能够访问GitLab。由于我这里使用的是虚拟机来搭建相关的环境，在本机访问虚拟机映射的gitlab.binghe.com时，需要配置本机的hosts文件，在本机的hosts文件中加入如下配置项。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ini&#34; data-language=&#34;ini&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ini&#34;&gt;192.168.175.101 gitlab.binghe.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;注意：在Windows操作系统中，hosts文件所在的目录如下。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ini&#34; data-language=&#34;ini&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ini&#34;&gt;C:\Windows\System32\drivers\etc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;接下来，就可以在浏览器中通过链接：&lt;a href=&#34;https://gitlab.binghe.com/30088&#34;&gt;http://gitlab.binghe.com:30088&lt;/a&gt; 来访问GitLab了，如下所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-1.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;此时，可以通过用户名root和密码admin.1231来登录GitLab了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：这里的用户名是root而不是admin，因为root是GitLab默认的超级用户。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-2.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;登录后的界面如下所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-3.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;到此，K8S安装gitlab完成。&lt;/p&gt;
&lt;h2 id=&#34;安装Harbor私有仓库&#34;&gt;安装Harbor私有仓库&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;注意：这里将Harbor私有仓库安装在Master节点（binghe101服务器）上，实际生产环境中建议安装在其他服务器。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;1-下载Harbor的离线安装版本&#34;&gt;1.下载Harbor的离线安装版本&lt;/h3&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;wget https:&amp;#x2F;&amp;#x2F;github.com&amp;#x2F;goharbor&amp;#x2F;harbor&amp;#x2F;releases&amp;#x2F;download&amp;#x2F;v1.10.2&amp;#x2F;harbor-offline-installer-v1.10.2.tgz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-解压Harbor的安装包&#34;&gt;2.解压Harbor的安装包&lt;/h3&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tar -zxvf harbor-offline-installer-v1.10.2.tgz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;解压成功后，会在服务器当前目录生成一个harbor目录。&lt;/p&gt;
&lt;h3 id=&#34;3-配置Harbor&#34;&gt;3.配置Harbor&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;注意：这里，我将Harbor的端口修改成了1180，如果不修改Harbor的端口，默认的端口是80。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;（1）修改harbor.yml文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;修改的配置项如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;hostname: 192.168.175.101
http:
  port: 1180
harbor_admin_password: binghe123
###并把https注释掉，不然在安装的时候会报错：ERROR:root:Error: The protocol is https but attribute ssl_cert is not set
#https:
  #port: 443
  #certificate: &amp;#x2F;your&amp;#x2F;certificate&amp;#x2F;path
  #private_key: &amp;#x2F;your&amp;#x2F;private&amp;#x2F;key&amp;#x2F;path
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;（2）修改daemon.json文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;修改/etc/docker/daemon.json文件，没有的话就创建，在/etc/docker/daemon.json文件中添加如下内容。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-json&#34; data-language=&#34;json&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-json&#34;&gt;[root@binghe~]# cat &amp;#x2F;etc&amp;#x2F;docker&amp;#x2F;daemon.json
&amp;#123;
  &amp;quot;registry-mirrors&amp;quot;: [&amp;quot;https:&amp;#x2F;&amp;#x2F;zz3sblpi.mirror.aliyuncs.com&amp;quot;],
  &amp;quot;insecure-registries&amp;quot;:[&amp;quot;192.168.175.101:1180&amp;quot;]
&amp;#125;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;也可以在服务器上使用 &lt;strong&gt;ip addr&lt;/strong&gt; 命令查看本机所有的IP地址段，将其配置到/etc/docker/daemon.json文件中。这里，我配置后的文件内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-json&#34; data-language=&#34;json&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-json&#34;&gt;&amp;#123;
    &amp;quot;registry-mirrors&amp;quot;: [&amp;quot;https:&amp;#x2F;&amp;#x2F;zz3sblpi.mirror.aliyuncs.com&amp;quot;],
    &amp;quot;insecure-registries&amp;quot;:[&amp;quot;192.168.175.0&amp;#x2F;16&amp;quot;,&amp;quot;172.17.0.0&amp;#x2F;16&amp;quot;, &amp;quot;172.18.0.0&amp;#x2F;16&amp;quot;, &amp;quot;172.16.29.0&amp;#x2F;16&amp;quot;, &amp;quot;192.168.175.101:1180&amp;quot;]
&amp;#125;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;4-安装并启动harbor&#34;&gt;4.安装并启动harbor&lt;/h3&gt;
&lt;p&gt;配置完成后，输入如下命令即可安装并启动Harbor&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe harbor]# .&amp;#x2F;install.sh 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;5-登录Harbor并添加账户&#34;&gt;5.登录Harbor并添加账户&lt;/h3&gt;
&lt;p&gt;安装成功后，在浏览器地址栏输入http://192.168.175.101:1180打开链接，如下图所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-4.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;输入用户名admin和密码binghe123，登录系统，如下图所示&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-5.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;接下来，我们选择用户管理，添加一个管理员账户，为后续打包Docker镜像和上传Docker镜像做准备。添加账户的步骤如下所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-6.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-7.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;此处填写的密码为Binghe123。&lt;/p&gt;
&lt;p&gt;点击确定后，如下所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-8.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;此时，账户binghe还不是管理员，此时选中binghe账户，点击“设置为管理员”。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-9.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-10.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;此时，binghe账户就被设置为管理员了。到此，Harbor的安装就完成了。&lt;/p&gt;
&lt;h3 id=&#34;6-修改Harbor端口&#34;&gt;6.修改Harbor端口&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;如果安装Harbor后，大家需要修改Harbor的端口，可以按照如下步骤修改Harbor的端口，这里，我以将80端口修改为1180端口为例&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;（1）修改harbor.yml文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;修改的配置项如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;hostname: 192.168.175.101
http:
  port: 1180
harbor_admin_password: binghe123
###并把https注释掉，不然在安装的时候会报错：ERROR:root:Error: The protocol is https but attribute ssl_cert is not set
#https:
  #port: 443
  #certificate: &amp;#x2F;your&amp;#x2F;certificate&amp;#x2F;path
  #private_key: &amp;#x2F;your&amp;#x2F;private&amp;#x2F;key&amp;#x2F;path
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;（2）修改docker-compose.yml文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;修改的配置项如下所示。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;（3）修改config.yml文件&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;cd common&amp;#x2F;config&amp;#x2F;registry
vim config.yml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;修改的配置项如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;realm: http:&amp;#x2F;&amp;#x2F;192.168.175.101:1180&amp;#x2F;service&amp;#x2F;token
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;（4）重启Docker&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;systemctl daemon-reload
systemctl restart docker.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;（5）重启Harbor&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe harbor]# docker-compose down
Stopping harbor-log ... done
Removing nginx             ... done
Removing harbor-portal     ... done
Removing harbor-jobservice ... done
Removing harbor-core       ... done
Removing redis             ... done
Removing registry          ... done
Removing registryctl       ... done
Removing harbor-db         ... done
Removing harbor-log        ... done
Removing network harbor_harbor
 
[root@binghe harbor]# .&amp;#x2F;prepare
prepare base dir is set to &amp;#x2F;mnt&amp;#x2F;harbor
Clearing the configuration file: &amp;#x2F;config&amp;#x2F;log&amp;#x2F;logrotate.conf
Clearing the configuration file: &amp;#x2F;config&amp;#x2F;nginx&amp;#x2F;nginx.conf
Clearing the configuration file: &amp;#x2F;config&amp;#x2F;core&amp;#x2F;env
Clearing the configuration file: &amp;#x2F;config&amp;#x2F;core&amp;#x2F;app.conf
Clearing the configuration file: &amp;#x2F;config&amp;#x2F;registry&amp;#x2F;root.crt
Clearing the configuration file: &amp;#x2F;config&amp;#x2F;registry&amp;#x2F;config.yml
Clearing the configuration file: &amp;#x2F;config&amp;#x2F;registryctl&amp;#x2F;env
Clearing the configuration file: &amp;#x2F;config&amp;#x2F;registryctl&amp;#x2F;config.yml
Clearing the configuration file: &amp;#x2F;config&amp;#x2F;db&amp;#x2F;env
Clearing the configuration file: &amp;#x2F;config&amp;#x2F;jobservice&amp;#x2F;env
Clearing the configuration file: &amp;#x2F;config&amp;#x2F;jobservice&amp;#x2F;config.yml
Generated configuration file: &amp;#x2F;config&amp;#x2F;log&amp;#x2F;logrotate.conf
Generated configuration file: &amp;#x2F;config&amp;#x2F;nginx&amp;#x2F;nginx.conf
Generated configuration file: &amp;#x2F;config&amp;#x2F;core&amp;#x2F;env
Generated configuration file: &amp;#x2F;config&amp;#x2F;core&amp;#x2F;app.conf
Generated configuration file: &amp;#x2F;config&amp;#x2F;registry&amp;#x2F;config.yml
Generated configuration file: &amp;#x2F;config&amp;#x2F;registryctl&amp;#x2F;env
Generated configuration file: &amp;#x2F;config&amp;#x2F;db&amp;#x2F;env
Generated configuration file: &amp;#x2F;config&amp;#x2F;jobservice&amp;#x2F;env
Generated configuration file: &amp;#x2F;config&amp;#x2F;jobservice&amp;#x2F;config.yml
loaded secret from file: &amp;#x2F;secret&amp;#x2F;keys&amp;#x2F;secretkey
Generated configuration file: &amp;#x2F;compose_location&amp;#x2F;docker-compose.yml
Clean up the input dir
 
[root@binghe harbor]# docker-compose up -d
Creating network &amp;quot;harbor_harbor&amp;quot; with the default driver
Creating harbor-log ... done
Creating harbor-db   ... done
Creating redis       ... done
Creating registry    ... done
Creating registryctl ... done
Creating harbor-core ... done
Creating harbor-jobservice ... done
Creating harbor-portal     ... done
Creating nginx             ... done
 
[root@binghe harbor]# docker ps -a
CONTAINER ID        IMAGE                                               COMMAND                  CREATED             STATUS                             PORTS
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;安装Jenkins（一般的做法）&#34;&gt;安装Jenkins（一般的做法）&lt;/h2&gt;
&lt;h3 id=&#34;1-安装nfs（之前安装过的话，可以省略此步）&#34;&gt;1.安装nfs（之前安装过的话，可以省略此步）&lt;/h3&gt;
&lt;p&gt;使用 nfs 最大的问题就是写权限，可以使用 kubernetes 的 securityContext/runAsUser 指定 jenkins 容器中运行 jenkins 的用户 uid，以此来指定 nfs 目录的权限，让 jenkins 容器可写；也可以不限制，让所有用户都可以写。这里为了简单，就让所有用户可写了。&lt;/p&gt;
&lt;p&gt;如果之前已经安装过nfs，则这一步可以省略。找一台主机，安装 nfs，这里，我以在Master节点（binghe101服务器）上安装nfs为例。&lt;/p&gt;
&lt;p&gt;在命令行输入如下命令安装并启动nfs。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;yum install nfs-utils -y
systemctl start nfs-server
systemctl enable nfs-server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-创建nfs共享目录&#34;&gt;2.创建nfs共享目录&lt;/h3&gt;
&lt;p&gt;在Master节点（binghe101服务器）上创建 &lt;code&gt;/opt/nfs/jenkins-data&lt;/code&gt;目录作为nfs的共享目录，如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;mkdir -p &amp;#x2F;opt&amp;#x2F;nfs&amp;#x2F;jenkins-data
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;接下来，编辑/etc/exports文件，如下所示。&lt;/p&gt;
&lt;p&gt;在/etc/exports文件文件中添加如下一行配置。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ini&#34; data-language=&#34;ini&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ini&#34;&gt;&amp;#x2F;opt&amp;#x2F;nfs&amp;#x2F;jenkins-data 192.168.175.0&amp;#x2F;24(rw,all_squash)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;这里的 ip 使用 kubernetes node 节点的 ip 范围，后面的 &lt;code&gt;all_squash&lt;/code&gt; 选项会将所有访问的用户都映射成 nfsnobody 用户，不管你是什么用户访问，最终都会压缩成 nfsnobody，所以只要将 &lt;code&gt;/opt/nfs/jenkins-data&lt;/code&gt; 的属主改为 nfsnobody，那么无论什么用户来访问都具有写权限。&lt;/p&gt;
&lt;p&gt;这个选项在很多机器上由于用户 uid 不规范导致启动进程的用户不同，但是同时要对一个共享目录具有写权限时很有效。&lt;/p&gt;
&lt;p&gt;接下来，为 &lt;code&gt;/opt/nfs/jenkins-data&lt;/code&gt;目录授权，并重新加载nfs，如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;chown -R 1000 &amp;#x2F;opt&amp;#x2F;nfs&amp;#x2F;jenkins-data&amp;#x2F;
systemctl reload nfs-server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;在K8S集群中任意一个节点上使用如下命令进行验证：&lt;/p&gt;
&lt;p&gt;如果能够看到 /opt/nfs/jenkins-data 就表示 ok 了。&lt;/p&gt;
&lt;p&gt;具体如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 ~]# showmount -e 192.168.175.101
Export list for 192.168.175.101:
&amp;#x2F;opt&amp;#x2F;nfs&amp;#x2F;jenkins-data 192.168.175.0&amp;#x2F;24

[root@binghe102 ~]# showmount -e 192.168.175.101
Export list for 192.168.175.101:
&amp;#x2F;opt&amp;#x2F;nfs&amp;#x2F;jenkins-data 192.168.175.0&amp;#x2F;24
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;3-创建PV&#34;&gt;3.创建PV&lt;/h3&gt;
&lt;p&gt;Jenkins 其实只要加载对应的目录就可以读取之前的数据，但是由于 deployment 无法定义存储卷，因此我们只能使用 StatefulSet。&lt;/p&gt;
&lt;p&gt;首先创建 pv，pv 是给 StatefulSet 使用的，每次 StatefulSet 启动都会通过 volumeClaimTemplates 这个模板去创建 pvc，因此必须得有 pv，才能供 pvc 绑定。&lt;/p&gt;
&lt;p&gt;创建jenkins-pv.yaml文件，文件内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins
spec:
  nfs:
    path: &amp;#x2F;opt&amp;#x2F;nfs&amp;#x2F;jenkins-data
    server: 192.168.175.101
  accessModes: [&amp;quot;ReadWriteOnce&amp;quot;]
  capacity:
    storage: 1Ti
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;我这里给了 1T存储空间，可以根据实际配置。&lt;/p&gt;
&lt;p&gt;执行如下命令创建pv。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f jenkins-pv.yaml 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;4-创建serviceAccount&#34;&gt;4.创建serviceAccount&lt;/h3&gt;
&lt;p&gt;创建service account，因为 jenkins 后面需要能够动态创建 slave，因此它必须具备一些权限。&lt;/p&gt;
&lt;p&gt;创建jenkins-service-account.yaml文件，文件内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins

---
kind: Role
apiVersion: rbac.authorization.k8s.io&amp;#x2F;v1beta1
metadata:
  name: jenkins
rules:
  - apiGroups: [&amp;quot;&amp;quot;]
    resources: [&amp;quot;pods&amp;quot;]
    verbs: [&amp;quot;create&amp;quot;, &amp;quot;delete&amp;quot;, &amp;quot;get&amp;quot;, &amp;quot;list&amp;quot;, &amp;quot;patch&amp;quot;, &amp;quot;update&amp;quot;, &amp;quot;watch&amp;quot;]
  - apiGroups: [&amp;quot;&amp;quot;]
    resources: [&amp;quot;pods&amp;#x2F;exec&amp;quot;]
    verbs: [&amp;quot;create&amp;quot;, &amp;quot;delete&amp;quot;, &amp;quot;get&amp;quot;, &amp;quot;list&amp;quot;, &amp;quot;patch&amp;quot;, &amp;quot;update&amp;quot;, &amp;quot;watch&amp;quot;]
  - apiGroups: [&amp;quot;&amp;quot;]
    resources: [&amp;quot;pods&amp;#x2F;log&amp;quot;]
    verbs: [&amp;quot;get&amp;quot;, &amp;quot;list&amp;quot;, &amp;quot;watch&amp;quot;]
  - apiGroups: [&amp;quot;&amp;quot;]
    resources: [&amp;quot;secrets&amp;quot;]
    verbs: [&amp;quot;get&amp;quot;]

---
apiVersion: rbac.authorization.k8s.io&amp;#x2F;v1beta1
kind: RoleBinding
metadata:
  name: jenkins
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: jenkins
subjects:
  - kind: ServiceAccount
    name: jenkins
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;上述配置中，创建了一个 RoleBinding 和一个 ServiceAccount，并且将 RoleBinding 的权限绑定到这个用户上。所以，jenkins 容器必须使用这个 ServiceAccount 运行才行，不然 RoleBinding 的权限它将不具备。&lt;/p&gt;
&lt;p&gt;RoleBinding 的权限很容易就看懂了，因为 jenkins 需要创建和删除 slave，所以才需要上面这些权限。至于 secrets 权限，则是 https 证书。&lt;/p&gt;
&lt;p&gt;执行如下命令创建serviceAccount。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f jenkins-service-account.yaml 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;5-安装Jenkins&#34;&gt;5.安装Jenkins&lt;/h3&gt;
&lt;p&gt;创建jenkins-statefulset.yaml文件，文件内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: apps&amp;#x2F;v1
kind: StatefulSet
metadata:
  name: jenkins
  labels:
    name: jenkins
spec:
  selector:
    matchLabels:
      name: jenkins
  serviceName: jenkins
  replicas: 1
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      name: jenkins
      labels:
        name: jenkins
    spec:
      terminationGracePeriodSeconds: 10
      serviceAccountName: jenkins
      containers:
        - name: jenkins
          image: docker.io&amp;#x2F;jenkins&amp;#x2F;jenkins:lts
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
            - containerPort: 32100
          resources:
            limits:
              cpu: 4
              memory: 4Gi
            requests:
              cpu: 4
              memory: 4Gi
          env:
            - name: LIMITS_MEMORY
              valueFrom:
                resourceFieldRef:
                  resource: limits.memory
                  divisor: 1Mi
            - name: JAVA_OPTS
              
              value: -Xmx$(LIMITS_MEMORY)m -XshowSettings:vm -Dhudson.slaves.NodeProvisioner.initialDelay&amp;#x3D;0 -Dhudson.slaves.NodeProvisioner.MARGIN&amp;#x3D;50 -Dhudson.slaves.NodeProvisioner.MARGIN0&amp;#x3D;0.85
          volumeMounts:
            - name: jenkins-home
              mountPath: &amp;#x2F;var&amp;#x2F;jenkins_home
          livenessProbe:
            httpGet:
              path: &amp;#x2F;login
              port: 8080
            initialDelaySeconds: 60
            timeoutSeconds: 5
            failureThreshold: 12 
          readinessProbe:
            httpGet:
              path: &amp;#x2F;login
              port: 8080
            initialDelaySeconds: 60
            timeoutSeconds: 5
            failureThreshold: 12 
  
  volumeClaimTemplates:
    - metadata:
        name: jenkins-home
      spec:
        accessModes: [&amp;quot;ReadWriteOnce&amp;quot;]
        resources:
          requests:
            storage: 1Ti
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;jenkins 部署时需要注意它的副本数，你的副本数有多少就要有多少个 pv，同样，存储会有多倍消耗。这里我只使用了一个副本，因此前面也只创建了一个 pv。&lt;/p&gt;
&lt;p&gt;使用如下命令安装Jenkins。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f jenkins-statefulset.yaml 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;6-创建Service&#34;&gt;6.创建Service&lt;/h3&gt;
&lt;p&gt;创建jenkins-service.yaml文件，文件内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: Service
metadata:
  name: jenkins
spec:
  
  selector:
    name: jenkins
  
  
  ports:
    - name: http
      port: 80
      nodePort: 31888
      targetPort: 8080
      protocol: TCP
    - name: jenkins-agent
      port: 32100
      nodePort: 32100
      targetPort: 32100
      protocol: TCP
  type: NodePort
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;使用如下命令安装Service。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f jenkins-service.yaml 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;7-安装-ingress&#34;&gt;7.安装 ingress&lt;/h3&gt;
&lt;p&gt;jenkins 的 web 界面需要从集群外访问，这里我们选择的是使用 ingress。创建jenkins-ingress.yaml文件，文件内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: extensions&amp;#x2F;v1beta1
kind: Ingress
metadata:
  name: jenkins
spec:
  rules:
    - http:
        paths:
          - path: &amp;#x2F;
            backend:
              serviceName: jenkins
              servicePort: 31888
      host: jekins.binghe.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;这里，需要注意的是host必须配置为域名或者主机名，否则会报错，如下所示。&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;The Ingress &amp;quot;jenkins&amp;quot; is invalid: spec.rules[0].host: Invalid value: &amp;quot;192.168.175.101&amp;quot;: must be a DNS name, not an IP address
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;使用如下命令安装ingress。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f jenkins-ingress.yaml 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;最后，由于我这里使用的是虚拟机来搭建相关的环境，在本机访问虚拟机映射的jekins.binghe.com时，需要配置本机的hosts文件，在本机的hosts文件中加入如下配置项。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ini&#34; data-language=&#34;ini&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ini&#34;&gt;192.168.175.101 jekins.binghe.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;注意：在Windows操作系统中，hosts文件所在的目录如下。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ini&#34; data-language=&#34;ini&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ini&#34;&gt;C:\Windows\System32\drivers\etc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;接下来，就可以在浏览器中通过链接：&lt;a href=&#34;https://jekins.binghe.com/31888&#34;&gt;http://jekins.binghe.com:31888&lt;/a&gt; 来访问Jekins了。&lt;/p&gt;
&lt;h2 id=&#34;物理机安装SVN&#34;&gt;物理机安装SVN&lt;/h2&gt;
&lt;p&gt;这里，以在Master节点（binghe101服务器）上安装SVN为例。&lt;/p&gt;
&lt;h3 id=&#34;1-使用yum安装SVN&#34;&gt;1.使用yum安装SVN&lt;/h3&gt;
&lt;p&gt;在命令行执行如下命令安装SVN。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;yum -y install subversion 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-创建SVN库&#34;&gt;2.创建SVN库&lt;/h3&gt;
&lt;p&gt;依次执行如下命令。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;#创建&amp;#x2F;data&amp;#x2F;svn
mkdir -p &amp;#x2F;data&amp;#x2F;svn 
#初始化svn
svnserve -d -r &amp;#x2F;data&amp;#x2F;svn
#创建代码仓库
svnadmin create &amp;#x2F;data&amp;#x2F;svn&amp;#x2F;test
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;3-配置SVN&#34;&gt;3.配置SVN&lt;/h3&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;mkdir &amp;#x2F;data&amp;#x2F;svn&amp;#x2F;conf
cp &amp;#x2F;data&amp;#x2F;svn&amp;#x2F;test&amp;#x2F;conf&amp;#x2F;* &amp;#x2F;data&amp;#x2F;svn&amp;#x2F;conf&amp;#x2F;
cd &amp;#x2F;data&amp;#x2F;svn&amp;#x2F;conf&amp;#x2F;
[root@binghe101 conf]# ll
总用量 20
-rw-r--r-- 1 root root 1080 5月  12 02:17 authz
-rw-r--r-- 1 root root  885 5月  12 02:17 hooks-env.tmpl
-rw-r--r-- 1 root root  309 5月  12 02:17 passwd
-rw-r--r-- 1 root root 4375 5月  12 02:17 svnserve.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;配置authz文件，&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;配置后的内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ini&#34; data-language=&#34;ini&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ini&#34;&gt;[aliases]
# joe &amp;#x3D; &amp;#x2F;C&amp;#x3D;XZ&amp;#x2F;ST&amp;#x3D;Dessert&amp;#x2F;L&amp;#x3D;Snake City&amp;#x2F;O&amp;#x3D;Snake Oil, Ltd.&amp;#x2F;OU&amp;#x3D;Research Institute&amp;#x2F;CN&amp;#x3D;Joe Average

[groups]
# harry_and_sally &amp;#x3D; harry,sally
# harry_sally_and_joe &amp;#x3D; harry,sally,&amp;amp;joe
SuperAdmin &amp;#x3D; admin
binghe &amp;#x3D; admin,binghe

# [&amp;#x2F;foo&amp;#x2F;bar]
# harry &amp;#x3D; rw
# &amp;amp;joe &amp;#x3D; r
# * &amp;#x3D;

# [repository:&amp;#x2F;baz&amp;#x2F;fuz]
# @harry_and_sally &amp;#x3D; rw
# * &amp;#x3D; r

[test:&amp;#x2F;]
@SuperAdmin&amp;#x3D;rw
@binghe&amp;#x3D;rw
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;配置passwd文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;配置后的内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ini&#34; data-language=&#34;ini&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ini&#34;&gt;[users]
# harry &amp;#x3D; harryssecret
# sally &amp;#x3D; sallyssecret
admin &amp;#x3D; admin123
binghe &amp;#x3D; binghe123
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;配置 svnserve.conf&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;配置后的文件如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ini&#34; data-language=&#34;ini&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ini&#34;&gt;### This file controls the configuration of the svnserve daemon, if you
### use it to allow access to this repository.  (If you only allow
### access through http: and&amp;#x2F;or file: URLs, then this file is
### irrelevant.)

### Visit http:&amp;#x2F;&amp;#x2F;subversion.apache.org&amp;#x2F; for more information.

[general]
### The anon-access and auth-access options control access to the
### repository for unauthenticated (a.k.a. anonymous) users and
### authenticated users, respectively.
### Valid values are &amp;quot;write&amp;quot;, &amp;quot;read&amp;quot;, and &amp;quot;none&amp;quot;.
### Setting the value to &amp;quot;none&amp;quot; prohibits both reading and writing;
### &amp;quot;read&amp;quot; allows read-only access, and &amp;quot;write&amp;quot; allows complete 
### read&amp;#x2F;write access to the repository.
### The sample settings below are the defaults and specify that anonymous
### users have read-only access to the repository, while authenticated
### users have read and write access to the repository.
anon-access &amp;#x3D; none
auth-access &amp;#x3D; write
### The password-db option controls the location of the password
### database file.  Unless you specify a path starting with a &amp;#x2F;,
### the file&amp;#39;s location is relative to the directory containing
### this configuration file.
### If SASL is enabled (see below), this file will NOT be used.
### Uncomment the line below to use the default password file.
password-db &amp;#x3D; &amp;#x2F;data&amp;#x2F;svn&amp;#x2F;conf&amp;#x2F;passwd
### The authz-db option controls the location of the authorization
### rules for path-based access control.  Unless you specify a path
### starting with a &amp;#x2F;, the file&amp;#39;s location is relative to the
### directory containing this file.  The specified path may be a
### repository relative URL (^&amp;#x2F;) or an absolute file:&amp;#x2F;&amp;#x2F; URL to a text
### file in a Subversion repository.  If you don&amp;#39;t specify an authz-db,
### no path-based access control is done.
### Uncomment the line below to use the default authorization file.
authz-db &amp;#x3D; &amp;#x2F;data&amp;#x2F;svn&amp;#x2F;conf&amp;#x2F;authz
### The groups-db option controls the location of the file with the
### group definitions and allows maintaining groups separately from the
### authorization rules.  The groups-db file is of the same format as the
### authz-db file and should contain a single [groups] section with the
### group definitions.  If the option is enabled, the authz-db file cannot
### contain a [groups] section.  Unless you specify a path starting with
### a &amp;#x2F;, the file&amp;#39;s location is relative to the directory containing this
### file.  The specified path may be a repository relative URL (^&amp;#x2F;) or an
### absolute file:&amp;#x2F;&amp;#x2F; URL to a text file in a Subversion repository.
### This option is not being used by default.
# groups-db &amp;#x3D; groups
### This option specifies the authentication realm of the repository.
### If two repositories have the same authentication realm, they should
### have the same password database, and vice versa.  The default realm
### is repository&amp;#39;s uuid.
realm &amp;#x3D; svn
### The force-username-case option causes svnserve to case-normalize
### usernames before comparing them against the authorization rules in the
### authz-db file configured above.  Valid values are &amp;quot;upper&amp;quot; (to upper-
### case the usernames), &amp;quot;lower&amp;quot; (to lowercase the usernames), and
### &amp;quot;none&amp;quot; (to compare usernames as-is without case conversion, which
### is the default behavior).
# force-username-case &amp;#x3D; none
### The hooks-env options specifies a path to the hook script environment 
### configuration file. This option overrides the per-repository default
### and can be used to configure the hook script environment for multiple 
### repositories in a single file, if an absolute path is specified.
### Unless you specify an absolute path, the file&amp;#39;s location is relative
### to the directory containing this file.
# hooks-env &amp;#x3D; hooks-env

[sasl]
### This option specifies whether you want to use the Cyrus SASL
### library for authentication. Default is false.
### Enabling this option requires svnserve to have been built with Cyrus
### SASL support; to check, run &amp;#39;svnserve --version&amp;#39; and look for a line
### reading &amp;#39;Cyrus SASL authentication is available.&amp;#39;
# use-sasl &amp;#x3D; true
### These options specify the desired strength of the security layer
### that you want SASL to provide. 0 means no encryption, 1 means
### integrity-checking only, values larger than 1 are correlated
### to the effective key length for encryption (e.g. 128 means 128-bit
### encryption). The values below are the defaults.
# min-encryption &amp;#x3D; 0
# max-encryption &amp;#x3D; 256
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;接下来，将/data/svn/conf目录下的svnserve.conf文件复制到/data/svn/test/conf/目录下。如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 conf]# cp &amp;#x2F;data&amp;#x2F;svn&amp;#x2F;conf&amp;#x2F;svnserve.conf &amp;#x2F;data&amp;#x2F;svn&amp;#x2F;test&amp;#x2F;conf&amp;#x2F;
cp：是否覆盖&amp;#39;&amp;#x2F;data&amp;#x2F;svn&amp;#x2F;test&amp;#x2F;conf&amp;#x2F;svnserve.conf&amp;#39;？ y
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;4-启动SVN服务&#34;&gt;4.启动SVN服务&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;（1）创建svnserve.service服务&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;创建svnserve.service文件&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;vim &amp;#x2F;usr&amp;#x2F;lib&amp;#x2F;systemd&amp;#x2F;system&amp;#x2F;svnserve.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;文件的内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ini&#34; data-language=&#34;ini&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ini&#34;&gt;[Unit]
Description&amp;#x3D;Subversion protocol daemon
After&amp;#x3D;syslog.target network.target
Documentation&amp;#x3D;man:svnserve(8)

[Service]
Type&amp;#x3D;forking
EnvironmentFile&amp;#x3D;&amp;#x2F;etc&amp;#x2F;sysconfig&amp;#x2F;svnserve
#ExecStart&amp;#x3D;&amp;#x2F;usr&amp;#x2F;bin&amp;#x2F;svnserve --daemon --pid-file&amp;#x3D;&amp;#x2F;run&amp;#x2F;svnserve&amp;#x2F;svnserve.pid $OPTIONS
ExecStart&amp;#x3D;&amp;#x2F;usr&amp;#x2F;bin&amp;#x2F;svnserve --daemon $OPTIONS
PrivateTmp&amp;#x3D;yes

[Install]
WantedBy&amp;#x3D;multi-user.target
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;接下来执行如下命令使配置生效。&lt;/p&gt;
&lt;p&gt;命令执行成功后，修改 /etc/sysconfig/svnserve 文件。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;vim &amp;#x2F;etc&amp;#x2F;sysconfig&amp;#x2F;svnserve 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;修改后的文件内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ini&#34; data-language=&#34;ini&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ini&#34;&gt;# OPTIONS is used to pass command-line arguments to svnserve.
# 
# Specify the repository location in -r parameter:
OPTIONS&amp;#x3D;&amp;quot;-r &amp;#x2F;data&amp;#x2F;svn&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;（2）启动SVN&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先查看SVN状态，如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@itence10 conf]# systemctl status svnserve.service
● svnserve.service - Subversion protocol daemon
   Loaded: loaded (&amp;#x2F;usr&amp;#x2F;lib&amp;#x2F;systemd&amp;#x2F;system&amp;#x2F;svnserve.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:svnserve(8)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;可以看到，此时SVN并没有启动，接下来，需要启动SVN。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;systemctl start svnserve.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;设置SVN服务开机自启动。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;systemctl enable svnserve.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;接下来，就可以下载安装TortoiseSVN，输入链接&lt;a href=&#34;svn://192.168.0.10/test&#34;&gt;svn://192.168.0.10/test&lt;/a&gt; 并输入用户名binghe，密码binghe123来连接SVN了。&lt;/p&gt;
&lt;h2 id=&#34;物理机安装Jenkins&#34;&gt;物理机安装Jenkins&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;注意：安装Jenkins之前需要安装JDK和Maven，我这里同样将Jenkins安装在Master节点（binghe101服务器）。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;1-启用Jenkins库&#34;&gt;1.启用Jenkins库&lt;/h3&gt;
&lt;p&gt;运行以下命令以下载repo文件并导入GPG密钥：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;wget -O &amp;#x2F;etc&amp;#x2F;yum.repos.d&amp;#x2F;jenkins.repo http:&amp;#x2F;&amp;#x2F;pkg.jenkins-ci.org&amp;#x2F;redhat-stable&amp;#x2F;jenkins.repo
rpm --import https:&amp;#x2F;&amp;#x2F;jenkins-ci.org&amp;#x2F;redhat&amp;#x2F;jenkins-ci.org.key
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-安装Jenkins&#34;&gt;2.安装Jenkins&lt;/h3&gt;
&lt;p&gt;执行如下命令安装Jenkis。&lt;/p&gt;
&lt;p&gt;接下来，修改Jenkins默认端口，如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;vim &amp;#x2F;etc&amp;#x2F;sysconfig&amp;#x2F;jenkins
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;修改后的两项配置如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ini&#34; data-language=&#34;ini&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ini&#34;&gt;JENKINS_JAVA_CMD&amp;#x3D;&amp;quot;&amp;#x2F;usr&amp;#x2F;local&amp;#x2F;jdk1.8.0_212&amp;#x2F;bin&amp;#x2F;java&amp;quot;
JENKINS_PORT&amp;#x3D;&amp;quot;18080&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;此时，已经将Jenkins的端口由8080修改为18080&lt;/p&gt;
&lt;h3 id=&#34;3-启动Jenkins&#34;&gt;3.启动Jenkins&lt;/h3&gt;
&lt;p&gt;在命令行输入如下命令启动Jenkins。&lt;/p&gt;
&lt;p&gt;配置Jenkins开机自启动。&lt;/p&gt;
&lt;p&gt;查看Jenkins的运行状态。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@itence10 ~]# systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (&amp;#x2F;etc&amp;#x2F;rc.d&amp;#x2F;init.d&amp;#x2F;jenkins; generated)
   Active: active (running) since Tue 2020-05-12 04:33:40 EDT; 28s ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 71 (limit: 26213)
   Memory: 550.8M
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;说明，Jenkins启动成功。&lt;/p&gt;
&lt;h2 id=&#34;配置Jenkins运行环境&#34;&gt;配置Jenkins运行环境&lt;/h2&gt;
&lt;h3 id=&#34;1-登录Jenkins&#34;&gt;1.登录Jenkins&lt;/h3&gt;
&lt;p&gt;首次安装后，需要配置Jenkins的运行环境。首先，在浏览器地址栏访问链接&lt;a href=&#34;http://192.168.0.10:18080&#34;&gt;http://192.168.0.10:18080&lt;/a&gt;，打开Jenkins界面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-11.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;根据提示使用如下命令到服务器上找密码值，如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@binghe101 ~]# cat &amp;#x2F;var&amp;#x2F;lib&amp;#x2F;jenkins&amp;#x2F;secrets&amp;#x2F;initialAdminPassword
71af861c2ab948a1b6efc9f7dde90776
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;将密码71af861c2ab948a1b6efc9f7dde90776复制到文本框，点击继续。会跳转到自定义Jenkins页面，如下所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-12.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;这里，可以直接选择“安装推荐的插件”。之后会跳转到一个安装插件的页面，如下所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-13.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;此步骤可能有下载失败的情况，可直接忽略。&lt;/p&gt;
&lt;h3 id=&#34;2-安装插件&#34;&gt;2.安装插件&lt;/h3&gt;
&lt;p&gt;需要安装的插件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Kubernetes Cli Plugin：该插件可直接在Jenkins中使用kubernetes命令行进行操作。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kubernetes plugin： 使用kubernetes则需要安装该插件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kubernetes Continuous Deploy Plugin：kubernetes部署插件，可根据需要使用&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还有更多的插件可供选择，可点击 系统管理-&amp;gt;管理插件进行管理和添加，安装相应的Docker插件、SSH插件、Maven插件。其他的插件可以根据需要进行安装。如下图所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-14.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-15.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-配置Jenkins&#34;&gt;3.配置Jenkins&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;（1）配置JDK和Maven&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在Global Tool Configuration中配置JDK和Maven，如下所示，打开Global Tool Configuration界面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-16.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;接下来就开始配置JDK和Maven了。&lt;/p&gt;
&lt;p&gt;由于我在服务器上将Maven安装在/usr/local/maven-3.6.3目录下，所以，需要在“Maven 配置”中进行配置，如下图所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-17.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;接下来，配置JDK，如下所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-18.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：不要勾选“Install automatically”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;接下来，配置Maven，如下所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-19.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：不要勾选“Install automatically”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;（2）配置SSH&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;进入Jenkins的Configure System界面配置SSH，如下所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-20.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;找到 SSH remote hosts 进行配置。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-21.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-22.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;配置完成后，点击Check connection按钮，会显示 Successfull connection。如下所示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1620220416011231-23.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;至此，Jenkins的基本配置就完成了。&lt;/p&gt;
&lt;h2 id=&#34;Jenkins发布Docker项目到K8s集群&#34;&gt;Jenkins发布Docker项目到K8s集群&lt;/h2&gt;
&lt;h3 id=&#34;1-调整SpringBoot项目的配置&#34;&gt;1.调整SpringBoot项目的配置&lt;/h3&gt;
&lt;p&gt;实现，SpringBoot项目中启动类所在的模块的pom.xml需要引入打包成Docker镜像的配置，如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-markup&#34; data-language=&#34;markup&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-markup&#34;&gt;  &amp;lt;properties&amp;gt;
        &amp;lt;docker.repostory&amp;gt;192.168.0.10:1180&amp;lt;&amp;#x2F;docker.repostory&amp;gt;
        &amp;lt;docker.registry.name&amp;gt;test&amp;lt;&amp;#x2F;docker.registry.name&amp;gt;
        &amp;lt;docker.image.tag&amp;gt;1.0.0&amp;lt;&amp;#x2F;docker.image.tag&amp;gt;
        &amp;lt;docker.maven.plugin.version&amp;gt;1.4.10&amp;lt;&amp;#x2F;docker.maven.plugin.version&amp;gt;
  &amp;lt;&amp;#x2F;properties&amp;gt;

&amp;lt;build&amp;gt;
        &amp;lt;finalName&amp;gt;test-starter&amp;lt;&amp;#x2F;finalName&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;&amp;#x2F;groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;&amp;#x2F;artifactId&amp;gt;
            &amp;lt;&amp;#x2F;plugin&amp;gt;
            
            
            
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;com.spotify&amp;lt;&amp;#x2F;groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;dockerfile-maven-plugin&amp;lt;&amp;#x2F;artifactId&amp;gt;
                &amp;lt;version&amp;gt;$&amp;#123;docker.maven.plugin.version&amp;#125;&amp;lt;&amp;#x2F;version&amp;gt;
                &amp;lt;executions&amp;gt;
                    &amp;lt;execution&amp;gt;
                    &amp;lt;id&amp;gt;default&amp;lt;&amp;#x2F;id&amp;gt;
                    &amp;lt;goals&amp;gt;
                        
                        &amp;lt;goal&amp;gt;build&amp;lt;&amp;#x2F;goal&amp;gt;
                        &amp;lt;goal&amp;gt;push&amp;lt;&amp;#x2F;goal&amp;gt;
                    &amp;lt;&amp;#x2F;goals&amp;gt;
                    &amp;lt;&amp;#x2F;execution&amp;gt;
                &amp;lt;&amp;#x2F;executions&amp;gt;
                &amp;lt;configuration&amp;gt;
                    &amp;lt;contextDirectory&amp;gt;$&amp;#123;project.basedir&amp;#125;&amp;lt;&amp;#x2F;contextDirectory&amp;gt;
                    
                    &amp;lt;useMavenSettingsForAuth&amp;gt;useMavenSettingsForAuth&amp;gt;true&amp;lt;&amp;#x2F;useMavenSettingsForAuth&amp;gt;
                    &amp;lt;repository&amp;gt;$&amp;#123;docker.repostory&amp;#125;&amp;#x2F;$&amp;#123;docker.registry.name&amp;#125;&amp;#x2F;$&amp;#123;project.artifactId&amp;#125;&amp;lt;&amp;#x2F;repository&amp;gt;
                    &amp;lt;tag&amp;gt;$&amp;#123;docker.image.tag&amp;#125;&amp;lt;&amp;#x2F;tag&amp;gt;
                    &amp;lt;buildArgs&amp;gt;
                        &amp;lt;JAR_FILE&amp;gt;target&amp;#x2F;$&amp;#123;project.build.finalName&amp;#125;.jar&amp;lt;&amp;#x2F;JAR_FILE&amp;gt;
                    &amp;lt;&amp;#x2F;buildArgs&amp;gt;
                &amp;lt;&amp;#x2F;configuration&amp;gt;
            &amp;lt;&amp;#x2F;plugin&amp;gt;

        &amp;lt;&amp;#x2F;plugins&amp;gt;
        
        &amp;lt;resources&amp;gt;
            
            &amp;lt;resource&amp;gt;
                &amp;lt;directory&amp;gt;src&amp;#x2F;main&amp;#x2F;resources&amp;lt;&amp;#x2F;directory&amp;gt;
                &amp;lt;targetPath&amp;gt;$&amp;#123;project.build.directory&amp;#125;&amp;#x2F;classes&amp;lt;&amp;#x2F;targetPath&amp;gt;
                &amp;lt;includes&amp;gt;
                    &amp;lt;include&amp;gt;**&amp;#x2F;*&amp;lt;&amp;#x2F;include&amp;gt;
                &amp;lt;&amp;#x2F;includes&amp;gt;
                &amp;lt;filtering&amp;gt;true&amp;lt;&amp;#x2F;filtering&amp;gt;
            &amp;lt;&amp;#x2F;resource&amp;gt;
        &amp;lt;&amp;#x2F;resources&amp;gt;
    &amp;lt;&amp;#x2F;build&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;接下来，在SpringBoot启动类所在模块的根目录创建Dockerfile，内容示例如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-docker&#34; data-language=&#34;docker&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-docker&#34;&gt;#添加依赖环境，前提是将Java8的Docker镜像从官方镜像仓库pull下来，然后上传到自己的Harbor私有仓库中
FROM 192.168.0.10:1180&amp;#x2F;library&amp;#x2F;java:8
#指定镜像制作作者
MAINTAINER binghe
#运行目录
VOLUME &amp;#x2F;tmp
#将本地的文件拷贝到容器
ADD target&amp;#x2F;*jar app.jar
#启动容器后自动执行的命令
ENTRYPOINT [ &amp;quot;java&amp;quot;, &amp;quot;-Djava.security.egd&amp;#x3D;file:&amp;#x2F;dev&amp;#x2F;.&amp;#x2F;urandom&amp;quot;, &amp;quot;-jar&amp;quot;, &amp;quot;&amp;#x2F;app.jar&amp;quot; ]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;根据实际情况，自行修改。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：FROM 192.168.0.10:1180/library/java:8的前提是执行如下命令。&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;docker pull java:8
docker tag java:8 192.168.0.10:1180&amp;#x2F;library&amp;#x2F;java:8
docker login 192.168.0.10:1180
docker push 192.168.0.10:1180&amp;#x2F;library&amp;#x2F;java:8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;在SpringBoot启动类所在模块的根目录创建yaml文件，录入叫做test.yaml文件，内容如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: apps&amp;#x2F;v1
kind: Deployment
metadata:
  name: test-starter
  labels:
    app: test-starter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-starter
  template:
    metadata:
      labels:
        app: test-starter
    spec:
      containers:
      - name: test-starter
        image: 192.168.0.10:1180&amp;#x2F;test&amp;#x2F;test-starter:1.0.0
        ports:
        - containerPort: 8088
      nodeSelector:
        clustertype: node12

---
apiVersion: v1
kind: Service
metadata:
  name: test-starter
  labels:
    app: test-starter
spec:
  ports:
    - name: http
      port: 8088
      nodePort: 30001
  type: NodePort
  selector:
    app: test-starter
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-Jenkins配置发布项目&#34;&gt;2.Jenkins配置发布项目&lt;/h3&gt;
&lt;p&gt;将项目上传到SVN代码库，例如地址为&lt;a href=&#34;svn://192.168.0.1/test&#34;&gt;svn://192.168.0.10/test&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;接下来，在Jenkins中配置自动发布。步骤如下所示。&lt;/p&gt;
&lt;p&gt;点击新建Item。&lt;/p&gt;
&lt;p&gt;在描述文本框中输入描述信息，如下所示。&lt;/p&gt;
&lt;p&gt;接下来，配置SVN信息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：配置GitLab的步骤与SVN相同，不再赘述。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;定位到Jenkins的“构建模块”，使用Execute Shell来构建发布项目到K8S集群。&lt;/p&gt;
&lt;p&gt;执行的命令依次如下所示。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;#删除本地原有的镜像,不会影响Harbor仓库中的镜像
docker rmi 192.168.0.10:1180&amp;#x2F;test&amp;#x2F;test-starter:1.0.0
#使用Maven编译、构建Docker镜像，执行完成后本地Docker容器中会重新构建镜像文件
&amp;#x2F;usr&amp;#x2F;local&amp;#x2F;maven-3.6.3&amp;#x2F;bin&amp;#x2F;mvn -f .&amp;#x2F;pom.xml clean install -Dmaven.test.skip&amp;#x3D;true
#登录 Harbor仓库
docker login 192.168.0.10:1180 -u binghe -p Binghe123
#上传镜像到Harbor仓库
docker push 192.168.0.10:1180&amp;#x2F;test&amp;#x2F;test-starter:1.0.0
#停止并删除K8S集群中运行的
&amp;#x2F;usr&amp;#x2F;bin&amp;#x2F;kubectl delete -f test.yaml
#将Docker镜像重新发布到K8S集群
&amp;#x2F;usr&amp;#x2F;bin&amp;#x2F;kubectl apply -f test.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;编辑整理 &lt;a href=&#34;https://www.jianshu.com/u/b1e8818c1241&#34;&gt;冰河团队&lt;/a&gt; &lt;a href=&#34;https://www.jianshu.com/p/86d288ea64c4&#34;&gt;From&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;系列教程&#34;&gt;&lt;strong&gt;系列教程&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;全部文章RSS订阅&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&#34;Devops系列&#34;&gt;&lt;strong&gt;Devops系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/devops/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;Devops 分类 RSS 订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ab63eb8f/&#34;&gt;自建全套开源Devops开发系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d32a07a7/&#34;&gt;Git介绍以及分支模型图解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/39563241/&#34;&gt;三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/3437994a/&#34;&gt;DevOps系列—【Jenkinsfile+Dockerfile+nginx+vue】&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/f4c3ad41/&#34;&gt;项目开发管理工具推荐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/acc13b70/&#34;&gt;Gitlab的安装及使用教程完全版&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d08eb7b/&#34;&gt;Gitlab的安装及使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/78c3371/&#34;&gt;那些有用的Github工具介绍！Action、app、workflow等&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10/dist/style.css&#34;&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/d3@7&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-view@0.18.10&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10&#34;&gt;&lt;/script&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;/css/markmap.css&#34;&gt;

&lt;script src=&#34;/js/markmap.js&#34;&gt;&lt;/script&gt;
</content>
        <category term="gitlab" />
        <category term="docker" />
        <category term="k8s" />
        <category term="harbor" />
        <updated>2022-04-16T10:49:57.000Z</updated>
    </entry>
    <entry>
        <id>https://blog.17lai.site/posts/3437994a/</id>
        <title>DevOps系列---【Jenkinsfile+Dockerfile+nginx+vue】</title>
        <link rel="alternate" href="https://blog.17lai.site/posts/3437994a/"/>
        <content type="html">&lt;h2 id=&#34;1-前提：一台装好的jenkins&#34;&gt;1.前提：一台装好的jenkins&lt;/h2&gt;
&lt;p&gt;参考:&lt;a href=&#34;https://www.cnblogs.com/hujunwei/p/13176994.html&#34;&gt;https://www.cnblogs.com/hujunwei/p/13176994.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;2-编写Dockerfile，放在项目根目录下&#34;&gt;2.编写Dockerfile，放在项目根目录下&lt;/h2&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-docker&#34; data-language=&#34;docker&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-docker&#34;&gt;FROM nginx
#修改名字、版本、作者
LABEL name&amp;#x3D;&amp;quot;home-finance-web-dev&amp;quot; version&amp;#x3D;&amp;quot;1.0.0&amp;quot; author&amp;#x3D;&amp;quot;hjw&amp;quot;
COPY dist&amp;#x2F; &amp;#x2F;usr&amp;#x2F;share&amp;#x2F;nginx&amp;#x2F;html&amp;#x2F;
COPY nginx&amp;#x2F;nginx-dev.conf &amp;#x2F;etc&amp;#x2F;nginx&amp;#x2F;nginx.conf
EXPOSE 80&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;3-编写Jenkinsfile，放在项目根目录下&#34;&gt;3.编写Jenkinsfile，放在项目根目录下&lt;/h2&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;&amp;#x2F;&amp;#x2F;流水线脚本
pipeline &amp;#123;
    agent any
    environment &amp;#123;
        WS &amp;#x3D; &amp;quot;$&amp;#123;WORKSPACE&amp;#125;&amp;quot;
        TOPIC &amp;#x3D; &amp;quot;测试&amp;quot;
        TITLE &amp;#x3D; &amp;quot;标题&amp;quot;
        CONTENT &amp;#x3D; &amp;quot;具体内容&amp;quot;
    &amp;#125;

    &amp;#x2F;&amp;#x2F;定义流水线的加工流程
    stages &amp;#123;
        stage(&amp;#39;环境检查&amp;#39;) &amp;#123;
            steps&amp;#123;
                sh &amp;#39;printenv&amp;#39;
                echo &amp;quot;正在检测基本信息&amp;quot;
                sh &amp;#39;git --version&amp;#39;
                sh &amp;#39;docker version&amp;#39;
            &amp;#125;
        &amp;#125;

        stage(&amp;#39;编译&amp;#39;) &amp;#123;
            &amp;#x2F;&amp;#x2F;jenkins不配置任何环境的情况下可以兼容任何场景
            agent &amp;#123;
                docker &amp;#123; image &amp;#39;node:14.17.6-alpine3.13&amp;#39; &amp;#125;
            &amp;#125;
            steps&amp;#123;
                sh &amp;#39;node -v&amp;#39;
                sh &amp;#39;npm -v&amp;#39;
                sh &amp;#39;pwd &amp;amp;&amp;amp; ls -alh&amp;#39;
                sh &amp;#39;echo &amp;quot;默认的项目目录:$&amp;#123;WS&amp;#125;&amp;quot;&amp;#39;
                &amp;#x2F;&amp;#x2F;注意:cd $&amp;#123;WS&amp;#125; &amp;amp;&amp;amp; npm不能分开写，也不能直接用$&amp;#123;WORKSPACE&amp;#125;
                sh &amp;#39;cd $&amp;#123;WS&amp;#125;&amp;#x2F;fast-ui &amp;amp;&amp;amp; npm config set registry&amp;#x3D;https:&amp;#x2F;&amp;#x2F;registry.npm.taobao.org &amp;amp;&amp;amp; npm install -g cnpm --registry&amp;#x3D;https:&amp;#x2F;&amp;#x2F;registry.npm.taobao.org &amp;amp;&amp;amp; cnpm install &amp;amp;&amp;amp; cnpm run build&amp;#39;
            &amp;#125;
        &amp;#125;

        stage(&amp;#39;生成镜像&amp;#39;) &amp;#123;
            steps&amp;#123;
                sh &amp;#39;pwd &amp;amp;&amp;amp; ls -alh&amp;#39;
                echo &amp;#39;生成镜像&amp;#39;
                sh &amp;#39;docker version&amp;#39;
                sh &amp;quot;echo 默认的项目目录:$&amp;#123;WS&amp;#125;&amp;quot;
                sh &amp;#39;cd $&amp;#123;WS&amp;#125;&amp;#x2F;fast-ui &amp;amp;&amp;amp; docker build -t home-finance-web .&amp;#39;
            &amp;#125;
        &amp;#125;

        stage(&amp;#39;部署&amp;#39;) &amp;#123;
            steps&amp;#123;
                echo &amp;#39;部署....&amp;#39;
                sh &amp;#39;pwd &amp;amp;&amp;amp; ls -alh&amp;#39;
                sh &amp;#39;pwd &amp;amp;&amp;amp; ls -alh&amp;#39;
                sh &amp;#39;docker rm -f home-finance-web&amp;#39;
                sh &amp;#39;docker run -d -p 8081:80 --restart&amp;#x3D;always --name home-finance-web home-finance-web&amp;#39;
            &amp;#125;
        &amp;#125;
    &amp;#125;
&amp;#125;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;4-编写nginx-dev-conf-放在项目根目录下的nginx目录下&#34;&gt;4.编写nginx-dev.conf,放在项目根目录下的nginx目录下&lt;/h2&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-nginx&#34; data-language=&#34;nginx&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-nginx&#34;&gt;user  nginx;
worker_processes  1;

error_log  &amp;#x2F;var&amp;#x2F;log&amp;#x2F;nginx&amp;#x2F;error.log warn;
pid        &amp;#x2F;var&amp;#x2F;run&amp;#x2F;nginx.pid;

events &amp;#123;
    worker_connections  1024;
&amp;#125;

http &amp;#123;
    include       &amp;#x2F;etc&amp;#x2F;nginx&amp;#x2F;mime.types;
    default_type  application&amp;#x2F;octet-stream;

    log_format  main  &amp;#39;$remote_addr - $remote_user [$time_local] &amp;quot;$request&amp;quot; &amp;#39;
                      &amp;#39;$status $body_bytes_sent &amp;quot;$http_referer&amp;quot; &amp;#39;
                      &amp;#39;&amp;quot;$http_user_agent&amp;quot; &amp;quot;$http_x_forwarded_for&amp;quot;&amp;#39;;

    access_log  &amp;#x2F;var&amp;#x2F;log&amp;#x2F;nginx&amp;#x2F;access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # include &amp;#x2F;etc&amp;#x2F;nginx&amp;#x2F;conf.d&amp;#x2F;*.conf;

    server &amp;#123;
        listen       80;
        server_name  101.43.159.8; # 服务器地址或绑定域名

        #charset koi8-r;
        #access_log  &amp;#x2F;var&amp;#x2F;log&amp;#x2F;nginx&amp;#x2F;host.access.log  main;

        # &amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;
        # &amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D; ↓↓↓↓↓↓ start ↓↓↓↓↓↓ &amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;
        # &amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;

        location &amp;#x2F; &amp;#123;
            root   &amp;#x2F;usr&amp;#x2F;share&amp;#x2F;nginx&amp;#x2F;html;
            #try_files $uri $uri&amp;#x2F; @router;
            index  index.html index.htm;
            try_files $uri $uri&amp;#x2F; &amp;#x2F;index.html; # 解决页面刷新 404 问题
            #proxy_pass http:&amp;#x2F;&amp;#x2F;zhengqingya.gitee.io; # 代理的ip地址和端口号
            #proxy_connect_timeout 600; #代理的连接超时时间（单位：毫秒）
            #proxy_read_timeout 600; #代理的读取资源超时时间（单位：毫秒）
        &amp;#125;

        # &amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;
        # &amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D; ↑↑↑↑↑↑ end ↑↑↑↑↑↑ &amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;
        # &amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;&amp;#x3D;

        #error_page  404              &amp;#x2F;404.html;

        # redirect server error pages to the static page &amp;#x2F;50x.html
        #
        error_page   500 502 503 504  &amp;#x2F;50x.html;
        location &amp;#x3D; &amp;#x2F;50x.html &amp;#123;
            root   &amp;#x2F;usr&amp;#x2F;share&amp;#x2F;nginx&amp;#x2F;html;
        &amp;#125;

    &amp;#125;
&amp;#125;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;编辑整理 &lt;a href=&#34;https://www.cnblogs.com/hujunwei/p/15957956.html&#34;&gt;hujunwei&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;系列教程&#34;&gt;&lt;strong&gt;系列教程&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;全部文章RSS订阅&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&#34;Devops系列&#34;&gt;&lt;strong&gt;Devops系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/devops/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;Devops 分类 RSS 订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ab63eb8f/&#34;&gt;自建全套开源Devops开发系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d32a07a7/&#34;&gt;Git介绍以及分支模型图解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/39563241/&#34;&gt;三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/3437994a/&#34;&gt;DevOps系列—【Jenkinsfile+Dockerfile+nginx+vue】&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/f4c3ad41/&#34;&gt;项目开发管理工具推荐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/acc13b70/&#34;&gt;Gitlab的安装及使用教程完全版&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d08eb7b/&#34;&gt;Gitlab的安装及使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/78c3371/&#34;&gt;那些有用的Github工具介绍！Action、app、workflow等&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10/dist/style.css&#34;&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/d3@7&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-view@0.18.10&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10&#34;&gt;&lt;/script&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;/css/markmap.css&#34;&gt;

&lt;script src=&#34;/js/markmap.js&#34;&gt;&lt;/script&gt;
</content>
        <category term="nginx" />
        <category term="jenkins" />
        <category term="devops" />
        <updated>2022-04-15T10:49:37.000Z</updated>
    </entry>
    <entry>
        <id>https://blog.17lai.site/posts/f4c3ad41/</id>
        <title>项目开发管理工具推荐</title>
        <link rel="alternate" href="https://blog.17lai.site/posts/f4c3ad41/"/>
        <content type="html">&lt;blockquote&gt;
&lt;p&gt;软件开发是复杂的创造性的劳动，需要依赖大量工具才能完成，因此想要提高软件开发的效率和质量，离不开强大、高效、易用、维护成本低的工具，下面我根据自己的经验，推荐一些好用的工具。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;即时通讯&#34;&gt;即时通讯&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;更推荐自建开源替代。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;即时通讯和会议系统是项目开发过程中必不可少的，尤其是远程办公时，会议系统更是不可或缺。企业微信拥有和微信一致的沟通体验，简单易用。企业微信可随时随地发起和参与音视频会议，支持300人同时参会，并为主持人提供了管理功能。发言时还可演示文档或电脑屏幕，支持实时标注演示内容。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1520220415205156.png&#34; alt=&#34;gitea&#34;&gt;&lt;/p&gt;
&lt;p&gt;官方网站：&lt;a href=&#34;https://work.weixin.qq.com/&#34;&gt;https://work.weixin.qq.com/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;项目管理&#34;&gt;项目管理&lt;/h2&gt;
&lt;p&gt;目前主流的项目管理通常采用敏捷开发的模式，因此项目管理工具也要选择支持敏捷开发模式的工具，不建议使用禅道这样的重流程的工具，不适合敏捷团队，这里我推荐Taiga，它设计简洁，操作简单，充分体现了敏捷开发的理念。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1520220415211820.png&#34; alt=&#34;gitea&#34;&gt;&lt;/p&gt;
&lt;p&gt;官方网站：&lt;a href=&#34;https://taiga.io/&#34;&gt;https://taiga.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在线体验：&lt;a href=&#34;https://tree.taiga.io/&#34;&gt;https://tree.taiga.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;体验版服务器在国外，访问可能会有点慢。&lt;/p&gt;
&lt;h2 id=&#34;代码托管&#34;&gt;代码托管&lt;/h2&gt;
&lt;p&gt;前几年使用的比较多是SVN，近几年基本都使用GIT了，开源项目大都使用Github，虽然免费，但国内访问不稳定，速度慢，因此国内的公司基本都会自己搭建，我先后为公司搭建过两个托管平台，一个是Gitlab，一个是Gitea，Gitlab功能比较全面，但对硬件资源要求比较高，而且性能一般。所以推荐使用另一个开源的git托管平台——Gitea。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1520220415212537.png&#34; alt=&#34;gitea&#34;&gt;&lt;/p&gt;
&lt;p&gt;官方网站：&lt;a href=&#34;https://gitea.io/&#34;&gt;https://gitea.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在线体验：&lt;a href=&#34;https://gitea.com/&#34;&gt;https://gitea.com&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;持续交付&#34;&gt;持续交付&lt;/h2&gt;
&lt;p&gt;最知名、使用最广泛的开源的持续集成、交付平台当属Jenkins，主要的优势在于有大量免费的插件可以使用，但实际使用发现，很多插件质量很差，配置项很多，真正想要落地，其实需要自己编写shell脚本。这里我推荐基于docker技术的一款现代化的持续交付平台DroneCI，它使用简单，可以和主流的Git代码托管平台无缝对接，并且不需要编写代码就可以满足大多数持续构建、交付的需求。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1520220415212440.png&#34; alt=&#34;gitea&#34;&gt;&lt;/p&gt;
&lt;p&gt;官方网站：&lt;a href=&#34;https://drone.io/&#34;&gt;https://drone.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在线体验：&lt;a href=&#34;https://cloud.drone.io/&#34;&gt;https://cloud.drone.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;体验版服务器在国外，访问可能会有点慢。&lt;/p&gt;
&lt;h2 id=&#34;制品库-本地仓库&#34;&gt;制品库(本地仓库)&lt;/h2&gt;
&lt;p&gt;Maven 仓库是项目中依赖的第三方库，这个库所在的位置叫做仓库。Maven 仓库能帮助我们管理构件（主要是JAR），它就是放置所有JAR文件（WAR，ZIP，POM等等）的地方。&lt;/p&gt;
&lt;p&gt;后来，除了Maven仓库，还有npm、nuget、pypi、docker等仓库也需要本地仓库。&lt;/p&gt;
&lt;p&gt;市面上可选的通用的本地仓库有：nexus、ARTIFACTORY，ARTIFACTORY是收费的，nexus是免费的，同时nexus以其易用性和可靠性，成为目前市场上最主流的本地仓库。&lt;/p&gt;
&lt;p&gt;官方网站：&lt;a href=&#34;https://www.sonatype.com/product-nexus-repository&#34;&gt;https://www.sonatype.com/product-nexus-repository&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;文件存储&#34;&gt;文件存储&lt;/h2&gt;
&lt;p&gt;在公司中，文件分享是一个很常用的功能，不同于云盘，他对性能和安全性没有那么高的要求，简单易用才是大家最关心的，这里推荐chfs，chfs是一个免费的、HTTP协议的文件共享服务器，使用浏览器可以快速访问。与其他常用文件共享方式（如FTP，飞秋，网盘，自己建站）相比，具有使用简单，适用场景更多的优点，在个人使用以及共享给他人的场景中非常方便快捷。&lt;/p&gt;
&lt;p&gt;官方网站：&lt;a href=&#34;http://iscute.cn/chfs&#34;&gt;http://iscute.cn/chfs&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;绘图-流程图、UML、思维导图&#34;&gt;绘图(流程图、UML、思维导图)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://draw.io&#34;&gt;draw.io&lt;/a&gt; 是一个强大简洁的在线的绘图网站，支持流程图，UML图，架构图，原型图等。支持Github，Google Drive, One drive等网盘同步，并且永久免费。如果觉得使用Web版不方便，&lt;a href=&#34;http://draw.io&#34;&gt;draw.io&lt;/a&gt; 也提供了多平台的离线桌面版可供下载。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1520220415205300.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;p&gt;在线版：&lt;a href=&#34;https://www.draw.io/&#34;&gt;https://www.draw.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本地部署版：&lt;a href=&#34;https://github.com/jgraph/drawio/releases/latest&#34;&gt;https://github.com/jgraph/drawio/releases/latest&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PC 安装版：&lt;a href=&#34;https://github.com/jgraph/drawio-desktop/releases/latest&#34;&gt;https://github.com/jgraph/drawio-desktop/releases/latest&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;接口管理&#34;&gt;接口管理&lt;/h2&gt;
&lt;p&gt;维护不同工具之间数据一致性非常困难、低效。并且这里不仅仅是工作量的问题，更大的问题是多个系统之间数据不一致，导致协作低效、频繁出问题，开发测试人员痛苦不堪。&lt;/p&gt;
&lt;p&gt;Apifox 是接口管理、开发、测试全流程集成工具，定位 Postman + Swagger + Mock + JMeter。通过一套系统、一份数据，解决多个系统之间的数据同步问题。只要定义好接口文档，接口调试、数据 Mock、接口测试就可以直接使用，无需再次定义；接口文档和接口开发调试使用同一个工具，接口调试完成后即可保证和接口文档定义完全一致。高效、及时、准确！&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1520220415205213.svg+xml&#34; alt=&#34;gitea&#34;&gt;&lt;/p&gt;
&lt;p&gt;官方网站：&lt;a href=&#34;https://www.apifox.cn/&#34;&gt;https://www.apifox.cn&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;安全测试&#34;&gt;安全测试&lt;/h2&gt;
&lt;p&gt;在今天，网站的安全是容易被忽视的，黑客具备广泛的攻击手段，例如SQL注入，XSS，文件包含，目录遍历，参数篡改，认证攻击等，虽然你配置了正确的防火墙和WAF，但是这些安全防御软件仍然存在策略性的绕过。因此，需要您定期的扫描你的web应用，但是手动检测你所有的web应用是否存在安全漏洞比较复杂和费时，所以您需要一款自动化的web漏洞扫描工具来检测您的web应用是否存在安全漏洞。&lt;/p&gt;
&lt;p&gt;Acunetix Web Vulnerability Scanner（简称AWVS）是一款知名的Web网络漏洞扫描工具，它通过网络爬虫测试你的网站安全，检测流行安全漏洞。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1520220415205220.svg+xml&#34; alt=&#34;awvs&#34;&gt;&lt;/p&gt;
&lt;p&gt;官方网站：&lt;a href=&#34;https://www.acunetix.com/&#34;&gt;https://www.acunetix.com&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;性能测试&#34;&gt;性能测试&lt;/h2&gt;
&lt;p&gt;Locust是一个用于可扩展的，分布式的，性能测试的，开源的，用Python编写框架/工具，它非常容易使用，也非常好学。&lt;/p&gt;
&lt;p&gt;它的主要思想就是模拟一群用户将访问你的网站。每个用户的行为由你编写的python代码定义，同时可以从Web界面中实时观察到用户的行为。&lt;/p&gt;
&lt;p&gt;Locust完全是事件驱动的，因此在单台机器上能够支持几千并发用户访问。&lt;/p&gt;
&lt;p&gt;与其它许多基于事件的应用相比，Locust并不使用回调，而是使用gevent，而gevent是基于协程的，可以用同步的方式来编写异步执行的代码。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1520220415205227.png&#34; alt=&#34;awvs&#34;&gt;&lt;/p&gt;
&lt;p&gt;官方网站：&lt;a href=&#34;https://www.locust.io/&#34;&gt;https://www.locust.io&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;代码静态分析平台&#34;&gt;代码静态分析平台&lt;/h2&gt;
&lt;p&gt;SonarQube 是一款用于代码质量管理的开源工具，它主要用于管理源代码的质量。 通过插件形式，可以支持众多计算机语言，比如 java, C#, go，C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等。sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具来检测你的代码，帮助你发现代码的漏洞，Bug，异味等信息。&lt;/p&gt;
&lt;p&gt;Sonar 不仅提供了对 IDE 的支持，可以在 Eclipse和 IntelliJ IDEA 这些工具里联机查看结果；同时 Sonar 还对大量的持续集成工具提供了接口支持，可以很方便地在持续集成中使用 Sonar&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/1520220415205228.svg&#34; alt=&#34;awvs&#34;&gt;&lt;/p&gt;
&lt;p&gt;官方网站：&lt;a href=&#34;https://www.sonarqube.org/&#34;&gt;https://www.sonarqube.org&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;系列教程&#34;&gt;&lt;strong&gt;系列教程&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;全部文章RSS订阅&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&#34;Devops系列&#34;&gt;&lt;strong&gt;Devops系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/devops/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;Devops 分类 RSS 订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ab63eb8f/&#34;&gt;自建全套开源Devops开发系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d32a07a7/&#34;&gt;Git介绍以及分支模型图解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/39563241/&#34;&gt;三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/3437994a/&#34;&gt;DevOps系列—【Jenkinsfile+Dockerfile+nginx+vue】&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/f4c3ad41/&#34;&gt;项目开发管理工具推荐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/acc13b70/&#34;&gt;Gitlab的安装及使用教程完全版&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d08eb7b/&#34;&gt;Gitlab的安装及使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/78c3371/&#34;&gt;那些有用的Github工具介绍！Action、app、workflow等&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;link rel=&#34;stylesheet&#34; href=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10/dist/style.css&#34;&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/d3@7&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-view@0.18.10&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10&#34;&gt;&lt;/script&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;/css/markmap.css&#34;&gt;

&lt;script src=&#34;/js/markmap.js&#34;&gt;&lt;/script&gt;
</content>
        <category term="ci/cd" />
        <category term="devops" />
        <updated>2022-04-15T10:48:59.000Z</updated>
    </entry>
    <entry>
        <id>https://blog.17lai.site/posts/acc13b70/</id>
        <title>Gitlab的安装及使用教程完全版</title>
        <link rel="alternate" href="https://blog.17lai.site/posts/acc13b70/"/>
        <content type="html">&lt;h2 id=&#34;1-Gitlab概述&#34;&gt;1. Gitlab概述&lt;/h2&gt;
&lt;hr&gt;
&lt;h3 id=&#34;1-1-GitLab介绍&#34;&gt;1.1 GitLab介绍&lt;/h3&gt;
&lt;p&gt;GitLab是利用Ruby on Rails一个开源的版本管理系统，实现一个自托管的Git项目仓库，可通过Web界面进行访问公开的或者私人项目。&lt;/p&gt;
&lt;p&gt;GitLab能够浏览源代码，管理缺陷和注释。可以管理团队对仓库的访问，它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。&lt;/p&gt;
&lt;p&gt;它还提供一个代码片段收集功能可以轻松实现代码复用，便于日后有需要的时候进行查找&lt;/p&gt;
&lt;h3 id=&#34;1-2-Gitlab服务构成&#34;&gt;1.2 Gitlab服务构成&lt;/h3&gt;
&lt;p&gt;Nginx：静态web服务器。&lt;/p&gt;
&lt;p&gt;gitlab-shell：用于处理Git命令和修改authorized keys列表。&lt;/p&gt;
&lt;p&gt;gitlab-workhorse: 轻量级的反向代理服务器。&lt;/p&gt;
&lt;p&gt;logrotate：日志文件管理工具。&lt;/p&gt;
&lt;p&gt;postgresql：数据库。&lt;/p&gt;
&lt;p&gt;redis：缓存数据库。&lt;/p&gt;
&lt;p&gt;sidekiq：用于在后台执行队列任务（异步执行）。&lt;/p&gt;
&lt;p&gt;unicorn：An HTTP server for Rack applications，GitLab Rails应用是托管在这个服务器上面的。&lt;/p&gt;
&lt;h3 id=&#34;1-3-Gitlab工作流程&#34;&gt;1.3 Gitlab工作流程&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222044.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;1-4-GitLab-Shell&#34;&gt;1.4 GitLab Shell&lt;/h3&gt;
&lt;p&gt;GitLab Shell有两个作用：为GitLab处理Git命令、修改authorized keys列表&lt;/p&gt;
&lt;p&gt;当通过SSH访问GitLab Server时，GitLab Shell会：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;限制执行预定义好的Git命令（git push，git pull，git annex）&lt;/li&gt;
&lt;li&gt;调用GitLab Rails API检查权限&lt;/li&gt;
&lt;li&gt;执行pre-receive钩子（在企业版中叫做Git钩子）&lt;/li&gt;
&lt;li&gt;执行用户请求的动作，处理GitLab的post-receive动作&lt;/li&gt;
&lt;li&gt;处理自定义的post-receive动作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当通过http(s)访问GitLab Server时，工作流程取决于你是从Git仓库拉取(pull)代码还是向git仓库推送(push)代码：&lt;/p&gt;
&lt;p&gt;如果是从Git仓库拉取(pull)代码，GitLab Rails应用会全权负责处理用户鉴权和执行Git命令的工作&lt;/p&gt;
&lt;p&gt;如果是向Git仓库推送(push)代码，GitLab Rails应用既不会进行用户鉴权也不会执行Git命令，它会把以下工作交由GitLab Shell进行处理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;调用GitLab Rails API 检查权限&lt;/li&gt;
&lt;li&gt;执行pre-receive钩子（在GitLab企业版中叫做Git钩子）&lt;/li&gt;
&lt;li&gt;执行你请求的动作&lt;/li&gt;
&lt;li&gt;处理GitLab的post-receive动作&lt;/li&gt;
&lt;li&gt;处理自定义的post-receive动作&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1-5-GitLab-Workhorse&#34;&gt;1.5 GitLab Workhorse&lt;/h3&gt;
&lt;p&gt;GitLab Workhorse是一个敏捷的反向代理。它会处理一些大的HTTP请求，比如文件上传、文件下载、Git push/pull和Git包下载。其它请求会反向代理到GitLab Rails应用，即反向代理给后端的unicorn。&lt;/p&gt;
&lt;h2 id=&#34;2-Gitlab的安装部署&#34;&gt;2. Gitlab的安装部署&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Gitlab要求服务器内存2G以上&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-1-方式一-下载gitlab-ce的rpm包&#34;&gt;2.1 方式一:下载gitlab-ce的rpm包&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://packages.gitlab.com/gitlab/gitlab-ce&#34;&gt;gitlab官方rpm包下载&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/&#34;&gt;清华的源&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;将对应版本的gitlab-ce下载到本地后，直接yum安装即可&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 要先将这个rpm包下载到本地
yum install -y gitlab-ce-13.6.1-ce.0.el7.x86_64.rpm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-2-方式二-配置yum源&#34;&gt;2.2 方式二:配置yum源&lt;/h3&gt;
&lt;p&gt;在 /etc/yum.repos.d/ 下新建 gitlab-ce.repo，写入如下内容：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[gitlab-ce]
name&amp;#x3D;gitlab-ce
baseurl&amp;#x3D;https:&amp;#x2F;&amp;#x2F;mirrors.tuna.tsinghua.edu.cn&amp;#x2F;gitlab-ce&amp;#x2F;yum&amp;#x2F;el7&amp;#x2F;
Repo_gpgcheck&amp;#x3D;0
Enabled&amp;#x3D;1
Gpgkey&amp;#x3D;https:&amp;#x2F;&amp;#x2F;packages.gitlab.com&amp;#x2F;gpg.key&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;然后创建cache，再直接安装gitlab-ce&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;yum makecache  # 这一步会创建大量的数据
 
# 直接安装最新版
yum install -y gitlab-ce
 
# 如果要安装指定的版本，在后面填上版本号即可
yum install -y  gitlab-ce-13.6.1
 
# 如果安装时出现gpgkey验证错误，只需在安装时明确指明不进行gpgkey验证
yum install gitlab-ce -y --nogpgcheck&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-2-1-单服务启动模式&#34;&gt;&lt;strong&gt;2.2.1. 单服务启动模式&lt;/strong&gt;&lt;/h3&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;docker run -d --name gitlab --hostname gitlab.example.com \
-e GITLAB_OMNIBUS_CONFIG&amp;#x3D;&amp;quot;
    external_url &amp;#39;https:&amp;#x2F;&amp;#x2F;gitlab.example.com&amp;#39;
    gitlab_rails[&amp;#39;gitlab_shell_ssh_port&amp;#39;] &amp;#x3D; 22
    nginx[&amp;#39;redirect_http_to_https&amp;#39;] &amp;#x3D; true
    nginx[&amp;#39;ssl_dhparam&amp;#39;] &amp;#x3D; &amp;#39;&amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;ssl&amp;#x2F;dhparam.pem&amp;#39;
    nginx[&amp;#39;ssl_certificate&amp;#39;] &amp;#x3D; &amp;#39;&amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;ssl&amp;#x2F;domain.crt&amp;#39;
    nginx[&amp;#39;ssl_certificate_key&amp;#39;] &amp;#x3D; &amp;#39;&amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;ssl&amp;#x2F;domain.key&amp;#39;
    nginx[&amp;#39;custom_gitlab_server_config&amp;#39;] &amp;#x3D; &amp;#39;location ^~ &amp;#x2F;.well-known &amp;#123;\n alias &amp;#x2F;var&amp;#x2F;opt&amp;#x2F;gitlab&amp;#x2F;letsencrypt&amp;#x2F;.well-known;\n&amp;#125;\n&amp;#39;
    high_availability[&amp;#39;mountpoint&amp;#39;] &amp;#x3D; [&amp;#39;&amp;#x2F;etc&amp;#x2F;gitlab&amp;#39;, &amp;#39;&amp;#x2F;var&amp;#x2F;log&amp;#x2F;gitlab&amp;#39; &amp;#39;&amp;#x2F;var&amp;#x2F;opt&amp;#x2F;gitlab&amp;#39;  # 严格限定gitlab服务启动前，指定文件系统挂完毕
&amp;quot; \
-p 22:22 -p 80:80 -p 443:443 \
-v &amp;#x2F;srv&amp;#x2F;gitlab&amp;#x2F;config:&amp;#x2F;etc&amp;#x2F;gitlab \
-v &amp;#x2F;srv&amp;#x2F;gitlab&amp;#x2F;logs:&amp;#x2F;var&amp;#x2F;log&amp;#x2F;gitlab \
-v &amp;#x2F;srv&amp;#x2F;gitlab&amp;#x2F;data:&amp;#x2F;var&amp;#x2F;opt&amp;#x2F;gitlab \
-v &amp;#x2F;etc&amp;#x2F;certs:&amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;ssl \
--restart&amp;#x3D;always gitlab&amp;#x2F;gitlab-ce:latest
 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-2-1-Compose服务编排模式-推荐方式&#34;&gt;&lt;strong&gt;2.2.1. Compose服务编排模式(推荐方式)&lt;/strong&gt;&lt;/h3&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;docker pull gitlab&amp;#x2F;gitlab-ce:latest
 
############################ 多行命令开始 ##########################
cat &amp;gt; docker-compose.yaml &amp;lt;&amp;lt;EOF
version: &amp;#39;2&amp;#39;
 
services:
 
  Gitlab:
    image: &amp;#39;gitlab&amp;#x2F;gitlab-ce:latest&amp;#39;
    container_name: &amp;#39;gitlab&amp;#39;
    hostname: &amp;#39;gitlab.example.com&amp;#39;
    restart: always
    ports:
      - &amp;#39;22:22&amp;#39;
      - &amp;#39;80:80&amp;#39;
      - &amp;#39;443:443&amp;#39;
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        # Add any other gitlab.rb configuration here, each on its own line
        external_url &amp;#39;https:&amp;#x2F;&amp;#x2F;gitlab.example.com&amp;#39;
        gitlab_rails[&amp;#39;gitlab_shell_ssh_port&amp;#39;] &amp;#x3D; 22
        nginx[&amp;#39;redirect_http_to_https&amp;#39;] &amp;#x3D; true
        nginx[&amp;#39;ssl_dhparam&amp;#39;] &amp;#x3D; &amp;quot;&amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;ssl&amp;#x2F;dhparam.pem&amp;quot;
        nginx[&amp;#39;ssl_certificate&amp;#39;] &amp;#x3D; &amp;quot;&amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;ssl&amp;#x2F;domain.crt&amp;quot;
        nginx[&amp;#39;ssl_certificate_key&amp;#39;] &amp;#x3D; &amp;quot;&amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;ssl&amp;#x2F;domain.key&amp;quot;
        nginx[&amp;#39;custom_gitlab_server_config&amp;#39;] &amp;#x3D; &amp;quot;location ^~ &amp;#x2F;.well-known &amp;#123;\n alias &amp;#x2F;var&amp;#x2F;opt&amp;#x2F;gitlab&amp;#x2F;letsencrypt&amp;#x2F;.well-known;\n&amp;#125;\n&amp;quot;
        high_availability[&amp;#39;mountpoint&amp;#39;] &amp;#x3D; [&amp;quot;&amp;#x2F;etc&amp;#x2F;gitlab&amp;quot;, &amp;quot;&amp;#x2F;var&amp;#x2F;log&amp;#x2F;gitlab&amp;quot;, &amp;quot;&amp;#x2F;var&amp;#x2F;opt&amp;#x2F;gitlab&amp;quot;]  # 严格限定gitlab服务启动前，指定文件系统挂完毕
    volumes:
      - &amp;#x2F;srv&amp;#x2F;gitlab&amp;#x2F;config:&amp;#x2F;etc&amp;#x2F;gitlab
      - &amp;#x2F;srv&amp;#x2F;gitlab&amp;#x2F;logs:&amp;#x2F;var&amp;#x2F;log&amp;#x2F;gitlab
      - &amp;#x2F;srv&amp;#x2F;gitlab&amp;#x2F;data:&amp;#x2F;var&amp;#x2F;opt&amp;#x2F;gitlab
      - &amp;#x2F;etc&amp;#x2F;certs:&amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;ssl
EOF
############################ 多行命令结束 ##########################
 
# 启动服务
docker-compose -f docker-compose.yaml up -d
 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-3-gitlab的配置&#34;&gt;2.3 gitlab的配置&lt;/h3&gt;
&lt;p&gt;配置文件位置  /etc/gitlab/gitlab.rb&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@centos7 test]# vim &amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;gitlab.rb
 
[root@centos7 test]# grep &amp;quot;^[a-Z]&amp;quot; &amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;gitlab.rb
 
external_url &amp;#39;http:&amp;#x2F;&amp;#x2F;10.0.0.51&amp;#39;  # 这里一定要加上http:&amp;#x2F;&amp;#x2F;
 
# 配置邮件服务
gitlab_rails[&amp;#39;smtp_enable&amp;#39;] &amp;#x3D; true
gitlab_rails[&amp;#39;smtp_address&amp;#39;] &amp;#x3D; &amp;quot;smtp.qq.com&amp;quot;
gitlab_rails[&amp;#39;smtp_port&amp;#39;] &amp;#x3D; 25
gitlab_rails[&amp;#39;smtp_user_name&amp;#39;] &amp;#x3D; &amp;quot;hgzerowzh@qq.com&amp;quot;  # 自己的qq邮箱账号
gitlab_rails[&amp;#39;smtp_password&amp;#39;] &amp;#x3D; &amp;quot;xxx&amp;quot;  # 开通smtp时返回的授权码
gitlab_rails[&amp;#39;smtp_domain&amp;#39;] &amp;#x3D; &amp;quot;qq.com&amp;quot;
gitlab_rails[&amp;#39;smtp_authentication&amp;#39;] &amp;#x3D; &amp;quot;login&amp;quot;
gitlab_rails[&amp;#39;smtp_enable_starttls_auto&amp;#39;] &amp;#x3D; true
gitlab_rails[&amp;#39;smtp_tls&amp;#39;] &amp;#x3D; false
gitlab_rails[&amp;#39;gitlab_email_from&amp;#39;] &amp;#x3D; &amp;quot;hgzerowzh@qq.com&amp;quot;  # 指定发送邮件的邮箱地址
user[&amp;quot;git_user_email&amp;quot;] &amp;#x3D; &amp;quot;shit@qq.com&amp;quot;   # 指定接收邮件的邮箱地址&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;修改好配置文件后，要使用 gitlab-ctl reconfigure 命令重载一下配置文件，否则不生效。&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;gitlab-ctl reconfigure # 重载配置文件
gitlab-ctl restart&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;测试邮件服务器&#34;&gt;测试邮件服务器&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;gitlab-rails console
Notify.test_email(&amp;#39;rollinghell@foxmail.com&amp;#39;,&amp;#39;testbiaoti&amp;#39;,&amp;#39;testzhegnwen1&amp;#39;).deliver_now&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@test102 ~]# gitlab-rails console
--------------------------------------------------------------------------------
 GitLab:       12.5.0 (1f0ab8978ef)
GitLab Shell: 10.2.0
 PostgreSQL:   10.9
--------------------------------------------------------------------------------
Loading production environment (Rails 5.2.3)
irb(main):001:0&amp;gt; Notify.test_email(&amp;#39;andycrusoe@gmail.com&amp;#39;,&amp;#39;test&amp;#39;,&amp;#39;test&amp;#39;).deliver_now
Notify#test_email: processed outbound mail in 1.4ms
Sent mail to anliven@126.com (73.0ms)
Date: Wed, 27 Nov 2019 15:12:58 +0800
From: GitLab &amp;lt;gitlab@192.168.16.102&amp;gt;
Reply-To: GitLab &amp;lt;noreply@192.168.16.102&amp;gt;
To: anliven@126.com
Message-ID: &amp;lt;5dde21fa612d4_3a1b3fcb38fcf9c0651b@test102.mail&amp;gt;
Subject: test
Mime-Version: 1.0
Content-Type: text&amp;#x2F;html;
charset&amp;#x3D;UTF-8
Content-Transfer-Encoding: 7bit
Auto-Submitted: auto-generated
X-Auto-Response-Suppress: All
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-&amp;#x2F;&amp;#x2F;W3C&amp;#x2F;&amp;#x2F;DTD HTML 4.0 Transitional&amp;#x2F;&amp;#x2F;EN&amp;quot; &amp;quot;http:&amp;#x2F;&amp;#x2F;www.w3.org&amp;#x2F;TR&amp;#x2F;REC-html40&amp;#x2F;loose.dtd&amp;quot;&amp;gt;
&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;p&amp;gt;test&amp;lt;&amp;#x2F;p&amp;gt;&amp;lt;&amp;#x2F;body&amp;gt;&amp;lt;&amp;#x2F;html&amp;gt;
&amp;#x3D;&amp;gt; #&amp;lt;Mail::Message:70141649239780, Multipart: false, Headers: &amp;lt;Date: Wed, 27 Nov 2019 15:12:58 +0800&amp;gt;, &amp;lt;From: GitLab &amp;lt;gitlab@192.168.16.102&amp;gt;&amp;gt;, &amp;lt;Reply-To: GitLab &amp;lt;noreply@192.168.16.102&amp;gt;&amp;gt;, &amp;lt;To: anliven@126.com&amp;gt;, &amp;lt;Message-ID: &amp;lt;5dde21fa612d4_3a1b3fcb38fcf9c0651b@test102.mail&amp;gt;&amp;gt;, &amp;lt;Subject: test&amp;gt;, &amp;lt;Mime-Version: 1.0&amp;gt;, &amp;lt;Content-Type: text&amp;#x2F;html; charset&amp;#x3D;UTF-8&amp;gt;, &amp;lt;Content-Transfer-Encoding: 7bit&amp;gt;, &amp;lt;Auto-Submitted: auto-generated&amp;gt;, &amp;lt;X-Auto-Response-Suppress: All&amp;gt;&amp;gt;
irb(main):002:0&amp;gt;
irb(main):003:0&amp;gt; exit
[root@test102 ~]#
 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;配置gitlab代理&#34;&gt;配置gitlab代理&lt;/h4&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/omnibus/settings/environment-variables.html&#34;&gt;Setting custom environment variables | GitLab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ee/administration/logs/index.html#update_mirror_service_jsonlog&#34;&gt;Log system | GitLab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ruby&#34; data-language=&#34;ruby&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ruby&#34;&gt;gitaly[&amp;#39;env&amp;#39;] &amp;#x3D; &amp;#123;
    &amp;quot;http_proxy&amp;quot; &amp;#x3D;&amp;gt; &amp;quot;http:&amp;#x2F;&amp;#x2F;USERNAME:PASSWORD@example.com:8080&amp;quot;,
    &amp;quot;https_proxy&amp;quot; &amp;#x3D;&amp;gt; &amp;quot;http:&amp;#x2F;&amp;#x2F;USERNAME:PASSWORD@example.com:8080&amp;quot;
&amp;#125;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;也可以使用单独模块代理&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ruby&#34; data-language=&#34;ruby&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ruby&#34;&gt;# Needed for proxying Git clones
gitaly[&amp;#39;env&amp;#39;] &amp;#x3D; &amp;#123;
    &amp;quot;http_proxy&amp;quot; &amp;#x3D;&amp;gt; &amp;quot;http:&amp;#x2F;&amp;#x2F;USERNAME:PASSWORD@example.com:8080&amp;quot;,
    &amp;quot;https_proxy&amp;quot; &amp;#x3D;&amp;gt; &amp;quot;http:&amp;#x2F;&amp;#x2F;USERNAME:PASSWORD@example.com:8080&amp;quot;
&amp;#125;

gitlab_workhorse[&amp;#39;env&amp;#39;] &amp;#x3D; &amp;#123;
    &amp;quot;http_proxy&amp;quot; &amp;#x3D;&amp;gt; &amp;quot;http:&amp;#x2F;&amp;#x2F;USERNAME:PASSWORD@example.com:8080&amp;quot;,
    &amp;quot;https_proxy&amp;quot; &amp;#x3D;&amp;gt; &amp;quot;http:&amp;#x2F;&amp;#x2F;USERNAME:PASSWORD@example.com:8080&amp;quot;
&amp;#125;

gitlab_pages[&amp;#39;env&amp;#39;] &amp;#x3D; &amp;#123;
    &amp;quot;http_proxy&amp;quot; &amp;#x3D;&amp;gt; &amp;quot;http:&amp;#x2F;&amp;#x2F;USERNAME:PASSWORD@example.com:8080&amp;quot;,
    &amp;quot;https_proxy&amp;quot; &amp;#x3D;&amp;gt; &amp;quot;http:&amp;#x2F;&amp;#x2F;USERNAME:PASSWORD@example.com:8080&amp;quot;
&amp;#125;

# If you use the docker registry
registry[&amp;#39;env&amp;#39;] &amp;#x3D; &amp;#123;
    &amp;quot;http_proxy&amp;quot; &amp;#x3D;&amp;gt; &amp;quot;http:&amp;#x2F;&amp;#x2F;USERNAME:PASSWORD@example.com:8080&amp;quot;,
    &amp;quot;https_proxy&amp;quot; &amp;#x3D;&amp;gt; &amp;quot;http:&amp;#x2F;&amp;#x2F;USERNAME:PASSWORD@example.com:8080&amp;quot;
&amp;#125;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;应用生效 &lt;code&gt;gitlab-ctl reconfigure&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-4-Gitlab常用命令&#34;&gt;2.4 Gitlab常用命令&lt;/h3&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;gitlab-ctl start         # 启动所有 gitlab 组件
gitlab-ctl stop          # 停止所有 gitlab 组件
gitlab-ctl restart       # 重启所有 gitlab 组件
gitlab-ctl status        # 查看服务状态
 
gitlab-ctl reconfigure   # 启动服务
gitlab-ctl show-config   # 验证配置文件
 
gitlab-ctl tail          # 查看日志
 
gitlab-rake gitlab:check SANITIZE&amp;#x3D;true --trace    # 检查gitlab
 
vim &amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;gitlab.rb # 修改默认的配置文件&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-5-gitlab-ctl常用命令介绍&#34;&gt;2.5 gitlab-ctl常用命令介绍&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:right&#34;&gt;命令&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;check-config&lt;/td&gt;
&lt;td&gt;检查在gitlab中是否有任何配置。在指定版本中删除的rb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;deploy-page&lt;/td&gt;
&lt;td&gt;安装部署页面&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;diff-config&lt;/td&gt;
&lt;td&gt;将用户配置与包可用配置进行比较&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;remove-accounts&lt;/td&gt;
&lt;td&gt;删除所有用户和组&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;upgrade&lt;/td&gt;
&lt;td&gt;升级&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;service-list&lt;/td&gt;
&lt;td&gt;查看所有服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;once&lt;/td&gt;
&lt;td&gt;如果GitLab服务停止了就启动服务，如果已启动就不做任何操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;restart&lt;/td&gt;
&lt;td&gt;重启GitLab服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;start&lt;/td&gt;
&lt;td&gt;如果GitLab服务停止了就启动服务，如果已启动就重启服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;stop&lt;/td&gt;
&lt;td&gt;停止GitLab服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;status&lt;/td&gt;
&lt;td&gt;查看GitLab服务状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:right&#34;&gt;reconfigure&lt;/td&gt;
&lt;td&gt;重新配置GitLab并启动&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;3-Gitlab的使用&#34;&gt;3. Gitlab的使用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Gitlab安装好后，设置密码，管理账户为root&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-1-创建Group&#34;&gt;&lt;strong&gt;3.1 创建Group&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;填上组名即可，这里组名为java&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222105.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164637.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-2-创建User&#34;&gt;&lt;strong&gt;3.2 创建User&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;创建四个User：pm、dev1、dev2、dev3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222131.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222120.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-3-添加User到Group中并授权&#34;&gt;&lt;strong&gt;3.3 添加User到Group中并授权&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222140.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-4-创建Project并配置SSH&#34;&gt;&lt;strong&gt;3.4 创建Project并配置SSH&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222147.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222154.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222201.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222233.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-5-在项目中添加成员&#34;&gt;&lt;strong&gt;3.5 在项目中添加成员&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164730.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164804.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-6-将本地文件推送到Gitlab&#34;&gt;3.6 将本地文件推送到Gitlab&lt;/h3&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 将app01项目克隆下来
git clone git@10.0.0.51:java&amp;#x2F;app01.git
 
# 初始化配置
git config --global user.name &amp;quot;hgzero&amp;quot;
git config --global user.email &amp;quot;hgzero@qq.com&amp;quot;
 
# 在app01目录下新建一些文件
 
# 推送到gitlab
git add .
git commit -m &amp;quot;first edition&amp;quot;
git push origin master&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164823.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;4-制定开发计划&#34;&gt;4. 制定开发计划&lt;/h2&gt;
&lt;h3 id=&#34;4-1-创建开发计划&#34;&gt;&lt;strong&gt;4.1 创建开发计划&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;项目：app01&lt;/li&gt;
&lt;li&gt;版本：v1.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802173643.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-2-创建里程碑Milestones&#34;&gt;&lt;strong&gt;4.2 创建里程碑Milestones&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用pm账号登录gitlab后操作（先要在admin中设置pm账号的密码）&lt;/li&gt;
&lt;li&gt;要根据开发计划来创建Milestones&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164839.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164935.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164956.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802165053.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-3-根据开发计划创建issue&#34;&gt;4.3 根据开发计划创建issue&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;创建4个issue，分派给dev1和dev2这两个开发人员&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802165109.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802165138.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802165158.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802165215.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802165238.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802165257.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-4-开发者登录账号查看分派的任务&#34;&gt;**4.4 开发者登录账号查看分派的任务 **&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;然后开发dev1登录gitlab，就能看到任务已经分配过来了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802165316.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-5-开发流程&#34;&gt;&lt;strong&gt;4.5 开发流程&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;公司里的开发开始任务&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 1. 先从仓库把项目拉下来
git clone git@10.0.0.51:java&amp;#x2F;app01.git
cd app01&amp;#x2F;
 
# 2.先创建一个自己的分支，然后进行开发
git checkout -b index   # 创建一个叫index的分支，并切换到这个分支
git status
 
# 3. 开始开发首页
echo &amp;quot;&amp;lt;h1&amp;gt;welcome to this app&amp;lt;&amp;#x2F;h1&amp;gt;&amp;quot; &amp;gt; index.html  # 假设就开发了一个index页面
 
# 4. 开发完成后，把项目传到仓库
git add .
git commit -m &amp;quot;index&amp;quot;
# 如果写成 git commit -m &amp;quot;close #2&amp;quot; ，则表示merge请求允许且merge成功之后，自动删除编号为#2的issue
 
# 传到index分支
git push origin index&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;4-6-合并分支&#34;&gt;&lt;strong&gt;4.6 合并分支&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1）开发dev1发送合并分支请求给pm&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802165333.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802165341.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802165350.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2）pm收到开发的Merge请求后进行处理&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用pm登录，就可以看到pm已经收到了合并请求merge request&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802165452.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802165505.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802165423.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164313.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3）开发dev1确认任务完成&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;退出pm账户，登入dev1账户：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164301.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;或者点进去后，在侧边栏进行标识Done，然后已经完成的issue，可以将其Close&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164248.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这个时候Milestones的进度已经往前进了一些了：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164237.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-7-开发其他功能&#34;&gt;4.7 开发其他功能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;然后其他开发者或者自己再次进行开发时，先要把刚刚更新后的内容（master主干）拉回来，然后再进行开发&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;git checkout master  # 切换到master&lt;br&gt;
git pull             # 从远端仓库拉取数据&lt;br&gt;
# 然后再进行其他操作&lt;/p&gt;
&lt;h2 id=&#34;5-Gitlab备份恢复&#34;&gt;5. Gitlab备份恢复&lt;/h2&gt;
&lt;h3 id=&#34;5-1-备份gitlab&#34;&gt;5.1 备份gitlab&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1）修改配置文件&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;/etc/gitlab/gitlab.rb&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 备份保存的位置，这里是默认位置，可修改成指定的位置
gitlab_rails[&amp;#39;backup_path&amp;#39;] &amp;#x3D; &amp;quot;&amp;#x2F;var&amp;#x2F;opt&amp;#x2F;gitlab&amp;#x2F;backups&amp;quot;
 
# 设置备份保存的时间，超过此时间的日志将会被新覆盖
gitlab_rails[&amp;#39;backup_keep_time&amp;#39;] &amp;#x3D; 604800  # 这里是默认设置，保存7天
 
# 特别注意：
#     如果自定义了备份保存位置，则要修改备份目录的权限，比如：
#     chown -R git.git &amp;#x2F;data&amp;#x2F;backup&amp;#x2F;gitlab&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;配置完成后要重启以使配置生效&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 重读配置文件
gitlab-ctl reconfigure
 
# 重启gitlab
gitlab-ctl restart&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;2）设置定时任务&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 每天凌晨2点定时创建备份
# 将一下内容写入到定时任务中 crontab -e
0 2 * * * &amp;#x2F;usr&amp;#x2F;bin&amp;#x2F;gitlab-rake gitlab:backup:create
 
# 备份策略建议：
#     本地保留3到7天，在异地备份永久保存&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;3）备份时间的识别&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 备份后的文件类似这样的形式：1494170842_gitlab_backup.tar，可以根据前面的时间戳确认备份生成的时间
 
data  -d  @1494170842&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;5-2-恢复gitlab&#34;&gt;5.2 恢复gitlab&lt;/h3&gt;
&lt;h4 id=&#34;1）停止停止相关数据连接-数据写入服务&#34;&gt;&lt;strong&gt;1）停止停止相关数据连接,数据写入服务&lt;/strong&gt;&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 停止数据写入服务
gitlab-ctl stop puma
gitlab-ctl stop sidekiq&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;2）进行数据恢复并重启&#34;&gt;&lt;strong&gt;2）进行数据恢复并重启&lt;/strong&gt;&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 进行恢复
gitlab-rake gitlab:backup:restore BACKUP&amp;#x3D;1627839447_2021_08_01_14.1.1-ee  # 这个时间戳就是刚刚备份的文件前面的时间戳
 
# 重启
gitlab-ctl restart&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;6-gitlab邮件通知配置&#34;&gt;6. gitlab邮件通知配置&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;vim  /etc/gitlab/gitlab.rb&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;gitlab_rails[&amp;#39;time_zone&amp;#39;] &amp;#x3D; &amp;#39;Asia&amp;#x2F;Shanghai&amp;#39;
 
gitlab_rails[&amp;#39;gitlab_email_enabled&amp;#39;] &amp;#x3D; true
gitlab_rails[&amp;#39;gitlab_email_from&amp;#39;] &amp;#x3D; &amp;#39;example@163.com&amp;#39; # 填写发件人的邮箱地址
gitlab_rails[&amp;#39;gitlab_email_display_name&amp;#39;] &amp;#x3D; &amp;#39;gitlab&amp;#39;
 
gitlab_rails[&amp;#39;smtp_enable&amp;#39;] &amp;#x3D; true
gitlab_rails[&amp;#39;smtp_address&amp;#39;] &amp;#x3D; &amp;quot;smtp.163.com&amp;quot;  # smtp服务器的地址,如网易的地址
gitlab_rails[&amp;#39;smtp_port&amp;#39;] &amp;#x3D; 25                 # 要注意如果使用了SSL&amp;#x2F;TLS的话,端口可能不是25
gitlab_rails[&amp;#39;smtp_user_name&amp;#39;] &amp;#x3D; &amp;quot;smtp用户名&amp;quot;
gitlab_rails[&amp;#39;smtp_password&amp;#39;] &amp;#x3D; &amp;quot;smtp用户密码&amp;quot;
gitlab_rails[&amp;#39;smtp_domain&amp;#39;] &amp;#x3D; &amp;quot;163.com&amp;quot;
gitlab_rails[&amp;#39;smtp_authentication&amp;#39;] &amp;#x3D; &amp;quot;login&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;启用邮件功能&lt;/strong&gt;&lt;br&gt;
Gitlab 的 Compose 配置 &lt;code&gt;GITLAB_OMNIBUS_CONFIG&lt;/code&gt; 节点下增加如下几行：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;########## 邮件服务配置 ##########
gitlab_rails[&amp;#39;smtp_enable&amp;#39;] &amp;#x3D; true
gitlab_rails[&amp;#39;smtp_address&amp;#39;] &amp;#x3D; &amp;quot;smtp.exmail.qq.com&amp;quot;
gitlab_rails[&amp;#39;smtp_port&amp;#39;] &amp;#x3D; 465
gitlab_rails[&amp;#39;smtp_tls&amp;#39;] &amp;#x3D; true
gitlab_rails[&amp;#39;smtp_user_name&amp;#39;] &amp;#x3D; &amp;quot;账号&amp;quot;
gitlab_rails[&amp;#39;smtp_password&amp;#39;] &amp;#x3D; &amp;quot;密码&amp;quot;
gitlab_rails[&amp;#39;smtp_authentication&amp;#39;] &amp;#x3D; &amp;quot;login&amp;quot;
gitlab_rails[&amp;#39;smtp_enable_starttls_auto&amp;#39;] &amp;#x3D; true 
gitlab_rails[&amp;#39;gitlab_email_from&amp;#39;] &amp;#x3D; &amp;quot;发件人邮箱&amp;quot;
 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;7-使用SourceTree进行项目开发&#34;&gt;7. 使用SourceTree进行项目开发&lt;/h2&gt;
&lt;hr&gt;
&lt;h3 id=&#34;7-1-项目拉取&#34;&gt;7.1 项目拉取&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;先把项目克隆下来&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164210.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164157.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果ssh的方式克隆失败，可能是因为SSH Key没找到，可以在这里添加&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164146.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164132.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;7-2-创建分支进行功能开发&#34;&gt;7.2 创建分支进行功能开发&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1）新建立一个叫“pay”的分支&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164122.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164113.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2）进行功能开发&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164103.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;7-3-提交项目&#34;&gt;7.3 提交项目&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1）开发pay功能完成后进行提交&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以看到SourceTree中已经有“未提交的更改”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164054.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164042.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2）添加“用户信息”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164029.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;** 3）进行提交**&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164014.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注释也可以写成  close #3    ，作用是提交完成后关闭3号issue&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;7-4-推送到仓库&#34;&gt;&lt;strong&gt;7.4 推送到仓库&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802164002.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802163947.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;然后就可以在gitlab上进行发送merge请求了，后面就可以进行其他操作了&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;7-5-项目上线&#34;&gt;7.5 项目上线&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1）当所有工作完成之后，就可以进行上线了&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802163932.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2）打标签&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上线先打个标签&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802163916.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802163907.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528225256.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;** 3）删除无用分支**&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;然后删除已经合并到主干中的不必要的分支，如index、pay等&lt;/li&gt;
&lt;li&gt;最后一定要注意时间一定要同步，不然会错乱&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;8-Gitlab调优&#34;&gt;&lt;strong&gt;8. Gitlab调优&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;gitlab对内存资源的消耗比较厉害其中尤以 sidekiq队列 及 unicorn服务 两个组件对内存消耗最多可以再容器启动时对相关参数进行微调：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;unicorn[&amp;#39;worker_processes&amp;#39;] &amp;#x3D; 1
unicorn[&amp;#39;worker_memory_limit_min&amp;#39;] &amp;#x3D; &amp;quot;300 * 1 &amp;lt;&amp;lt; 20&amp;quot;
unicorn[&amp;#39;worker_memory_limit_max&amp;#39;] &amp;#x3D; &amp;quot;400 * 1 &amp;lt;&amp;lt; 20&amp;quot;
unicorn[&amp;#39;worker_timeout&amp;#39;] &amp;#x3D; 15
sidekiq[&amp;#39;concurrency&amp;#39;] &amp;#x3D; 10
sidekiq_cluster[&amp;#39;enable&amp;#39;] &amp;#x3D; false
sidekiq_cluster[&amp;#39;ha&amp;#39;] &amp;#x3D; false
redis[&amp;#39;maxclients&amp;#39;] &amp;#x3D; &amp;quot;100&amp;quot;
nginx[&amp;#39;worker_processes&amp;#39;] &amp;#x3D; 2
nginx[&amp;#39;worker_connections&amp;#39;] &amp;#x3D; 512
nginx[&amp;#39;keepalive_timeout&amp;#39;] &amp;#x3D; 300
nginx[&amp;#39;cache_max_size&amp;#39;] &amp;#x3D; &amp;#39;200m&amp;#39;
mattermost[&amp;#39;enable&amp;#39;] &amp;#x3D; false
mattermost_nginx[&amp;#39;enable&amp;#39;] &amp;#x3D; false
gitlab_pages[&amp;#39;enable&amp;#39;] &amp;#x3D; false
pages_nginx[&amp;#39;enable&amp;#39;] &amp;#x3D; false
postgresql[&amp;#39;shared_buffers&amp;#39;] &amp;#x3D; &amp;quot;256MB&amp;quot;
postgresql[&amp;#39;max_connections&amp;#39;] &amp;#x3D; 30
postgresql[&amp;#39;work_mem&amp;#39;] &amp;#x3D; &amp;quot;8MB&amp;quot;
postgresql[&amp;#39;maintenance_work_mem&amp;#39;] &amp;#x3D; &amp;quot;16MB&amp;quot;
postgresql[&amp;#39;effective_cache_size&amp;#39;] &amp;#x3D; &amp;quot;1MB&amp;quot;
postgresql[&amp;#39;checkpoint_timeout&amp;#39;] &amp;#x3D; &amp;quot;5min&amp;quot;
postgresql[&amp;#39;checkpoint_warning&amp;#39;] &amp;#x3D; &amp;quot;30s&amp;quot;
 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;配置调整后需要重载一下&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;docker exec gitlab gitlab-ctl reconfigure
docker-compose down
docker-compose up -d
 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id=&#34;9-Gitlab-启用-ContainerRegistry&#34;&gt;9. Gitlab 启用 ContainerRegistry&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ContainerRegistry&lt;/code&gt;是&lt;code&gt;Gitlab&lt;/code&gt;内置的&lt;code&gt;Docker Registry&lt;/code&gt;集成组件&lt;/li&gt;
&lt;li&gt;集成后每个项目可获得私有的 &lt;code&gt;Docker&lt;/code&gt; 镜像存储空间&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ContainerRegistry&lt;/code&gt; 可以复用 &lt;code&gt;Gitlab&lt;/code&gt; 域名 或者 独立域名&lt;/li&gt;
&lt;li&gt;这里配置为复用域名（此时&lt;code&gt;ContainerRegistry&lt;/code&gt; 将复用 &lt;code&gt;Gitlab&lt;/code&gt; 的 &lt;code&gt;TLS&lt;/code&gt; 证书）&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;docker-compose.yaml&lt;/code&gt;中Gitlab服务的 &lt;code&gt;GITLAB_OMNIBUS_CONFIG&lt;/code&gt; 节点下增加如下配置：&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;registry_external_url &amp;quot;https:&amp;#x2F;&amp;#x2F;gitlab.example.com:4567&amp;quot;  # ContainerRegistry的外部访问地址
registry_nginx[&amp;#39;ssl_certificate&amp;#39;] &amp;#x3D; &amp;quot;&amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;ssl&amp;#x2F;domain.crt&amp;quot;
registry_nginx[&amp;#39;ssl_certificate_key&amp;#39;] &amp;#x3D; &amp;quot;&amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;ssl&amp;#x2F;domain.key&amp;quot;
gitlab_rails[&amp;#39;registry_host&amp;#39;] &amp;#x3D; &amp;quot;gitlab.example.com&amp;quot;
gitlab_rails[&amp;#39;registry_port&amp;#39;] &amp;#x3D; &amp;quot;4567&amp;quot;
gitlab_rails[&amp;#39;registry_api_url&amp;#39;] &amp;#x3D; &amp;quot;http:&amp;#x2F;&amp;#x2F;localhost:5000&amp;quot;
gitlab_rails[&amp;#39;gitlab_default_projects_features_builds&amp;#39;] &amp;#x3D; false
gitlab_rails[&amp;#39;gitlab_default_projects_features_container_registry&amp;#39;] &amp;#x3D; false
 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;端口开放增加 &lt;code&gt;- 4567:4567&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;服务重启 &lt;code&gt;docker-compose restart Gitlab&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;ContainerRegistry&lt;/code&gt; 集成后可以通过 &lt;code&gt;Gitlab&lt;/code&gt; 账户登录： &lt;code&gt;docker login gitlab.example.com:4567&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;日常维护命令&#34;&gt;日常维护命令&lt;/h2&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# Gitlab维护
docker exec gitlab gitlab-ctl status  # gitlab各组件服务状态
docker exec gitlab gitlab-ctl start&amp;#x2F;restart&amp;#x2F;stop [组件名]  # gitlab所有组件的统一控制（其中Unicorn组件重启完成前GitLab会报502）
docker exec gitlab gitlab-ctl tail [&amp;#x2F;var&amp;#x2F;log&amp;#x2F;gitlab下的某子目录]  # 实时查看日志
 
docker exec gitlab update-permissions  # 修复gitlab版本升级后出现的权限问题
docker exec gitlab gitlab-ctl reconfigure  # 重载配置
docker exec -t gitlab gitlab-rake gitlab:backup:create  # 创建备份
 
# ContainerRegistry维护
docker exec gitlab gitlab-ctl registry-garbage-collect  # 垃圾回收，清理废弃layer（registry停机）
 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;hr&gt;
&lt;h3 id=&#34;Import-Repository-Repo-By-Url&#34;&gt;Import Repository(Repo By Url)&lt;/h3&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 账号密码若存在特殊字符则需要url编码
https:&amp;#x2F;&amp;#x2F;username:password@host:port&amp;#x2F;group&amp;#x2F;project.git
 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;10-GitLab重置用户名密码&#34;&gt;&lt;strong&gt;10. GitLab重置用户名密码&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;打开终端，访问：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;gitlab-rails console&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;输入：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;user &amp;#x3D; User.where(id: 1).first
user.password&amp;#x3D;&amp;#39;123456&amp;#39;
user.password_confirmation &amp;#x3D; &amp;#39;123456&amp;#39;
user.save! #注意加上 “！”&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;然后退出命令行即可。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;quit&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt; gitlab-rails console production 命令 开始初始化密码
# 在irb(main):001:0&amp;gt; 后面通过 u&amp;#x3D;User.where(id:1).first 来查找与切换账号（User.all 可以查看所有用户）
# 通过u.password&amp;#x3D;&amp;#39;12345678&amp;#39;设置密码为12345678(这里的密码看自己喜欢)：
# 通过u.password_confirmation&amp;#x3D;&amp;#39;12345678&amp;#39; 再次确认密码
# 通过 u.save!进行保存&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;11-HTTPS-SSL-支持&#34;&gt;&lt;strong&gt;11. HTTPS SSL 支持&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;nginx反向代理方式&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注意docker 内部没有ca支持， 需要手动添加&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;域名提供商提供的免费证书&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这种证书直接用，如果是自签名证书，需要添加自己的ca root证书到服务器&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;12-Gitlab恢复数据出现must-be-owner-of解决方法&#34;&gt;12. Gitlab恢复数据出现must be owner of解决方法&lt;/h2&gt;
&lt;p&gt;按正常Gitlab备份数据gitlab-rake gitlab:backup:create&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-sql&#34; data-language=&#34;sql&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-sql&#34;&gt;ERROR: must be owner of extension plpgsql
ERROR: must be owner of schema public
ERROR: schema “public” already exists
ERROR: must be owner of schema public
ERROR: must be owner of extension plpgsql
WARNING: no privileges could be revoked for “public”
WARNING: no privileges could be revoked for “public”
WARNING: no privileges were granted for “public”
WARNING: no privileges were granted for “public”&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;解决方法：&lt;/p&gt;
&lt;h4 id=&#34;1-修改postgresql配置&#34;&gt;**1. 修改postgresql配置 **&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;cd &amp;#x2F;var&amp;#x2F;opt&amp;#x2F;gitlab&amp;#x2F;postgresql&amp;#x2F;data
$ vi &amp;#x2F;var&amp;#x2F;opt&amp;#x2F;gitlab&amp;#x2F;postgresql&amp;#x2F;data&amp;#x2F;postgresql.conf
listen_addresses &amp;#x3D; &amp;#39;*&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;找到listen_addresses = ” 改为listen_addresses = ‘*’&lt;/p&gt;
&lt;p&gt;修改 /var/opt/gitlab/postgresql/data/pg_hba.conf&lt;br&gt;
在这个文件最后面加入&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;$ vi &amp;#x2F;var&amp;#x2F;opt&amp;#x2F;gitlab&amp;#x2F;postgresql&amp;#x2F;data&amp;#x2F;pg_hba.conf
local   all         all                               trust
host    all         all                               127.0.0.1&amp;#x2F;32 trust
host    all         all                               ::1&amp;#x2F;128 trust    #ipv6 可以不配置&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;2-重启gitlab生效&#34;&gt;&lt;strong&gt;2. 重启gitlab生效&lt;/strong&gt;&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;gitlab-ctl restart&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;3-修改gitlab账号为超级用户&#34;&gt;&lt;strong&gt;3. 修改gitlab账号为超级用户&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;进入postgresql命令行&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;cd &amp;#x2F;opt&amp;#x2F;gitlab&amp;#x2F;embedded&amp;#x2F;bin
su gitlab-psql
.&amp;#x2F;psql -h 127.0.0.1 gitlabhq_production&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;查看账户权限&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;\du&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;执行修改gitlab用户为超级权限&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;ALTER USER gitlab WITH SUPERUSER;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;退出&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;\q&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/08/0220210802135016.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h5 id=&#34;4-从1462989681编号备份中恢复&#34;&gt;4. 从1462989681编号备份中恢复&lt;/h5&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;gitlab-rake gitlab:backup:restore BACKUP&amp;#x3D;1462989681&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;这样Gitlab恢复数据就不会再报must be owner of extension plpgsql错误。&lt;/p&gt;
&lt;h4 id=&#34;4-重启gitlab&#34;&gt;&lt;strong&gt;4. 重启gitlab&lt;/strong&gt;&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;gitlab-ctl restart&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;13-Gitlab-Pages&#34;&gt;13. Gitlab Pages&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;官方文档：&lt;a href=&#34;https://docs.gitlab.com/ee/user/project/pages/&#34;&gt;https://docs.gitlab.com/ee/user/project/pages/&lt;/a&gt; 。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Gitlab Pages 使用 &lt;a href=&#34;https://gitlab.com/gitlab-org/gitlab-pages&#34;&gt;GitLab Pages daemon&lt;/a&gt; 服务，它是用 GO 语言实现的简单 HTTP 服务，并且可以监听外部 IP 地址以及为自定义域名和自定义证书提供支持。它通过 SNI 支持动态证书并且默认通过 HTTP2 协议发送页面。最后推荐你去看官方文档 &lt;a href=&#34;https://gitlab.com/gitlab-org/gitlab-pages/blob/master/README.md&#34;&gt;README&lt;/a&gt; 以便全面了解它的工作原理。&lt;/p&gt;
&lt;h3 id=&#34;启用-Pages&#34;&gt;启用 Pages&lt;/h3&gt;
&lt;p&gt;打开 &lt;code&gt;gitlab.rb&lt;/code&gt;：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-none&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;sudo vim &amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;gitlab.rb&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;修改 &lt;code&gt;Pages&lt;/code&gt; 配置：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# Pages 服务地址
pages_external_url &amp;quot;http:&amp;#x2F;&amp;#x2F;git.17lai.io&amp;quot;
# 启用 pages
gitlab_pages[&amp;#39;enable&amp;#39;] &amp;#x3D; true
# fails to start in Docker
gitlab_pages[&amp;#39;inplace_chroot&amp;#39;] &amp;#x3D; true&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;让 &lt;code&gt;Gitlab&lt;/code&gt; 使用当前配置：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;sudo gitlab-ctl reconfigure

# stdout
&amp;gt; gitlab Reconfigured!&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;如果没有域名怎么办呢？可以参考 &lt;a href=&#34;https://www.imooc.com/learn/634&#34;&gt;Linux智能DNS服务搭建之Bind服务&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id=&#34;使用-Pages&#34;&gt;使用 Pages&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;官方的案例库：&lt;a href=&#34;https://gitlab.com/pages&#34;&gt;https://gitlab.com/pages&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;用户文档&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一般有两种类型的Pages可以创建&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于用户（&lt;a href=&#34;http://username.example.io&#34;&gt;username.example.io&lt;/a&gt;）或组（&lt;a href=&#34;http://groupname.example.io&#34;&gt;groupname.example.io&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;对于Project（&lt;a href=&#34;http://username.example.io/projectname&#34;&gt;username.example.io/projectname&lt;/a&gt; 或 &lt;a href=&#34;http://groupname.example.io/projectname&#34;&gt;groupname.example.io/projectname&lt;/a&gt; ）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在GitLab中，usernames或groupnames是唯一的，我们经常把他们称为namespaces。在一个GitLab实例中只能有一个namespace。&lt;/p&gt;
&lt;p&gt;下面是Gitlab Pages类型、Project Name和 website URL对照表：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/0820220408205156.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;p&gt;GitLab Pages前提条件：&lt;/p&gt;
&lt;p&gt;简而言之，这是上传web站点到GitLab Pages需要的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Gitlab Pages使用的域名（向管理员询问）。&lt;/li&gt;
&lt;li&gt;创建一个Project。&lt;/li&gt;
&lt;li&gt;仓库的根目录放一个.gitlab-ci.yml，其中有个叫做pages的job。&lt;/li&gt;
&lt;li&gt;设置一个GitLab Runner构建web站点。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;部署简单的-html-项目&#34;&gt;部署简单的 html 项目&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;我们在自己的 &lt;code&gt;gitlab&lt;/code&gt; 上面创建一个测试项目：&lt;code&gt;plain-html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;把项目拉取到本地：&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-none&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;# 换成你自己的仓库地址
git clone git@git.17lai.io:pages&amp;#x2F;plain-html.git&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;ol&gt;
&lt;li&gt;在项目中新建 &lt;code&gt;public&lt;/code&gt; 目录，然后添加 &lt;code&gt;index.html&lt;/code&gt; 、 &lt;code&gt;style.css&lt;/code&gt; 文件:&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-markup&#34; data-language=&#34;markup&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-markup&#34;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset&amp;#x3D;&amp;quot;utf-8&amp;quot;&amp;gt;
    &amp;lt;meta name&amp;#x3D;&amp;quot;generator&amp;quot; content&amp;#x3D;&amp;quot;GitLab Pages&amp;quot;&amp;gt;
    &amp;lt;title&amp;gt;Plain HTML site using GitLab Pages&amp;lt;&amp;#x2F;title&amp;gt;
    &amp;lt;link rel&amp;#x3D;&amp;quot;stylesheet&amp;quot; href&amp;#x3D;&amp;quot;style.css&amp;quot;&amp;gt;
  &amp;lt;&amp;#x2F;head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div class&amp;#x3D;&amp;quot;navbar&amp;quot;&amp;gt;
      &amp;lt;a href&amp;#x3D;&amp;quot;https:&amp;#x2F;&amp;#x2F;pages.gitlab.io&amp;#x2F;plain-html&amp;#x2F;&amp;quot;&amp;gt;Plain HTML Example&amp;lt;&amp;#x2F;a&amp;gt;
      &amp;lt;a href&amp;#x3D;&amp;quot;https:&amp;#x2F;&amp;#x2F;gitlab.com&amp;#x2F;pages&amp;#x2F;plain-html&amp;#x2F;&amp;quot;&amp;gt;Repository&amp;lt;&amp;#x2F;a&amp;gt;
      &amp;lt;a href&amp;#x3D;&amp;quot;https:&amp;#x2F;&amp;#x2F;gitlab.com&amp;#x2F;pages&amp;#x2F;&amp;quot;&amp;gt;Other Examples&amp;lt;&amp;#x2F;a&amp;gt;
    &amp;lt;&amp;#x2F;div&amp;gt;

    &amp;lt;h1&amp;gt;Hello World!&amp;lt;&amp;#x2F;h1&amp;gt;

    &amp;lt;p&amp;gt;
      This is a simple plain-HTML website on GitLab Pages, without any fancy static site generator.
    &amp;lt;&amp;#x2F;p&amp;gt;
  &amp;lt;&amp;#x2F;body&amp;gt;
&amp;lt;&amp;#x2F;html&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-css&#34; data-language=&#34;css&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-css&#34;&gt;body &amp;#123;
  font-family: sans-serif;
  margin: auto;
  max-width: 1280px;
&amp;#125;

.navbar &amp;#123;
  background-color: #313236;
  border-radius: 2px;
  max-width: 800px;
&amp;#125;

.navbar a &amp;#123;
  color: #aaa;
  display: inline-block;
  font-size: 15px;
  padding: 10px;
  text-decoration: none;
&amp;#125;

.navbar a:hover &amp;#123;
  color: #ffffff;
&amp;#125;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;ol&gt;
&lt;li&gt;在项目根目录添加 &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; 文件：&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;# This file is a template, and might need editing before it works on your project.
# Full project: https:&amp;#x2F;&amp;#x2F;gitlab.com&amp;#x2F;pages&amp;#x2F;plain-html
pages:
  tags:
    - html
  stage: deploy
  script:
    - mkdir .public
    - cp -r * .public
    - mv .public public
  artifacts:
    paths:
      - public
  only:
    - master&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;ol&gt;
&lt;li&gt;提交代码：&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-none&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;git add .
git commit -m&amp;quot;feat(pages):  开启 pages 服务&amp;quot;
git push&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;最后我们回到 gitlab 服务，在 &lt;code&gt;plain-html&lt;/code&gt; 仓库中的 &lt;code&gt;Settings / pages&lt;/code&gt; 页面可以看到已经有对应的服务地址了：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/0820220408203643.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;gitlab 服务的域名跟 pages 的不要使用同一个，防止 XSS 攻击。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;管理员文档：&lt;a href=&#34;https://docs.gitlab.com/ce/administration/pages/&#34;&gt;https://docs.gitlab.com/ce/administration/pages/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用户文档：&lt;a href=&#34;https://docs.gitlab.com/ce/user/project/pages/index.html&#34;&gt;https://docs.gitlab.com/ce/user/project/pages/index.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gitlab pages：&lt;a href=&#34;https://pages.gitlab.io/&#34;&gt;https://pages.gitlab.io/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;Container-Registry&#34;&gt;Container Registry&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;官方文档：&lt;a href=&#34;https%25://docs.gitlab.com/ee/user/packages/container_registry/&#34;&gt;https://docs.gitlab.com/ee/user/packages/container_registry/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本节修改中&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;开启-Container-Registry&#34;&gt;开启 Container Registry&lt;/h3&gt;
&lt;p&gt;修改gitlab配置文件： vim /etc/gitlab/gitlab.rb&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&amp;#x2F;&amp;#x2F;外部访问地址，此处被nginx代理，暴露给外部访问
registry_external_url &amp;#39;http:&amp;#x2F;&amp;#x2F;xxx.com&amp;#39;
&amp;#x2F;&amp;#x2F;启用
gitlab_rails[&amp;#39;registry_enabled&amp;#39;] &amp;#x3D; true
&amp;#x2F;&amp;#x2F;registry 服务ip
gitlab_rails[&amp;#39;registry_host&amp;#39;] &amp;#x3D; &amp;quot;172.29.1.70&amp;quot;
&amp;#x2F;&amp;#x2F;registry 服务真正端口
gitlab_rails[&amp;#39;registry_port&amp;#39;] &amp;#x3D; &amp;quot;5000&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;这里需要注意的是，registry_external_url是外部访问的url，如docker需要pull和push，都是访问该路径。然后，刷新配置，重启：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;gitlab-ctl reconfigure
gitlab-ctl restart&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;访问Docker&#34;&gt;访问Docker&lt;/h3&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# docker login https:&amp;#x2F;&amp;#x2F;xxx.com -u root -p xxx
Login Succeeded&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;默认&lt;mark&gt;需要SSL&lt;/mark&gt;，请使用反向代理&lt;/p&gt;
&lt;p&gt;官方文档有说明，如果启用了双重验证（Two-Factor Authentication）则不应该输入密码，而是token：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;docker login xxx.com -u &amp;lt;username&amp;gt; -p &amp;lt;token&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;CI&#34;&gt;CI&lt;/h2&gt;
&lt;p&gt;GitLab Continuous Integration (GitLab CI/CD)&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;CI: Continuous Integration：持续集成。&lt;/li&gt;
&lt;li&gt;CD: Coninuous delivery and deployment：持续交付和部署。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gitlab CI/CD 是以可持续方法论进行软件开发的内建工具（&lt;a href=&#34;https://about.gitlab.com/gitlab-ci/&#34;&gt;continuous integration service&lt;/a&gt; ）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在使用 Gitlab CI 之前，我们需要先了解几个概念：&lt;/p&gt;
&lt;h3 id=&#34;Stage&#34;&gt;Stage&lt;/h3&gt;
&lt;p&gt;阶段：通俗的讲就是步骤（把一件事分解成多个步骤来完成）。 从最上面的图中可以看到在 &lt;code&gt;CI&lt;/code&gt; 中可能会有：&lt;code&gt;Build&lt;/code&gt;、&lt;code&gt;Unit Test&lt;/code&gt; 、&lt;code&gt;Integration Tests&lt;/code&gt; 等多个阶段。&lt;/p&gt;
&lt;h3 id=&#34;Job&#34;&gt;Job&lt;/h3&gt;
&lt;p&gt;任务：就是我们在每个阶段具体要做的事情，而一个阶段可能会有多个任务。&lt;/p&gt;
&lt;h3 id=&#34;Pipelines&#34;&gt;Pipelines&lt;/h3&gt;
&lt;p&gt;一条流水线 （ &lt;code&gt;pipeline&lt;/code&gt;）就是 &lt;strong&gt;一组&lt;/strong&gt; 在各个阶段执行的任务。在同一阶段的多个任务是可以并行的（如果 &lt;code&gt;Runner&lt;/code&gt; 足够多的话），当全部的任务都执行成功之后流水线将会进入下一个阶段。反之，如果其中有一个任务失败，流水线的下一个阶段将不再执行。&lt;/p&gt;
&lt;h3 id=&#34;Runners&#34;&gt;Runners&lt;/h3&gt;
&lt;p&gt;在 Gitlab CI 中，&lt;code&gt;Runner&lt;/code&gt; 负责运行定义在 &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; 中的代码。&lt;code&gt;Runner&lt;/code&gt; 为三种：&lt;code&gt;Shared Runners&lt;/code&gt;、&lt;code&gt;Group Runners&lt;/code&gt;、&lt;code&gt;Specific Runners&lt;/code&gt;，分别表示全局共用 Runner、组共用 Runner、单个项目指定的 Runner。&lt;/p&gt;
&lt;h3 id=&#34;gitlab-ci-yml&#34;&gt;.gitlab-ci.yml&lt;/h3&gt;
&lt;p&gt;Gitlab CI 的配置文件，该文件声明了流水线的结构和顺序，以任务为最小单元。&lt;/p&gt;
&lt;p&gt;文件中允许定义的元素：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#image&#34;&gt;&lt;code&gt;image&lt;/code&gt;&lt;/a&gt;：docker 镜像，当 Gitlab-Runner 的类型为 docker 时，会根据该属性指定的镜像为脚本执行容器。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#services&#34;&gt;&lt;code&gt;services&lt;/code&gt;&lt;/a&gt;: 指定另一个 docker 镜像，主要用于提供服务层的能力，比如 &lt;code&gt;mysql&lt;/code&gt; 。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#before_script-and-after_script&#34;&gt;&lt;code&gt;before_script&lt;/code&gt;&lt;/a&gt;：任务执行前的钩子事件，比如一个 node 项目，我们可以在这里安装依赖。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#before_script-and-after_script&#34;&gt;&lt;code&gt;after_script&lt;/code&gt;&lt;/a&gt;：任务执行后的钩子事件，当所有的任务都执行完毕之后被调用，不管任务是否执行成功。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#stages&#34;&gt;&lt;code&gt;stages&lt;/code&gt;&lt;/a&gt;：定义流水线中的阶段，默认的为 &lt;code&gt;build&lt;/code&gt; 、&lt;code&gt;test&lt;/code&gt;、&lt;code&gt;deploy&lt;/code&gt;。如果我们要在任务中指定其他的 &lt;code&gt;stage&lt;/code&gt;，则需要使用该属性先申明。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#cache&#34;&gt;&lt;code&gt;cache&lt;/code&gt;&lt;/a&gt;：需要缓存的文件，比如 node 项目可以把 node_modules 缓存起来。提示：可以定义在 &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; 顶级表示项目级别的，也可以申明在单个任务中。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#variables&#34;&gt;&lt;code&gt;variables&lt;/code&gt;&lt;/a&gt;：变量，同样可以在顶级或者单个任务中申明。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#pages&#34;&gt;&lt;code&gt;pages&lt;/code&gt;&lt;/a&gt;：内置的一个任务，用于上传任务执行的结果到 &lt;a href=&#34;https://docs.gitlab.com/ce/user/project/pages/index.html&#34;&gt;Gitlab Pages&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#include&#34;&gt;&lt;code&gt;include&lt;/code&gt;&lt;/a&gt;：合并其他的 &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; 文件配置。&lt;/li&gt;
&lt;li&gt;在单个任务中申明的元素：
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#script&#34;&gt;&lt;code&gt;script&lt;/code&gt;&lt;/a&gt;：需要执行的脚本。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#stage&#34;&gt;&lt;code&gt;stage&lt;/code&gt;&lt;/a&gt;：标识该任务所属的阶段。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#tags&#34;&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/a&gt;：为任务打上标签，用于选择特定的 &lt;code&gt;Runner&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#onlyexcept-basic&#34;&gt;&lt;code&gt;only&lt;/code&gt;&lt;/a&gt;：用于表明何时&lt;strong&gt;创建&lt;/strong&gt;该任务。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#onlyexcept-basic&#34;&gt;&lt;code&gt;except&lt;/code&gt;&lt;/a&gt;：用于表明何时&lt;strong&gt;不创建&lt;/strong&gt;该任务。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#when&#34;&gt;&lt;code&gt;when&lt;/code&gt;&lt;/a&gt;：用于表明何时&lt;strong&gt;运行&lt;/strong&gt;该任务。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#allow_failure&#34;&gt;&lt;code&gt;allow_failure&lt;/code&gt;&lt;/a&gt;：允许失败，该任务失败时不会影响整个流水线的结果。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#artifacts&#34;&gt;&lt;code&gt;artifacts&lt;/code&gt;&lt;/a&gt;：任务执行的结果，比如执行 &lt;code&gt;打包任务&lt;/code&gt; 后的产出资源。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#dependencies&#34;&gt;&lt;code&gt;dependencies&lt;/code&gt;&lt;/a&gt;：依赖的其他任务。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#retry&#34;&gt;&lt;code&gt;retry&lt;/code&gt;&lt;/a&gt;：当任务失败时最多重试的次数。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#coverage&#34;&gt;&lt;code&gt;coverage&lt;/code&gt;&lt;/a&gt;：指定如何从任务结果中提取代码覆盖率。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/ci/yaml/README.html#parallel&#34;&gt;&lt;code&gt;parallel&lt;/code&gt;&lt;/a&gt;：允许并行的任务实例个数。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;请注意版本问题，每个属性对版本的要求并不一致，具体的可以点击属性查看官方文档。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;使用-Gitlab-CI&#34;&gt;使用 Gitlab CI&lt;/h3&gt;
&lt;p&gt;使用 Gitlab CI 服务的两种方式： 1. &lt;a href=&#34;https://docs.gitlab.com/ce/topics/autodevops/index.html&#34;&gt;Auto DevOps&lt;/a&gt; 2. 手动配置 CI/CD&lt;/p&gt;
&lt;h4 id=&#34;Auto-DevOps&#34;&gt;&lt;a href=&#34;https://docs.gitlab.com/ce/topics/autodevops/index.html&#34;&gt;Auto DevOps&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Auto DevOps 是 Gitlab 11.0 推出的新功能，它提供了预定义的 CI/CD 配置，允许我们自动检测、构建、测试、发布以及监控应用。&lt;/p&gt;
&lt;p&gt;暂未使用，待补充。&lt;/p&gt;
&lt;h4 id=&#34;手动配置-CI-CD&#34;&gt;手动配置 CI/CD&lt;/h4&gt;
&lt;p&gt;手动配置主要就 2 个步骤，配置 &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; 文件，添加 Gitlab Runner 运行该文件。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;下面，我们看看如何配置 Gitlab Runner：&lt;/p&gt;
&lt;h4 id=&#34;Gitlab-Runner&#34;&gt;Gitlab Runner&lt;/h4&gt;
&lt;p&gt;Gitlab Runner 是一个开源项目，用来运行 &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; 中定义的任务并把结果返给 Gitlab。&lt;/p&gt;
&lt;h5 id=&#34;安装&#34;&gt;安装&lt;/h5&gt;
&lt;blockquote&gt;
&lt;p&gt;官方文档：&lt;a href=&#34;https://docs.gitlab.com/runner/install/linux-repository.html&#34;&gt;https://docs.gitlab.com/runner/install/linux-repository.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先，添加离线仓库：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-none&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;curl -L https:&amp;#x2F;&amp;#x2F;packages.gitlab.com&amp;#x2F;install&amp;#x2F;repositories&amp;#x2F;runner&amp;#x2F;gitlab-runner&amp;#x2F;script.deb.sh | sudo bash&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;然后，安装最新版本：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-none&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;sudo apt-get install gitlab-runner&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h5 id=&#34;注册&#34;&gt;注册&lt;/h5&gt;
&lt;blockquote&gt;
&lt;p&gt;官方文档：&lt;a href=&#34;https://docs.gitlab.com/runner/register/index.html&#34;&gt;https://docs.gitlab.com/runner/register/index.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先，我们进入要配置 Runner 的 Gitlab 仓库，在 &lt;code&gt;Settings -&amp;gt; CI / CD&lt;/code&gt; 页面展开 &lt;code&gt;Runners&lt;/code&gt; 配置面板可以看到已经分配的 Runner 以及注册 Runner 需要的参数：&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/0820220408170943.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后，我们使用 Gitlab-Runner 命名开始注册：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-none&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;gitlab-runner register&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;执行完会该命令，终端会有交互，要求我们输入以下参数：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;gitlab-ci coordinator url ：gitlab 服务地址&lt;/li&gt;
&lt;li&gt;gitlab-ci token：上图中的 token&lt;/li&gt;
&lt;li&gt;description：描述信息&lt;/li&gt;
&lt;li&gt;tags：标签，对应 &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; 任务中配置的 tags，只有 tags 匹配的任务才会被该 Runner 执行。&lt;/li&gt;
&lt;li&gt;executor：&lt;a href=&#34;https://docs.gitlab.com/runner/executors/README.html&#34;&gt;执行器&lt;/a&gt;，即任务脚本执行的环境&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;如果使用 docker 执行，则需要事先安装 &lt;a href=&#34;https://docs.docker.com/install/linux/docker-ce/ubuntu/&#34;&gt;Docker&lt;/a&gt; 环境。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;参数填写完毕之后，一个 Runner 便被注册成功了：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/0820220408170946.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;p&gt;我们回到 gitlab 仓库页面，然后刷新便可以看到 &lt;code&gt;_fzBq4PN&lt;/code&gt; 这个 Runner 已经被注册到该项目：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2022/04/0820220408170952.png&#34; alt=&#34;img&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我们可以点击 &lt;code&gt;编辑图标&lt;/code&gt; 对该 Runner 进行修改。我比较喜欢把 &lt;code&gt;Run untagged jobs&lt;/code&gt; 选项勾上，这样就不用每个任务都添加对应的 tags 了（因为现在涉及到的都是一些简单的流程）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;总结&#34;&gt;总结&lt;/h3&gt;
&lt;p&gt;首先，CI/CD 是一种软件开发流程，Gitlab CI/CD 是 Gitlab 为实现该流程而提供的一个内置工具（服务）。 其次，我们有 &lt;a href=&#34;https://docs.gitlab.com/ce/topics/autodevops/index.html&#34;&gt;Auto DevOps&lt;/a&gt; 与 &lt;code&gt;手动配置&lt;/code&gt; 两种方式使用，本文讲解的主要是 &lt;code&gt;手动配置&lt;/code&gt; 方式。&lt;/p&gt;
&lt;h2 id=&#34;加速Gitlab-Runner&#34;&gt;加速Gitlab Runner&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;gitlab runner构建镜像每次RUN 安装依赖包，都远程下载?可以缓存加速吗？ 可以的！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在将GitLab Runner注册到GitLab page上，让GitLab page可以和你的Runner通信时，有一步是填写使用的executor&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-none&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;输入Runner的executor：
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;如果你选择Docker作为Runner的executor，你还要选择默认的docker image来运行job(当然，你也可以在.gitlab-ci.yml里指明你需要用的image),这句话就跟文章使用gitlab-runner往k8s上发送curl命令实现pod中容器使用的镜像版本更新，地址： 开头讲述的那样，不过.gitlab-ci.yml里指明的image优先级高。&lt;/p&gt;
&lt;p&gt;注册完成后你可以在/etc/gitlab-runner里发现 config.toml文件，该文件是Runner的配置文件&lt;/p&gt;
&lt;p&gt;接下来就牵涉到一个重要的话题 —— Executor&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Shell Executor&lt;br&gt;
以宿主机作为Runner的所有jobs的执行器。Runner将会从远程仓库pull你的工程，工程的目录为：/builds。如果你使用了cache，那么cache将会存在/cache/。但是，它需要将构建所需的所有依赖手动安装到安装了Runner的同一台计算机上，比如使用到的git,jdk,maven,docekr等&lt;/li&gt;
&lt;li&gt;Docker Executor&lt;br&gt;
所有jobs的执行环境为指定的docker image所生成的container，每个job都会生成一个container并且在job结束后立即销毁。这个说的就是config.toml文件和.gitlab-ci.yml中指定的image&lt;br&gt;
Docker executor默认将所有的builds存储在/builds/(这里的路径是container里的路径，Runner配置文件config.toml里的build_dir字段可以重新指明build的目录，默认对应于宿主机的目录是在宿主机的docker volume下：/var/lib/docker/volumes//_data/)，默认将所有的caches存储在container里的/cache目录(config.toml里的cache_dir字段可以重新指明cache的目录)，注意build_dir和cache_dir指向的均是container里的目录，要想将container里的数据持久化，需要用到volumes字段，这个字段的使用和docker volume的使用是类似的，只需在config.toml的[runner.docker]部分添加volumes = [“/cache”, “:rw”]即可实现container里/cache目录数据的永久保存以及将host目录挂载到相应的container目录并具有读写的功能。比如：&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-none&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;# 仅作展示，未显示完整
[runners.docker]
  image &amp;#x3D; &amp;quot;jdd.io&amp;#x2F;jre:1.8.275&amp;quot;
  volumes &amp;#x3D; [&amp;quot;&amp;#x2F;cache&amp;quot;,&amp;quot;&amp;#x2F;run&amp;#x2F;docker.sock:&amp;#x2F;run&amp;#x2F;docker.sock&amp;quot;]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;当你使用docker 或 docker+machine executors时，你可以通过设置pull_policy来决定Runner如何pull docker image。pull_policy有三种值：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-none&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;always —— Runner始终从远程pull docker image。
if-not-present —— Runner会首先检查本地是否有该image，如果有则用本地的，如果没有则从远程拉取。
never —— Runner始终使用本地的image。&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：这一步就是本文开头提到的，使用本地镜像，不用再从dockerhub上拉取了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-none&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;# 仅作展示，未显示完整
[runners.docker]
  image &amp;#x3D; &amp;quot;jdd.io&amp;#x2F;jre:1.8.275&amp;quot;
  pull_policy&amp;#x3D;&amp;quot;if-not-present&amp;quot; # 添加这个选项就可以了
  volumes &amp;#x3D; [&amp;quot;&amp;#x2F;cache&amp;quot;,&amp;quot;&amp;#x2F;run&amp;#x2F;docker.sock:&amp;#x2F;run&amp;#x2F;docker.sock&amp;quot;]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;当你使用docker, docker+machine 或 kubernetes作为executor时，GitLab Runner将会使用特定的container来处理Git、artifacts 和cache 操作。&lt;/p&gt;
&lt;h2 id=&#34;权限管理&#34;&gt;权限管理&lt;/h2&gt;
&lt;p&gt;以管理员的身份登入gitlab，点击Settings，然后选择Members，可以通过输入名字选择要分配权限的小组成员，然后分配角色，选择权限有效时间，点击Add to Project就把人员拉近到项目中。&lt;/p&gt;
&lt;p&gt;GitLab的角色有以下四种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Guest：可以创建issue、发表评论，不能读写版本库&lt;/li&gt;
&lt;li&gt;Reporter：可以克隆代码，不能提交，可以赋予测试、产品经理此权限&lt;/li&gt;
&lt;li&gt;Developer：可以克隆代码、开发、提交、push，可以赋予开发人员此权限&lt;/li&gt;
&lt;li&gt;MainMaster：可以创建项目、添加tag、保护分支、添加项目成员、编辑项目，一般GitLab管理员或者CTO才有此权限&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;访问权限 - Visibility Level：&lt;/p&gt;
&lt;p&gt;这个是在建立项目时就需要选定的，主要用于决定哪些人可以访问此项目，包含3种&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Private - 私有，只有属于该项目成员才有原先查看&lt;/li&gt;
&lt;li&gt;Internal - 内部，用个Gitlab账号的人都可以clone&lt;/li&gt;
&lt;li&gt;Public - 公开，任何人可以clone&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;性能优化&#34;&gt;性能优化&lt;/h2&gt;
&lt;p&gt;为GitLab EE Docker版本配置以减少CPU占用，需要同时从&lt;strong&gt;容器资源分配&lt;/strong&gt;和&lt;strong&gt;GitLab内部服务调优&lt;/strong&gt;两个层面入手。关键在于理解：&lt;strong&gt;&lt;code&gt;gitlab.rb&lt;/code&gt;是GitLab服务自身的配置文件，而&lt;code&gt;docker-compose&lt;/code&gt;参数是控制容器运行时资源上限的约束&lt;/strong&gt;。两者需协同配置，缺一不可。&lt;/p&gt;
&lt;p&gt;以下是完整的配置方法与操作教程。&lt;/p&gt;
&lt;h3 id=&#34;核心原则：分层优化策略&#34;&gt;** 核心原则：分层优化策略**&lt;/h3&gt;
&lt;p&gt;CPU占用过高通常由两方面导致：一是分配给Docker容器的物理资源（CPU核心数）不足，导致资源竞争；二是GitLab内部服务（如Unicorn、Sidekiq、PostgreSQL）的默认配置不适合当前硬件规模，造成进程过多或计算资源浪费。因此，优化应遵循以下步骤：&lt;br&gt;
1.&lt;strong&gt;容器层&lt;/strong&gt;：通过&lt;code&gt;docker-compose.yml&lt;/code&gt;的&lt;code&gt;deploy.resources.limits&lt;/code&gt;参数，为容器设定合理的CPU和内存使用上限，防止其无节制地消耗宿主机资源。&lt;br&gt;
2.&lt;strong&gt;应用层&lt;/strong&gt;：进入容器内部，修改&lt;code&gt;/etc/gitlab/gitlab.rb&lt;/code&gt;文件，对GitLab的各个高消耗组件进行精细化调优，减少不必要的进程和内存开销，从而间接降低CPU负载。&lt;/p&gt;
&lt;h3 id=&#34;Docker-Compose层面：限制容器资源&#34;&gt;&lt;strong&gt;Docker-Compose层面：限制容器资源&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;在您的&lt;code&gt;docker-compose.yml&lt;/code&gt;文件中，必须为GitLab服务定义资源限制。这是控制CPU占用的第一道防线。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-yaml&#34; data-language=&#34;yaml&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;version: &amp;#39;3.8&amp;#39;
services:
gitlab:
image: gitlab&amp;#x2F;gitlab-ee:latest
container_name: gitlab
restart: unless-stopped
hostname: &amp;#39;gitlab.yourdomain.com&amp;#39;
# --- 核心资源限制配置开始 ---
deploy:
resources:
limits:
cpus: &amp;#39;4.0&amp;#39;# 关键：将容器使用的CPU核心数限制在4核。请根据您宿主机总核心数调整（例如8核主机分配4核）。
memory: 8G# 关键：限制容器最大内存为8GB。充足的内存可以减少Swap使用，避免因内存交换导致CPU飙升。
reservations:
memory: 4G# 为容器预留4GB内存，确保其启动和基本运行。
# --- 核心资源限制配置结束 ---
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url &amp;#39;http:&amp;#x2F;&amp;#x2F;gitlab.yourdomain.com&amp;#39;
# 其他gitlab.rb配置也可通过此处注入，但复杂配置建议在容器内修改文件。
ports:
- &amp;quot;80:80&amp;quot;
- &amp;quot;443:443&amp;quot;
- &amp;quot;2222:22&amp;quot;
volumes:
- &amp;#39;.&amp;#x2F;config:&amp;#x2F;etc&amp;#x2F;gitlab&amp;#39;
- &amp;#39;.&amp;#x2F;logs:&amp;#x2F;var&amp;#x2F;log&amp;#x2F;gitlab&amp;#39;
- &amp;#39;.&amp;#x2F;data:&amp;#x2F;var&amp;#x2F;opt&amp;#x2F;gitlab&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;配置说明&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cpus: &#39;4.0&#39;&lt;/code&gt;：此设置直接限制了该容器最多只能使用相当于4个CPU核心的计算能力。如果宿主机是8核，这意味着一半的资源被划定给GitLab，防止它占用全部CPU。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;memory: 8G&lt;/code&gt;：内存限制同样重要。根据经验，对于中小团队（50人以下），8GB内存是一个推荐的起点。内存不足会触发系统使用Swap，导致磁盘I/O增加，进而引发CPU等待和负载升高。&lt;/li&gt;
&lt;li&gt;修改后，执行 &lt;code&gt;docker-compose down&lt;/code&gt; 然后 &lt;code&gt;docker-compose up -d&lt;/code&gt; 使配置生效。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;GitLab应用层面：优化-etc-gitlab-gitlab-rb&#34;&gt;** GitLab应用层面：优化 &lt;code&gt;/etc/gitlab/gitlab.rb&lt;/code&gt;**&lt;/h3&gt;
&lt;p&gt;这是降低CPU占用的&lt;strong&gt;关键步骤&lt;/strong&gt;。您需要进入容器内部修改配置文件，并应用配置。&lt;/p&gt;
&lt;p&gt;1.&lt;strong&gt;进入容器并编辑配置文件&lt;/strong&gt;：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 进入正在运行的GitLab容器
docker exec -it gitlab &amp;#x2F;bin&amp;#x2F;bash

# 备份原始配置文件
cp &amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;gitlab.rb &amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;gitlab.rb.bak

# 使用vim编辑配置文件（容器内通常已安装）
vim &amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;gitlab.rb&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;2.&lt;strong&gt;添加或修改以下核心优化参数&lt;/strong&gt;：在&lt;code&gt;gitlab.rb&lt;/code&gt;文件中找到相应位置，取消注释并修改为以下值。这些设置旨在减少并发进程数和后台任务负载，特别适用于资源有限的环境。&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ruby&#34; data-language=&#34;ruby&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ruby&#34;&gt;### 1. 优化Unicorn (GitLab Rails应用服务器)
# 减少工作进程数量。默认值可能过高。对于2-4核CPU的容器，设为2是一个安全的起点。
unicorn[&amp;#39;worker_processes&amp;#39;] &amp;#x3D; 2
# 可选：设置每个工作进程的内存限制，防止单个进程失控。
unicorn[&amp;#39;worker_memory_limit_min&amp;#39;] &amp;#x3D; &amp;quot;200 * 1 &amp;lt;&amp;lt; 20&amp;quot; # 200MB
unicorn[&amp;#39;worker_memory_limit_max&amp;#39;] &amp;#x3D; &amp;quot;300 * 1 &amp;lt;&amp;lt; 20&amp;quot; # 300MB

### 2. 优化Sidekiq (后台作业处理器)
# 降低并发线程数。默认值可能为25，这对于小型部署过高。
sidekiq[&amp;#39;concurrency&amp;#39;] &amp;#x3D; 10

### 3. 优化PostgreSQL (数据库)
# 减少共享缓冲区大小。在容器内存有限的情况下，过大的设置会挤占其他进程内存。
postgresql[&amp;#39;shared_buffers&amp;#39;] &amp;#x3D; &amp;quot;256MB&amp;quot;
# 减少最大工作进程数。
postgresql[&amp;#39;max_worker_processes&amp;#39;] &amp;#x3D; 4

### 4. 关闭非必需的服务（强力降低CPU&amp;#x2F;内存开销）
# 禁用Prometheus监控、节点导出器（除非您需要详细的容器级监控）
prometheus[&amp;#39;enable&amp;#39;] &amp;#x3D; false
prometheus_monitoring[&amp;#39;enable&amp;#39;] &amp;#x3D; false
node_exporter[&amp;#39;enable&amp;#39;] &amp;#x3D; false
redis_exporter[&amp;#39;enable&amp;#39;] &amp;#x3D; false
postgres_exporter[&amp;#39;enable&amp;#39;] &amp;#x3D; false
gitlab_exporter[&amp;#39;enable&amp;#39;] &amp;#x3D; false

# 如果不需要，可以禁用Elasticsearch搜索（这是一个资源消耗大户）
# elasticsearch[&amp;#39;enable&amp;#39;] &amp;#x3D; false&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;参数原理&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;unicorn[&#39;worker_processes&#39;]&lt;/code&gt;：每个Unicorn进程都会处理HTTP请求。进程数越多，并发能力越强，但CPU和内存开销也线性增长。将其从默认值（如4）降低到2，可以立即减少CPU占用。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sidekiq[&#39;concurrency&#39;]&lt;/code&gt;：控制后台任务（如发送邮件、处理CI流水线）的并行度。降低此值可以减少数据库连接数和CPU竞争。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postgresql[&#39;shared_buffers&#39;]&lt;/code&gt;：是数据库缓存。在内存受限的容器中，设置过大（如按物理内存25%计算的几个GB）会导致内存紧张，触发系统交换和CPU高负载。将其设置为一个较小的固定值（如256MB）更安全。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关闭监控组件&lt;/strong&gt;：对于私有化部署的小型团队，内置的Prometheus及其一系列exporter会持续消耗约10-15%的CPU和数百MB内存。禁用它们是立竿见影的减负方法。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3.&lt;strong&gt;应用配置并重启服务&lt;/strong&gt;：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 在容器内执行，使新的gitlab.rb配置生效
gitlab-ctl reconfigure
# 重启GitLab服务
gitlab-ctl restart
# 退出容器
exit&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;验证优化效果与监控&#34;&gt;** 验证优化效果与监控**&lt;/h3&gt;
&lt;p&gt;完成上述配置后，需要进行验证。&lt;/p&gt;
&lt;p&gt;1.&lt;strong&gt;观察容器资源使用&lt;/strong&gt;：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;# 在宿主机上执行，查看容器的CPU和内存使用率
docker stats gitlab&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;您应该看到&lt;code&gt;CPU %&lt;/code&gt;和&lt;code&gt;MEM USAGE&lt;/code&gt;被限制在您设定的&lt;code&gt;limits&lt;/code&gt;附近。&lt;/p&gt;
&lt;p&gt;2.&lt;strong&gt;检查GitLab内部状态&lt;/strong&gt;：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;docker exec gitlab gitlab-ctl status&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;确保所有服务（如&lt;code&gt;unicorn&lt;/code&gt;，&lt;code&gt;sidekiq&lt;/code&gt;，&lt;code&gt;postgresql&lt;/code&gt;）都处于&lt;code&gt;run&lt;/code&gt;状态。&lt;/p&gt;
&lt;p&gt;3.&lt;strong&gt;进行压力测试（可选）&lt;/strong&gt;：尝试进行一些Git操作（如&lt;code&gt;git clone&lt;/code&gt;、&lt;code&gt;git push&lt;/code&gt;）并访问Web界面，观察响应速度是否可接受。您可以使用&lt;code&gt;top&lt;/code&gt;或&lt;code&gt;htop&lt;/code&gt;命令在宿主机上观察整体CPU负载是否已下降。&lt;/p&gt;
&lt;h3 id=&#34;总结与进阶建议&#34;&gt;&lt;strong&gt;总结与进阶建议&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;配置位置关系&lt;/strong&gt;：&lt;code&gt;docker-compose&lt;/code&gt;的&lt;code&gt;limits&lt;/code&gt;是&lt;strong&gt;天花板&lt;/strong&gt;，设定了容器能使用的资源最大值；&lt;code&gt;gitlab.rb&lt;/code&gt;的调优是在这个天花板下，安排&lt;strong&gt;各个服务如何更高效、更节省地使用这些资源&lt;/strong&gt;。两者必须配合使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;循序渐进&lt;/strong&gt;：性能调优是一个迭代过程。建议每次只修改1-2个参数，观察效果后再进行下一步调整。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;监控先行&lt;/strong&gt;：如果条件允许，在调优前建立简单的监控（如使用&lt;code&gt;docker stats&lt;/code&gt;日志），以便量化调优效果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;备份配置&lt;/strong&gt;：在修改&lt;code&gt;gitlab.rb&lt;/code&gt;和&lt;code&gt;docker-compose.yml&lt;/code&gt;前，务必进行备份，以便在出现问题时快速回滚。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过上述容器层与应用层的双重配置，您可以有效控制GitLab EE Docker版本的CPU占用率，在保证核心功能可用的前提下，实现服务器资源的合理利用。&lt;/p&gt;
&lt;h2 id=&#34;参考链接：&#34;&gt;参考链接：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cnblogs.com/hgzero/p/14088215.html&#34;&gt;https://www.cnblogs.com/hgzero/p/14088215.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.51blogs.net/2017/11/10/1110113243.html&#34;&gt;http://www.51blogs.net/2017/11/10/1110113243.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://my.oschina.net/u/2400083/blog/808097&#34;&gt;https://my.oschina.net/u/2400083/blog/808097&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;系列教程&#34;&gt;&lt;strong&gt;系列教程&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;全部文章RSS订阅&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&#34;Gitlab-使用系列&#34;&gt;&lt;strong&gt;Gitlab 使用系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/gitlab/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;Gitlab RSS 分类订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/acc13b70/&#34;&gt;&lt;strong&gt;Gitlab的安装及使用教程完全版&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/29a820b3/&#34;&gt;破解Gitlab EE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d08eb7b/&#34;&gt;Gitlab的安装及使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/1879721e/&#34;&gt;CI/CD与Git Flow与GitLab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;Devops系列&#34;&gt;&lt;strong&gt;Devops系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/devops/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;Devops 分类 RSS 订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ab63eb8f/&#34;&gt;自建全套开源Devops开发系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d32a07a7/&#34;&gt;Git介绍以及分支模型图解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/39563241/&#34;&gt;三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/3437994a/&#34;&gt;DevOps系列—【Jenkinsfile+Dockerfile+nginx+vue】&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/f4c3ad41/&#34;&gt;项目开发管理工具推荐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/acc13b70/&#34;&gt;Gitlab的安装及使用教程完全版&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d08eb7b/&#34;&gt;Gitlab的安装及使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/78c3371/&#34;&gt;那些有用的Github工具介绍！Action、app、workflow等&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;项目管理系列&#34;&gt;&lt;strong&gt;项目管理系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/ai/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;AI 分类 RSS 订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d8b1e381/&#34;&gt;如何做一个完整的硬件项目的项目管理之简明教程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ca630feb/&#34;&gt;几种常用管理模型和方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ac0df556/&#34;&gt;PMBOK指南（第6版）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/99be6dfb/&#34;&gt;如何做好竞品分析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/a6477052/&#34;&gt;一大堆寓意深刻的管理故事锦集&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ec34b111/&#34;&gt;人格类型分类总结归纳&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;link rel=&#34;stylesheet&#34; href=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10/dist/style.css&#34;&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/d3@7&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-view@0.18.10&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10&#34;&gt;&lt;/script&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;/css/markmap.css&#34;&gt;

&lt;script src=&#34;/js/markmap.js&#34;&gt;&lt;/script&gt;
</content>
        <category term="gitlab" />
        <category term="git" />
        <category term="docker" />
        <category term="registry" />
        <category term="教程" />
        <category term="email" />
        <category term="https" />
        <category term="ssl" />
        <updated>2021-08-02T08:25:00.000Z</updated>
    </entry>
    <entry>
        <id>https://blog.17lai.site/posts/d08eb7b/</id>
        <title>Gitlab的安装及使用</title>
        <link rel="alternate" href="https://blog.17lai.site/posts/d08eb7b/"/>
        <content type="html">&lt;h2 id=&#34;Gitlab概述&#34;&gt;Gitlab概述&lt;/h2&gt;
&lt;h3 id=&#34;1-1-GitLab介绍&#34;&gt;1.1 GitLab介绍&lt;/h3&gt;
&lt;p&gt;GitLab是利用Ruby on Rails一个开源的版本管理系统，实现一个自托管的Git项目仓库，可通过Web界面进行访问公开的或者私人项目。&lt;/p&gt;
&lt;p&gt;GitLab能够浏览源代码，管理缺陷和注释。可以管理团队对仓库的访问，它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。&lt;/p&gt;
&lt;p&gt;它还提供一个代码片段收集功能可以轻松实现代码复用，便于日后有需要的时候进行查找&lt;/p&gt;
&lt;h3 id=&#34;1-2-Gitlab服务构成&#34;&gt;1.2 Gitlab服务构成&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Nginx：静态web服务器。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gitlab-shell：用于处理Git命令和修改authorized keys列表。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gitlab-workhorse: 轻量级的反向代理服务器。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;logrotate：日志文件管理工具。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;postgresql：数据库。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;redis：缓存数据库。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;sidekiq：用于在后台执行队列任务（异步执行）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;unicorn：An HTTP server for Rack applications，GitLab Rails应用是托管在这个服务器上面的。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1-3-Gitlab工作流程&#34;&gt;1.3 Gitlab工作流程&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222044.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;1-4-GitLab-Shell&#34;&gt;1.4 GitLab Shell&lt;/h3&gt;
&lt;p&gt;GitLab Shell有两个作用：为GitLab处理Git命令、修改authorized keys列表&lt;/p&gt;
&lt;p&gt;当通过SSH访问GitLab Server时，GitLab Shell会：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;限制执行预定义好的Git命令（git push，git pull，git annex）&lt;/li&gt;
&lt;li&gt;调用GitLab Rails API检查权限&lt;/li&gt;
&lt;li&gt;执行pre-receive钩子（在企业版中叫做Git钩子）&lt;/li&gt;
&lt;li&gt;执行用户请求的动作，处理GitLab的post-receive动作&lt;/li&gt;
&lt;li&gt;处理自定义的post-receive动作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当通过http(s)访问GitLab Server时，工作流程取决于你是从Git仓库拉取(pull)代码还是向git仓库推送(push)代码：&lt;/p&gt;
&lt;p&gt;如果是从Git仓库拉取(pull)代码，GitLab Rails应用会全权负责处理用户鉴权和执行Git命令的工作&lt;/p&gt;
&lt;p&gt;如果是向Git仓库推送(push)代码，GitLab Rails应用既不会进行用户鉴权也不会执行Git命令，它会把以下工作交由GitLab Shell进行处理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;调用GitLab Rails API 检查权限&lt;/li&gt;
&lt;li&gt;执行pre-receive钩子（在GitLab企业版中叫做Git钩子）&lt;/li&gt;
&lt;li&gt;执行你请求的动作&lt;/li&gt;
&lt;li&gt;处理GitLab的post-receive动作&lt;/li&gt;
&lt;li&gt;处理自定义的post-receive动作&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1-5-GitLab-Workhorse&#34;&gt;1.5 GitLab Workhorse&lt;/h3&gt;
&lt;p&gt;GitLab Workhorse是一个敏捷的反向代理。它会处理一些大的HTTP请求，比如文件上传、文件下载、Git push/pull和Git包下载。其它请求会反向代理到GitLab Rails应用，即反向代理给后端的unicorn。&lt;/p&gt;
&lt;h2 id=&#34;Gitlab的安装部署&#34;&gt;Gitlab的安装部署&lt;/h2&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Gitlab要求服务器内存2G以上&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-1-方式一-下载gitlab-ce的rpm包&#34;&gt;2.1 方式一:下载gitlab-ce的rpm包&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://packages.gitlab.com/gitlab/gitlab-ce&#34;&gt;gitlab官方rpm包下载&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/&#34;&gt;清华的源&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;将对应版本的gitlab-ce下载到本地后，直接yum安装即可&lt;/p&gt;
&lt;h4 id=&#34;要先将这个rpm包下载到本地&#34;&gt;要先将这个rpm包下载到本地&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;yum install -y gitlab-ce-13.6.1-ce.0.el7.x86_64.rpm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-2-方式二-配置yum源&#34;&gt;2.2 方式二:配置yum源&lt;/h3&gt;
&lt;p&gt;在 /etc/yum.repos.d/ 下新建 gitlab-ce.repo，写入如下内容：&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ruby&#34; data-language=&#34;ruby&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ruby&#34;&gt;[gitlab-ce]
name&amp;#x3D;gitlab-ce
baseurl&amp;#x3D;https:&amp;#x2F;&amp;#x2F;mirrors.tuna.tsinghua.edu.cn&amp;#x2F;gitlab-ce&amp;#x2F;yum&amp;#x2F;el7&amp;#x2F; Repo_gpgcheck&amp;#x3D;0
Enabled&amp;#x3D;1 Gpgkey&amp;#x3D;https:&amp;#x2F;&amp;#x2F;packages.gitlab.com&amp;#x2F;gpg.key&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;然后创建cache，再直接安装gitlab-ce&lt;/p&gt;
&lt;p&gt;yum makecache  # 这一步会创建大量的数据&lt;/p&gt;
&lt;h4 id=&#34;直接安装最新版&#34;&gt;直接安装最新版&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;yum install -y gitlab-ce # 如果要安装指定的版本，在后面填上版本号即可
yum install -y  gitlab-ce-13.6.1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;如果安装时出现gpgkey验证错误，只需在安装时明确指明不进行gpgkey验证&#34;&gt;如果安装时出现gpgkey验证错误，只需在安装时明确指明不进行gpgkey验证&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;yum install gitlab-ce -y --nogpgcheck&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-3-gitlab的配置&#34;&gt;2.3 gitlab的配置&lt;/h3&gt;
&lt;p&gt;配置文件位置  /etc/gitlab/gitlab.rb&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;[root@centos7 test]# vim &amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;gitlab.rb
[root@centos7 test]# grep &amp;quot;^[a-Z]&amp;quot; &amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;gitlab.rb
external_url &amp;#39;http:&amp;#x2F;&amp;#x2F;10.0.0.51&amp;#39;  # 这里一定要加上http:&amp;#x2F;&amp;#x2F;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;配置邮件服务&#34;&gt;配置邮件服务&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ruby&#34; data-language=&#34;ruby&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ruby&#34;&gt;gitlab_rails[&amp;#39;smtp_enable&amp;#39;] &amp;#x3D; true
gitlab_rails[&amp;#39;smtp_address&amp;#39;] &amp;#x3D; &amp;quot;smtp.qq.com&amp;quot; gitlab_rails[&amp;#39;smtp_port&amp;#39;] &amp;#x3D; 25 gitlab_rails[&amp;#39;smtp_user_name&amp;#39;] &amp;#x3D; &amp;quot;hgzerowzh@qq.com&amp;quot;  # 自己的qq邮箱账号
gitlab_rails[&amp;#39;smtp_password&amp;#39;] &amp;#x3D; &amp;quot;xxx&amp;quot;  # 开通smtp时返回的授权码
gitlab_rails[&amp;#39;smtp_domain&amp;#39;] &amp;#x3D; &amp;quot;qq.com&amp;quot; gitlab_rails[&amp;#39;smtp_authentication&amp;#39;] &amp;#x3D; &amp;quot;login&amp;quot; gitlab_rails[&amp;#39;smtp_enable_starttls_auto&amp;#39;] &amp;#x3D; true
gitlab_rails[&amp;#39;smtp_tls&amp;#39;] &amp;#x3D; false
gitlab_rails[&amp;#39;gitlab_email_from&amp;#39;] &amp;#x3D; &amp;quot;hgzerowzh@qq.com&amp;quot;  # 指定发送邮件的邮箱地址
user[&amp;quot;git_user_email&amp;quot;] &amp;#x3D; &amp;quot;shit@qq.com&amp;quot;   # 指定接收邮件的邮箱地址&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;修改好配置文件后，要使用 gitlab-ctl reconfigure 命令重载一下配置文件，否则不生效。&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-none&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;gitlab-ctl reconfigure # 重载配置文件&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;2-4-Gitlab常用命令&#34;&gt;2.4 Gitlab常用命令&lt;/h3&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ruby&#34; data-language=&#34;ruby&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ruby&#34;&gt;gitlab-ctl start         # 启动所有 gitlab 组件
gitlab-ctl stop          # 停止所有 gitlab 组件
gitlab-ctl restart       # 重启所有 gitlab 组件
gitlab-ctl status        # 查看服务状态
gitlab-ctl reconfigure   # 启动服务
gitlab-ctl show-config   # 验证配置文件
gitlab-ctl tail          # 查看日志
gitlab-rake gitlab:check SANITIZE&amp;#x3D;true --trace    # 检查gitlab
vim &amp;#x2F;etc&amp;#x2F;gitlab&amp;#x2F;gitlab.rb # 修改默认的配置文件&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;Gitlab的使用&#34;&gt;Gitlab的使用&lt;/h2&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Gitlab安装好后，设置密码，管理账户为root&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-1-创建Group&#34;&gt;&lt;strong&gt;3.1 创建Group&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;填上组名即可，这里组名为java&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222105.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211347.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-2-创建User&#34;&gt;&lt;strong&gt;3.2 创建User&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;创建四个User：pm、dev1、dev2、dev3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222131.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222120.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-3-添加User到Group中并授权&#34;&gt;&lt;strong&gt;3.3 添加User到Group中并授权&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222140.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-4-创建Project并配置SSH&#34;&gt;&lt;strong&gt;3.4 创建Project并配置SSH&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222147.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222154.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222201.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528222233.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-5-在项目中添加成员&#34;&gt;&lt;strong&gt;3.5 在项目中添加成员&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211335.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211726.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-6-将本地文件推送到Gitlab&#34;&gt;3.6 将本地文件推送到Gitlab&lt;/h3&gt;
&lt;h4 id=&#34;将app01项目克隆下来&#34;&gt;将app01项目克隆下来&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;git clone git@10.0.0.51:java&amp;#x2F;app01.git # 初始化配置
git config --global user.name &amp;quot;hgzero&amp;quot; git config --global user.email &amp;quot;hgzero@qq.com&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;在app01目录下新建一些文件&#34;&gt;在app01目录下新建一些文件&lt;/h4&gt;
&lt;h4 id=&#34;推送到gitlab&#34;&gt;推送到gitlab&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;git add .
git commit -m &amp;quot;first edition&amp;quot; git push origin master&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211546.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;制定开发计划&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&#34;4-1-创建开发计划&#34;&gt;&lt;strong&gt;4.1 创建开发计划&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;项目：app01&lt;/li&gt;
&lt;li&gt;版本：v1.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211325.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-2-创建里程碑Milestones&#34;&gt;&lt;strong&gt;4.2 创建里程碑Milestones&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用pm账号登录gitlab后操作（先要在admin中设置pm账号的密码）&lt;/li&gt;
&lt;li&gt;要根据开发计划来创建Milestones&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211538.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211719.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211315.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211303.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-3-根据开发计划创建issue&#34;&gt;4.3 根据开发计划创建issue&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;创建4个issue，分派给dev1和dev2这两个开发人员&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211529.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211304.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211711.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211520.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211514.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211252.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-4-开发者登录账号查看分派的任务&#34;&gt;**4.4 开发者登录账号查看分派的任务 **&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;然后开发dev1登录gitlab，就能看到任务已经分配过来了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211513.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-5-开发流程&#34;&gt;&lt;strong&gt;4.5 开发流程&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;公司里的开发开始任务&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;1-先从仓库把项目拉下来&#34;&gt;1. 先从仓库把项目拉下来&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;git clone git@10.0.0.51:java&amp;#x2F;app01.git
cd app01&amp;#x2F;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;2-先创建一个自己的分支，然后进行开发&#34;&gt;2.先创建一个自己的分支，然后进行开发&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;git checkout -b index   # 创建一个叫index的分支，并切换到这个分支
git status # 3. 开始开发首页
echo &amp;quot;&amp;lt;h1&amp;gt;welcome to this app&amp;lt;&amp;#x2F;h1&amp;gt;&amp;quot; &amp;gt; index.html  # 假设就开发了一个index页面&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;4-开发完成后，把项目传到仓库&#34;&gt;4. 开发完成后，把项目传到仓库&lt;/h2&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;git add .
git commit -m &amp;quot;index&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;如果写成-git-commit-m-“close-2”-，则表示merge请求允许且merge成功之后，自动删除编号为-2的issue&#34;&gt;如果写成 git commit -m “close #2” ，则表示merge请求允许且merge成功之后，自动删除编号为#2的issue&lt;/h4&gt;
&lt;h4 id=&#34;传到index分支&#34;&gt;传到index分支&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;git push origin index&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;4-6-合并分支&#34;&gt;&lt;strong&gt;4.6 合并分支&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1）开发dev1发送合并分支请求给pm&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211242.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211503.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211701.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2）pm收到开发的Merge请求后进行处理&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用pm登录，就可以看到pm已经收到了合并请求merge request&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211231.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211502.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211647.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211221.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3）开发dev1确认任务完成&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;退出pm账户，登入dev1账户：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211220.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;或者点进去后，在侧边栏进行标识Done，然后已经完成的issue，可以将其Close&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211454.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这个时候Milestones的进度已经往前进了一些了：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211446.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-7-开发其他功能&#34;&gt;4.7 开发其他功能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;然后其他开发者或者自己再次进行开发时，先要把刚刚更新后的内容（master主干）拉回来，然后再进行开发&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;git checkout master  # 切换到master
git pull             # 从远端仓库拉取数据&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;然后再进行其他操作&lt;/p&gt;
&lt;h2 id=&#34;Gitlab备份恢复&#34;&gt;Gitlab备份恢复&lt;/h2&gt;
&lt;hr&gt;
&lt;h3 id=&#34;5-1-备份gitlab&#34;&gt;5.1 备份gitlab&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1）修改配置文件&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;/etc/gitlab/gitlab.rb&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;备份保存的位置，这里是默认位置，可修改成指定的位置&#34;&gt;备份保存的位置，这里是默认位置，可修改成指定的位置&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ruby&#34; data-language=&#34;ruby&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ruby&#34;&gt;gitlab_rails[&amp;#39;backup_path&amp;#39;] &amp;#x3D; &amp;quot;&amp;#x2F;var&amp;#x2F;opt&amp;#x2F;gitlab&amp;#x2F;backups&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;设置备份保存的时间，超过此时间的日志将会被新覆盖&#34;&gt;设置备份保存的时间，超过此时间的日志将会被新覆盖&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ruby&#34; data-language=&#34;ruby&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ruby&#34;&gt;gitlab_rails[&amp;#39;backup_keep_time&amp;#39;] &amp;#x3D; 604800  # 这里是默认设置，保存7天&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;特别注意：-如果自定义了备份保存位置，则要修改备份目录的权限，比如：-chown-R-git-git-data-backup-gitlab&#34;&gt;特别注意： # 如果自定义了备份保存位置，则要修改备份目录的权限，比如： # chown -R git.git /data/backup/gitlab&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;配置完成后要重启以使配置生效&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;重读配置文件&#34;&gt;重读配置文件&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ruby&#34; data-language=&#34;ruby&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ruby&#34;&gt;gitlab-ctl reconfigure # 重启gitlab
gitlab-ctl restart&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;2）设置定时任务&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;每天凌晨2点定时创建备份-将一下内容写入到定时任务中-crontab-e&#34;&gt;每天凌晨2点定时创建备份 # 将一下内容写入到定时任务中 crontab -e&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;0 2 * * * &amp;#x2F;usr&amp;#x2F;bin&amp;#x2F;gitlab-rake gitlab:backup:create # 备份策略建议： # 本地保留3到7天，在异地备份永久保存&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;3）备份时间的识别&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;备份后的文件类似这样的形式：1494170842-gitlab-backup-tar，可以根据前面的时间戳确认备份生成的时间&#34;&gt;备份后的文件类似这样的形式：1494170842_gitlab_backup.tar，可以根据前面的时间戳确认备份生成的时间&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;data -d  @1494170842&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3 id=&#34;5-2-恢复gitlab&#34;&gt;5.2 恢复gitlab&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1）停止数据写入服务&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;停止数据写入服务&#34;&gt;停止数据写入服务&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;2）进行数据恢复并重启&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;进行恢复&#34;&gt;进行恢复&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-bash&#34; data-language=&#34;bash&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;gitlab-rake gitlab:backup:restore BACKUP&amp;#x3D;1494170842  # 这个时间戳就是刚刚备份的文件前面的时间戳&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h4 id=&#34;重启&#34;&gt;重启&lt;/h4&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ruby&#34; data-language=&#34;ruby&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ruby&#34;&gt;gitlab-ctl restart&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&#34;gitlab邮件通知配置&#34;&gt;gitlab邮件通知配置&lt;/h2&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;vim  /etc/gitlab/gitlab.rb&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;div class=&#34;code-area&#34;&gt;&lt;pre class=&#34;line-numbers language-ruby&#34; data-language=&#34;ruby&#34; data-start=&#34;1&#34;&gt;&lt;code class=&#34;language-ruby&#34;&gt;gitlab_rails[&amp;#39;time_zone&amp;#39;] &amp;#x3D; &amp;#39;Asia&amp;#x2F;Shanghai&amp;#39; gitlab_rails[&amp;#39;gitlab_email_enabled&amp;#39;] &amp;#x3D; true
gitlab_rails[&amp;#39;gitlab_email_from&amp;#39;] &amp;#x3D; &amp;#39;example@163.com&amp;#39; # 填写发件人的邮箱地址
gitlab_rails[&amp;#39;gitlab_email_display_name&amp;#39;] &amp;#x3D; &amp;#39;gitlab&amp;#39; gitlab_rails[&amp;#39;smtp_enable&amp;#39;] &amp;#x3D; true
gitlab_rails[&amp;#39;smtp_address&amp;#39;] &amp;#x3D; &amp;quot;smtp.163.com&amp;quot;  # smtp服务器的地址,如网易的地址
gitlab_rails[&amp;#39;smtp_port&amp;#39;] &amp;#x3D; 25                 # 要注意如果使用了SSL&amp;#x2F;TLS的话,端口可能不是25
gitlab_rails[&amp;#39;smtp_user_name&amp;#39;] &amp;#x3D; &amp;quot;smtp用户名&amp;quot; gitlab_rails[&amp;#39;smtp_password&amp;#39;] &amp;#x3D; &amp;quot;smtp用户密码&amp;quot; gitlab_rails[&amp;#39;smtp_domain&amp;#39;] &amp;#x3D; &amp;quot;163.com&amp;quot; gitlab_rails[&amp;#39;smtp_authentication&amp;#39;] &amp;#x3D; &amp;quot;login&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;
&lt;h2 id=&#34;使用SourceTree进行项目开发&#34;&gt;使用SourceTree进行项目开发&lt;/h2&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&#34;7-1-项目拉取&#34;&gt;7.1 项目拉取&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;先把项目克隆下来&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211633.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211438.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果ssh的方式克隆失败，可能是因为SSH Key没找到，可以在这里添加&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211211.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211201.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;7-2-创建分支进行功能开发&#34;&gt;7.2 创建分支进行功能开发&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1）新建立一个叫“pay”的分支&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211618.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211430.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2）进行功能开发&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211152.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;7-3-提交项目&#34;&gt;7.3 提交项目&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1）开发pay功能完成后进行提交&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以看到SourceTree中已经有“未提交的更改”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211422.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211144.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2）添加“用户信息”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211143.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;** 3）进行提交**&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211415.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注释也可以写成  close #3    ，作用是提交完成后关闭3号issue&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;7-4-推送到仓库&#34;&gt;&lt;strong&gt;7.4 推送到仓库&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211136.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211407.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;然后就可以在gitlab上进行发送merge请求了，后面就可以进行其他操作了&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;7-5-项目上线&#34;&gt;7.5 项目上线&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1）当所有工作完成之后，就可以进行上线了&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211135.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2）打标签&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上线先打个标签&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211127.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/09/1320210913211124.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cimg1.17lai.site/data/2021/05/2820210528225256.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;** 3）删除无用分支**&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;然后删除已经合并到主干中的不必要的分支，如index、pay等&lt;/li&gt;
&lt;li&gt;最后一定要注意时间一定要同步，不然会错乱&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;参考&#34;&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cnblogs.com/hgzero/p/14088215.html&#34;&gt;Praywu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;系列教程&#34;&gt;&lt;strong&gt;系列教程&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;全部文章RSS订阅&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&#34;Gitlab-使用系列&#34;&gt;&lt;strong&gt;Gitlab 使用系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/gitlab/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;Gitlab RSS 分类订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/acc13b70/&#34;&gt;&lt;strong&gt;Gitlab的安装及使用教程完全版&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/29a820b3/&#34;&gt;破解Gitlab EE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d08eb7b/&#34;&gt;Gitlab的安装及使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/1879721e/&#34;&gt;CI/CD与Git Flow与GitLab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;Devops系列&#34;&gt;&lt;strong&gt;Devops系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/devops/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;Devops 分类 RSS 订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ab63eb8f/&#34;&gt;自建全套开源Devops开发系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d32a07a7/&#34;&gt;Git介绍以及分支模型图解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/39563241/&#34;&gt;三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/3437994a/&#34;&gt;DevOps系列—【Jenkinsfile+Dockerfile+nginx+vue】&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/f4c3ad41/&#34;&gt;项目开发管理工具推荐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/acc13b70/&#34;&gt;Gitlab的安装及使用教程完全版&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d08eb7b/&#34;&gt;Gitlab的安装及使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/78c3371/&#34;&gt;那些有用的Github工具介绍！Action、app、workflow等&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;项目管理系列&#34;&gt;&lt;strong&gt;项目管理系列&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;/categories/ai/atom.xml&#34;&gt;&lt;i class=&#34;fas fa-rss&#34;&gt;&lt;/i&gt;&lt;strong&gt;AI 分类 RSS 订阅&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/d8b1e381/&#34;&gt;如何做一个完整的硬件项目的项目管理之简明教程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ca630feb/&#34;&gt;几种常用管理模型和方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ac0df556/&#34;&gt;PMBOK指南（第6版）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/99be6dfb/&#34;&gt;如何做好竞品分析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/a6477052/&#34;&gt;一大堆寓意深刻的管理故事锦集&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/ec34b111/&#34;&gt;人格类型分类总结归纳&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;link rel=&#34;stylesheet&#34; href=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10/dist/style.css&#34;&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/d3@7&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-view@0.18.10&#34;&gt;&lt;/script&gt;&lt;script src=&#34;https://fastly.jsdelivr.net/npm/markmap-toolbar@0.18.10&#34;&gt;&lt;/script&gt;
&lt;link rel=&#34;stylesheet&#34; href=&#34;/css/markmap.css&#34;&gt;

&lt;script src=&#34;/js/markmap.js&#34;&gt;&lt;/script&gt;
</content>
        <category term="gitlab" />
        <category term="git" />
        <category term="crack" />
        <updated>2021-07-09T08:25:00.000Z</updated>
    </entry>
</feed>
