<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>总结 on F嘉阳</title><link>https://blog.fjy8018.top/categories/%E6%80%BB%E7%BB%93/</link><description>Recent content in 总结 on F嘉阳</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 07 Sep 2023 17:15:33 +0800</lastBuildDate><atom:link href="https://blog.fjy8018.top/categories/%E6%80%BB%E7%BB%93/index.xml" rel="self" type="application/rss+xml"/><item><title>微服务平台开发总结（3）——第二代密码管理平台</title><link>https://blog.fjy8018.top/archives/245/</link><pubDate>Thu, 07 May 2020 21:38:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/245/</guid><description>&lt;h3 id="背景"&gt;&lt;a href="#%e8%83%8c%e6%99%af" class="header-anchor"&gt;&lt;/a&gt;背景&#10;&lt;/h3&gt;&lt;p&gt;吸取前两代系统的失败经验，对第二代密码管理微服务进行重新规划，并且在探索过程中见识到了cloud-platform、SpringBlade、pigx等优秀的微服务项目，考虑基于开源项目二次开发&lt;/p&gt;&#10;&lt;h2 id="规划"&gt;&lt;a href="#%e8%a7%84%e5%88%92" class="header-anchor"&gt;&lt;/a&gt;规划&#10;&lt;/h2&gt;&lt;p&gt;为了尽快落地上线，第一期以实现最小功能为主，其他非必须功能尽可能往后放&lt;/p&gt;&#10;&lt;h3 id="第一期"&gt;&lt;a href="#%e7%ac%ac%e4%b8%80%e6%9c%9f" class="header-anchor"&gt;&lt;/a&gt;第一期&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;SpringCloud微服务集成&lt;/li&gt;&#10;&lt;li&gt;Nacos、Sentinel、graylog、zipkin、 Turbine集成&lt;/li&gt;&#10;&lt;li&gt;前后端密码管理功能对接&lt;/li&gt;&#10;&lt;li&gt;操作日志记录&lt;/li&gt;&#10;&lt;li&gt;邮件通知&lt;/li&gt;&#10;&lt;li&gt;Excel导入导出&lt;/li&gt;&#10;&lt;li&gt;v1迁移到v2工具包&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="第二期"&gt;&lt;a href="#%e7%ac%ac%e4%ba%8c%e6%9c%9f" class="header-anchor"&gt;&lt;/a&gt;第二期&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;dble读写分离&lt;/li&gt;&#10;&lt;li&gt;支持忘记密码、密码锁定等&lt;/li&gt;&#10;&lt;li&gt;集成微信推送、微信注册功能&lt;/li&gt;&#10;&lt;li&gt;支持上传前端日志&lt;/li&gt;&#10;&lt;li&gt;页面排序、检索优化&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="第三期"&gt;&lt;a href="#%e7%ac%ac%e4%b8%89%e6%9c%9f" class="header-anchor"&gt;&lt;/a&gt;第三期&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;增加用户反馈功能&lt;/li&gt;&#10;&lt;li&gt;接入Seata分布式事务&lt;/li&gt;&#10;&lt;li&gt;支持配置导入导出权限&lt;/li&gt;&#10;&lt;li&gt;支持录入标签&lt;/li&gt;&#10;&lt;li&gt;…&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="技术体系"&gt;&lt;a href="#%e6%8a%80%e6%9c%af%e4%bd%93%e7%b3%bb" class="header-anchor"&gt;&lt;/a&gt;技术体系&#10;&lt;/h2&gt;&lt;h3 id="前端"&gt;&lt;a href="#%e5%89%8d%e7%ab%af" class="header-anchor"&gt;&lt;/a&gt;前端&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;前后端分离-采用前后端分离模式，前端基于Vue&lt;/li&gt;&#10;&lt;li&gt;采用Vuex进行状态管理，采用ES6作为语法支持&lt;/li&gt;&#10;&lt;li&gt;前后端基于开源项目SpringBlade二次开发&lt;/li&gt;&#10;&lt;li&gt;前后端代码生成-定制针对两套前端与后端的代码生成模板，轻松生成整个模块的前后端代码，减少重复工作量&lt;/li&gt;&#10;&lt;li&gt;多租户顶部菜单配置-提供给每个租户独立的顶部菜单配置模块，可以自定义顶部菜单切换&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="后端"&gt;&lt;a href="#%e5%90%8e%e7%ab%af" class="header-anchor"&gt;&lt;/a&gt;后端&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;基于SpringCloud的分布式架构&lt;/li&gt;&#10;&lt;li&gt;采用Mybatis与MybatisPlus作为ORM持久层框架&lt;/li&gt;&#10;&lt;li&gt;多租户系统-完整的SaaS多租户架构&lt;/li&gt;&#10;&lt;li&gt;借鉴OAuth2，通过Jwt令牌实现了多终端认证系统，可控制子系统的token权限互相隔离&lt;/li&gt;&#10;&lt;li&gt;权限管理-精心设计的权限管理方案，角色权限精确到按钮&lt;/li&gt;&#10;&lt;li&gt;集成邮件服务，通过事件传播实现不依赖消息队列通知发送服务&lt;/li&gt;&#10;&lt;li&gt;集成微信推送服务，实现微信注册、敏感操作消息推送&lt;/li&gt;&#10;&lt;li&gt;动态聚合文档-实现基于Nacos的Swagger SpringCloud聚合文档&lt;/li&gt;&#10;&lt;li&gt;实现动态网关，不重启就能设置网关配置项&lt;/li&gt;&#10;&lt;li&gt;集成Turbine聚合熔断监控&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="数据架构"&gt;&lt;a href="#%e6%95%b0%e6%8d%ae%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;数据架构&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;采用MySQL进行数据存储，底层配置为一主两从的高可用集群&lt;/li&gt;&#10;&lt;li&gt;采用ElasticSearch三节点集群进行日志数据存储&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="分布式支持"&gt;&lt;a href="#%e5%88%86%e5%b8%83%e5%bc%8f%e6%94%af%e6%8c%81" class="header-anchor"&gt;&lt;/a&gt;分布式支持&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;Nacos-集成阿里巴巴的Nacos完成统一的服务注册与配置&lt;/li&gt;&#10;&lt;li&gt;Sentinel-集成Sentinel从流量控制、熔断降级、系统负载等多个维度保护服务的稳定性&lt;/li&gt;&#10;&lt;li&gt;采用Docker打包，部署于Kubernetes集群上&lt;/li&gt;&#10;&lt;li&gt;Seata分布式事务-定制集成Seata，支持分布式事务，无代码侵入，不失灵活与简洁&lt;/li&gt;&#10;&lt;li&gt;使用graylog进行分布式日志采集，集中监控&lt;/li&gt;&#10;&lt;li&gt;通过zipkin进行分布式链路追踪，耗时统计和服务调用情况&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="devops"&gt;&lt;a href="#devops" class="header-anchor"&gt;&lt;/a&gt;DevOps&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;配置管理采用单仓库模式，集成docker打包插件，自动推送到harbor仓库&lt;/li&gt;&#10;&lt;li&gt;采用GitLab Runner CICD流水线自动部署到测试环境和生产环境&lt;/li&gt;&#10;&lt;li&gt;结合Maven私服和Harbor私服为内网自动化部署提供支持&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="官方架构图"&gt;&lt;a href="#%e5%ae%98%e6%96%b9%e6%9e%b6%e6%9e%84%e5%9b%be" class="header-anchor"&gt;&lt;/a&gt;官方架构图&#10;&lt;/h2&gt;&lt;p&gt;&lt;img alt="pw-cloud-v2架构图" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.fjy8018.top/images/recovered/2d0eba65095a8b8cd0e8.jpg"&gt;&lt;/p&gt;&#10;&lt;h2 id="截图"&gt;&lt;a href="#%e6%88%aa%e5%9b%be" class="header-anchor"&gt;&lt;/a&gt;截图&#10;&lt;/h2&gt;&lt;h3 id="管理员"&gt;&lt;a href="#%e7%ae%a1%e7%90%86%e5%91%98" class="header-anchor"&gt;&lt;/a&gt;管理员&#10;&lt;/h3&gt;&lt;p&gt;操作日志记录&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588579947777" class="gallery-image" data-flex-basis="486px" data-flex-grow="202" height="1262" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588579947777.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;错误日志系统内采集&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588581001650" class="gallery-image" data-flex-basis="487px" data-flex-grow="203" height="1261" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588581001650.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;Turbine集成熔断监控&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580468453" class="gallery-image" data-flex-basis="486px" data-flex-grow="202" height="1262" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580468453.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;通知发布&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588579968512" class="gallery-image" data-flex-basis="488px" data-flex-grow="203" height="1259" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588579968512.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;h3 id="普通用户"&gt;&lt;a href="#%e6%99%ae%e9%80%9a%e7%94%a8%e6%88%b7" class="header-anchor"&gt;&lt;/a&gt;普通用户&#10;&lt;/h3&gt;&lt;p&gt;主题切换&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588579979531" class="gallery-image" data-flex-basis="1387px" data-flex-grow="578" height="229" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588579979531.png" width="1324"&gt;&lt;/p&gt;&#10;&lt;p&gt;微信扫码注册&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580114649" class="gallery-image" data-flex-basis="487px" data-flex-grow="203" height="1260" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580114649.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;补全信息&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580190679" class="gallery-image" data-flex-basis="488px" data-flex-grow="203" height="1258" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580190679.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;主页资源权限控制&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580246683" class="gallery-image" data-flex-basis="486px" data-flex-grow="202" height="1263" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580246683.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588584226440" class="gallery-image" data-flex-basis="218px" data-flex-grow="90" height="738" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588584226440.png" width="671"&gt;&lt;/p&gt;&#10;&lt;p&gt;菜单资源权限控制&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580268145" class="gallery-image" data-flex-basis="235px" data-flex-grow="98" height="590" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580268145.png" width="579"&gt;&lt;/p&gt;&#10;&lt;p&gt;Excel导入导出&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580286188" class="gallery-image" data-flex-basis="926px" data-flex-grow="385" height="556" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580286188.png" width="2146"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580307993" class="gallery-image" data-flex-basis="545px" data-flex-grow="227" height="796" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580307993.png" width="1808"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580302209" class="gallery-image" data-flex-basis="427px" data-flex-grow="178" height="463" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580302209.png" width="825"&gt;&lt;/p&gt;&#10;&lt;p&gt;密码管理&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580328939" class="gallery-image" data-flex-basis="608px" data-flex-grow="253" height="513" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580328939.png" width="1300"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580345585" class="gallery-image" data-flex-basis="522px" data-flex-grow="217" height="1010" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580345585.png" width="2199"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580360145" class="gallery-image" data-flex-basis="697px" data-flex-grow="290" height="587" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580360145.png" width="1705"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580378111" class="gallery-image" data-flex-basis="855px" data-flex-grow="356" height="609" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580378111.png" width="2170"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580423240" class="gallery-image" data-flex-basis="346px" data-flex-grow="144" height="1058" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580423240.png" width="1528"&gt;&lt;/p&gt;&#10;&lt;h3 id="运维"&gt;&lt;a href="#%e8%bf%90%e7%bb%b4" class="header-anchor"&gt;&lt;/a&gt;运维&#10;&lt;/h3&gt;&lt;p&gt;Nacos注册中心&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588581761146" class="gallery-image" data-flex-basis="487px" data-flex-grow="203" height="1261" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588581761146.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;Sentinel限流管控&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20200507154857570" class="gallery-image" data-flex-basis="714px" data-flex-grow="297" height="639" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20200507154857570.png" width="1903"&gt;&lt;/p&gt;&#10;&lt;p&gt;SpringBoot Admin应用内指标监控&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20200521161617030" class="gallery-image" data-flex-basis="492px" data-flex-grow="205" height="935" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20200521161617030.png" width="1920"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20200521161630570" class="gallery-image" data-flex-basis="493px" data-flex-grow="205" height="934" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20200521161630570.png" width="1920"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20200521161745282" class="gallery-image" data-flex-basis="492px" data-flex-grow="205" height="936" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20200521161745282.png" width="1920"&gt;&lt;/p&gt;&#10;&lt;p&gt;Harbor内网私服&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588584874907" class="gallery-image" data-flex-basis="487px" data-flex-grow="203" height="1260" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588584874907.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;Nexus内网私服，提供maven和npm包&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588584922069" class="gallery-image" data-flex-basis="728px" data-flex-grow="303" height="843" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588584922069.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;graylog日志采集&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580515850" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.fjy8018.top/images/recovered/e611ef9ba81da5b064b2.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;三节点ES集群支持日志存储&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588581945300" class="gallery-image" data-flex-basis="487px" data-flex-grow="203" height="1261" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588581945300.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580536165" class="gallery-image" data-flex-basis="487px" data-flex-grow="203" height="1261" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580536165.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;耗时统计&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580556444" class="gallery-image" data-flex-basis="488px" data-flex-grow="203" height="1259" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580556444.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;新UI风格&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580850602" class="gallery-image" data-flex-basis="486px" data-flex-grow="202" height="1262" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580850602.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;动态服务依赖关系图&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580591683" class="gallery-image" data-flex-basis="949px" data-flex-grow="395" height="647" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580591683.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;新UI依赖图&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580908961" class="gallery-image" data-flex-basis="486px" data-flex-grow="202" height="1263" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580908961.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;Prometheus指标采集&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20200507154338613" class="gallery-image" data-flex-basis="501px" data-flex-grow="209" height="918" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20200507154338613.png" width="1920"&gt;&lt;/p&gt;&#10;&lt;p&gt;Grafana资源指标监控&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580674840" class="gallery-image" data-flex-basis="487px" data-flex-grow="203" height="1261" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580674840.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580713872" class="gallery-image" data-flex-basis="488px" data-flex-grow="203" height="1259" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580713872.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;Kuberneties服务部署监控&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580784287" class="gallery-image" data-flex-basis="487px" data-flex-grow="203" height="1261" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580784287.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;h3 id="开发过程工具"&gt;&lt;a href="#%e5%bc%80%e5%8f%91%e8%bf%87%e7%a8%8b%e5%b7%a5%e5%85%b7" class="header-anchor"&gt;&lt;/a&gt;开发过程工具&#10;&lt;/h3&gt;&lt;p&gt;Gitlab CICD流水线&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580803424" class="gallery-image" data-flex-basis="487px" data-flex-grow="203" height="1260" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580803424.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588580814213" class="gallery-image" data-flex-basis="487px" data-flex-grow="203" height="1260" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588580814213.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588581090189" class="gallery-image" data-flex-basis="677px" data-flex-grow="282" height="907" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588581090189.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;看板&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588581109459" class="gallery-image" data-flex-basis="487px" data-flex-grow="203" height="1260" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588581109459.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588581124259" class="gallery-image" data-flex-basis="912px" data-flex-grow="380" height="673" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588581124259.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;功能开发周期分析&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588584966734" class="gallery-image" data-flex-basis="488px" data-flex-grow="203" height="1258" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588584966734.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;gitlab集成k8s部署环境&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588581135887" class="gallery-image" data-flex-basis="1064px" data-flex-grow="443" height="577" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588581135887.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;Sonarqube代码质量检查&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="1588584033088" class="gallery-image" data-flex-basis="487px" data-flex-grow="203" height="1260" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1588584033088.png" width="2560"&gt;&lt;/p&gt;&#10;&lt;p&gt;分支图&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20200507155216967" class="gallery-image" data-flex-basis="856px" data-flex-grow="356" height="538" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20200507155216967.png" width="1920"&gt;&lt;/p&gt;&#10;&lt;p&gt;工程模块图&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image-20200507155249468" class="gallery-image" data-flex-basis="456px" data-flex-grow="190" height="1009" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/image-20200507155249468.png" width="1920"&gt;&lt;/p&gt;&#10;&lt;h2 id="结果成功"&gt;&lt;a href="#%e7%bb%93%e6%9e%9c%e6%88%90%e5%8a%9f" class="header-anchor"&gt;&lt;/a&gt;结果——成功&#10;&lt;/h2&gt;&lt;p&gt;经过两个月的开发和调试，第一期工程符合预定计划，按期投产上线运行，并经过2周试运行和测试后，进入生产环境，迁移老版本数据，正式替换了运行一年半的第一代密码管理系统&lt;/p&gt;&#10;&lt;h2 id="时间线"&gt;&lt;a href="#%e6%97%b6%e9%97%b4%e7%ba%bf" class="header-anchor"&gt;&lt;/a&gt;时间线&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;2020年3月开始基于SpringBlade 2.6.2编码&lt;/li&gt;&#10;&lt;li&gt;2020年4月20日第一个测试版本进入k8s测试环境&lt;/li&gt;&#10;&lt;li&gt;2020年4月28日第一个稳定版进行试运行阶段&lt;/li&gt;&#10;&lt;li&gt;2020年5月4日试运行阶段结束，第一个稳定版1.1.2发布，正式进行数据迁移并投入使用&lt;/li&gt;&#10;&lt;/ol&gt;&#10;</description></item><item><title>DevOps实践心得一</title><link>https://blog.fjy8018.top/archives/213/</link><pubDate>Fri, 16 Aug 2019 19:32:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/213/</guid><description>&lt;h2 id="初遇devops"&gt;&lt;a href="#%e5%88%9d%e9%81%87devops" class="header-anchor"&gt;&lt;/a&gt;初遇DevOps&#10;&lt;/h2&gt;&lt;p&gt;最早接触到&lt;code&gt;DevOps&lt;/code&gt;是在2018年8月26日，那时首先接触到的就是大名鼎鼎的&lt;code&gt;Jenkins&lt;/code&gt;，当时看了多篇关于持续集成和持续部署的文章，蠢蠢欲动，便开始了第一套&lt;code&gt;DevOps&lt;/code&gt;环境的搭建&lt;/p&gt;&#10;&lt;h2 id="jenkins"&gt;&lt;a href="#jenkins" class="header-anchor"&gt;&lt;/a&gt;Jenkins&#10;&lt;/h2&gt;&lt;p&gt;第一套&lt;code&gt;DevOps&lt;/code&gt;是用&lt;code&gt;Jenkins&lt;/code&gt;+&lt;code&gt;Ansible&lt;/code&gt;+&lt;code&gt;GitLab&lt;/code&gt;搭建的，那时只是了解Docker的好处，并没有使用Docker搭建整套环境，还是基于传统虚拟服务器搭建的整套流程。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;Jenkins&lt;/code&gt;不仅可以编写&lt;code&gt;groove&lt;/code&gt;脚本、pipeline 流水线等，还能与&lt;code&gt;maven&lt;/code&gt;集成自动构建，深深感受到了&lt;code&gt;Jenkins&lt;/code&gt;的强大，同时大量的用户为其贡献了许多插件，有很多实践问题都可以在网上搜索到解决方案&lt;/p&gt;&#10;&lt;p&gt;搭建过程：&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/176/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/175/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/177/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/179/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/178/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/180/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;最后顺利实现了静态网站持续集成、持续部署，详见：&#10;&lt;a class="link" href="https://blog.fjy8018.top/archives/181/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="dockergitlab"&gt;&lt;a href="#dockergitlab" class="header-anchor"&gt;&lt;/a&gt;Docker+GitLab&#10;&lt;/h2&gt;&lt;p&gt;随着容器化技术在国内越来越流行，容器普及度越来越高，其带来的环境隔离极大推动了&lt;code&gt;DevOps&lt;/code&gt;的落地，使得无需使用&lt;code&gt;python&lt;/code&gt;环境隔离，可以直接利用容器技术实现跨平台和环境隔离，并且利于迁移和部署&lt;/p&gt;&#10;&lt;p&gt;于是在2019年4月开始研究&lt;code&gt;GitLab&lt;/code&gt;官方文档，发现其早已原生支持流水线，并依托其&lt;code&gt;GitLab-runner&lt;/code&gt;可以直接实现整套&lt;code&gt;DevOps&lt;/code&gt;环境&lt;/p&gt;&#10;&lt;p&gt;因此，经过不断摸索，完整的搭建的基于&lt;code&gt;Docker&lt;/code&gt;和&lt;code&gt;GitLab&lt;/code&gt;的&lt;code&gt;DevOps&lt;/code&gt;环境，搭建过程见：&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/205/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/206/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/207/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;由于国内当时对&lt;code&gt;GitLab&lt;/code&gt;流水线使用的并不多，因此遇到的很多坑都需要翻查官方文档和国外的实践记录，比如：&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/208/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="devops-带来的好处"&gt;&lt;a href="#devops-%e5%b8%a6%e6%9d%a5%e7%9a%84%e5%a5%bd%e5%a4%84" class="header-anchor"&gt;&lt;/a&gt;DevOps 带来的好处&#10;&lt;/h2&gt;&lt;p&gt;2019年7月将手上的一个小型项目尝试使用完整的&lt;code&gt;DevOps&lt;/code&gt;流程开发，开发小组选择敏捷开发方法，所有的开发工具都尽量的适应快速的需求变化，同时投入非常少量的开发人员，分工明确，从一开始一周发布一次到最后一天可以发布多次&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="373px" data-flex-grow="155" height="853" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1565881026961.png" width="1328"&gt;&lt;/p&gt;&#10;&lt;p&gt;开发人员已经完全从运维中脱离，全团队没有专门的运维人员，极大的提高了开发效率，精简了人员构成，一旦构建失败，开发人员可以根据邮件通知的内容排查上线失败问题，调整代码和配置后重新提交&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="329px" data-flex-grow="137" height="954" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1565881202626.png" width="1310"&gt;&lt;/p&gt;&#10;&lt;p&gt;面板提供了流水线统计图，如果出现频繁的失败还是需要人工介入，查看问题原因&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="470px" data-flex-grow="196" height="680" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1565881072564.png" width="1334"&gt;&lt;/p&gt;&#10;&lt;h2 id="当前的问题"&gt;&lt;a href="#%e5%bd%93%e5%89%8d%e7%9a%84%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;当前的问题&#10;&lt;/h2&gt;&lt;p&gt;尽管使用了基于&lt;code&gt;Docker&lt;/code&gt;+&lt;code&gt;GitLab&lt;/code&gt;的流水线实现了完整的&lt;code&gt;DevOps&lt;/code&gt;流程，但对于监控和日志部分仍然处在很多问题&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;尽管上线的是单体应用，服务器和应用的健康状态都无法得知，也没有相应的告警&lt;/li&gt;&#10;&lt;li&gt;应用的日志没有被外部服务收集，无法进行快速分析&lt;/li&gt;&#10;&lt;li&gt;没有实现完整的测试流程，生成测试覆盖率报告等&lt;/li&gt;&#10;&lt;li&gt;没有实现0停机上线，在容器切换时仍需停机1-2分钟&lt;/li&gt;&#10;&lt;li&gt;没有实现灰度上线、蓝绿部署等，上线失败需要手动回滚&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="未来探索方向"&gt;&lt;a href="#%e6%9c%aa%e6%9d%a5%e6%8e%a2%e7%b4%a2%e6%96%b9%e5%90%91" class="header-anchor"&gt;&lt;/a&gt;未来探索方向&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;全面容器化服务治理方向&#10;&lt;ul&gt;&#10;&lt;li&gt;国内对容器化有非常多的实践&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;kubernetes&lt;/code&gt;作为容器调度成为大多数服务治理的选择&lt;/li&gt;&#10;&lt;li&gt;容器隔离、迁移和伸缩带来的巨大优势&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;容器与传统应用部署结合方式&#10;&lt;ul&gt;&#10;&lt;li&gt;以半全自动方式落地&lt;code&gt;DevOps&lt;/code&gt;，采用&lt;code&gt;Mesos&lt;/code&gt;+&lt;code&gt;marathon&lt;/code&gt;方式同时兼容传统服务部署和容器化部署&lt;/li&gt;&#10;&lt;li&gt;兼容分布式服务治理&lt;/li&gt;&#10;&lt;li&gt;国外有大量的实践案例&lt;/li&gt;&#10;&lt;li&gt;日志收集体系完备&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>DevOps GitLab CICD 实践3——CI文件编写</title><link>https://blog.fjy8018.top/archives/207/</link><pubDate>Wed, 03 Apr 2019 16:32:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/207/</guid><description>&lt;p&gt;前置步骤：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Docker 版 GitLab CICD 实践1——GitLab 部署 [[Docker 版 GitLab CICD 实践]]&lt;/li&gt;&#10;&lt;li&gt;Docker 版 GitLab CICD 实践2——Runner 部署 [[Docker 版 GitLab CICD 实践——Runner 部署]]&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="官方文档"&gt;&lt;a href="#%e5%ae%98%e6%96%b9%e6%96%87%e6%a1%a3" class="header-anchor"&gt;&lt;/a&gt;官方文档&#10;&lt;/h2&gt;&lt;p&gt;编写结构类似Jenkins pineline流水线&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html" target="_blank" rel="noopener"&#10; &gt;GitLab CI/CD Pipeline Configuration Reference&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;h1 id="gitlab-cicd-pipeline-configuration-reference"&gt;&lt;a href="#gitlab-cicd-pipeline-configuration-reference" class="header-anchor"&gt;&lt;/a&gt;GitLab CI/CD Pipeline Configuration Reference&#10;&lt;/h1&gt;&lt;p&gt;GitLab CI/CD &lt;a class="link" href="https://docs.gitlab.com/ee/ci/pipelines.html" target="_blank" rel="noopener"&#10; &gt;pipelines&lt;/a&gt; are configured using a YAML file called &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; within each project.&lt;/p&gt;&#10;&lt;p&gt;The &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file defines the structure and order of the pipelines and determines:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;What to execute using &lt;a class="link" href="https://docs.gitlab.com/runner/" target="_blank" rel="noopener"&#10; &gt;GitLab Runner&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;What decisions to make when specific conditions are encountered. For example, when a process succeeds or fails.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;This topic covers CI/CD pipeline configuration. For other CI/CD configuration information, see:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/variables/README.html" target="_blank" rel="noopener"&#10; &gt;GitLab CI/CD Variables&lt;/a&gt;, for configuring the environment the pipelines run in.&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/configuration/advanced-configuration.html" target="_blank" rel="noopener"&#10; &gt;GitLab Runner advanced configuration&lt;/a&gt;, for configuring GitLab Runner.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;We have complete examples of configuring pipelines:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;For a quick introduction to GitLab CI, follow our &lt;a class="link" href="https://docs.gitlab.com/ee/ci/quick_start/README.html" target="_blank" rel="noopener"&#10; &gt;quick start guide&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;For a collection of examples, see &lt;a class="link" href="https://docs.gitlab.com/ee/ci/examples/README.html" target="_blank" rel="noopener"&#10; &gt;GitLab CI/CD Examples&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;To see a large &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file used in an enterprise, see the &lt;a class="link" href="https://gitlab.com/gitlab-org/gitlab-ce/blob/master/.gitlab-ci.yml" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file for &lt;code&gt;gitlab-ce&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="目标"&gt;&lt;a href="#%e7%9b%ae%e6%a0%87" class="header-anchor"&gt;&lt;/a&gt;目标&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;maven项目自动打包&lt;/li&gt;&#10;&lt;li&gt;&lt;del&gt;自动测试&lt;/del&gt;&lt;/li&gt;&#10;&lt;li&gt;自动镜像构建并上传&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;官方参数表列出了作业的可用参数：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;关键词&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;描述&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#script" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;script&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;由Runner执行的Shell脚本。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#image" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;image&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;使用泊坞窗图像。也可用：&lt;code&gt;image:name&lt;/code&gt;和&lt;code&gt;image:entrypoint&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#services" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;services&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;使用docker services图像。也可用：&lt;code&gt;services:name&lt;/code&gt;，&lt;code&gt;services:alias&lt;/code&gt;，&lt;code&gt;services:entrypoint&lt;/code&gt;，和&lt;code&gt;services:command&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#before_script-and-after_script" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;before_script&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;覆盖在作业之前执行的一组命令。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#before_script-and-after_script" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;after_script&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;覆盖作业后执行的一组命令。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#stages" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;stages&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定义管道中的阶段。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#stage" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;stage&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定义作业阶段（默认值:) &lt;code&gt;test&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#onlyexcept-basic" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;only&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;创建作业时限制。也可用：&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#onlyexcept-advanced" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;only:refs&lt;/code&gt;，&lt;code&gt;only:kubernetes&lt;/code&gt;，&lt;code&gt;only:variables&lt;/code&gt;，和&lt;code&gt;only:changes&lt;/code&gt;&lt;/a&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#onlyexcept-basic" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;except&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;在未创建作业时限制。也可用：&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#onlyexcept-advanced" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;except:refs&lt;/code&gt;，&lt;code&gt;except:kubernetes&lt;/code&gt;，&lt;code&gt;except:variables&lt;/code&gt;，和&lt;code&gt;except:changes&lt;/code&gt;&lt;/a&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#tags" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;tags&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;用于选择Runner的标签列表。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#allow_failure" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;allow_failure&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;让工作失败。失败的作业无助于提交状态。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#when" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;when&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;什么时候开始工作。也可用：&lt;code&gt;when:manual&lt;/code&gt;和&lt;code&gt;when:delayed&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#environment" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;environment&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;作业部署到的环境的名称。也可用：&lt;code&gt;environment:name&lt;/code&gt;，&lt;code&gt;environment:url&lt;/code&gt;，&lt;code&gt;environment:on_stop&lt;/code&gt;，和&lt;code&gt;environment:action&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#cache" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;cache&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;后续运行之间应缓存的文件列表。也可用：&lt;code&gt;cache:paths&lt;/code&gt;，&lt;code&gt;cache:key&lt;/code&gt;，&lt;code&gt;cache:untracked&lt;/code&gt;，和&lt;code&gt;cache:policy&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#artifacts" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;artifacts&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;成功附加到作业的文件和目录列表。也可用：&lt;code&gt;artifacts:paths&lt;/code&gt;，&lt;code&gt;artifacts:name&lt;/code&gt;，&lt;code&gt;artifacts:untracked&lt;/code&gt;，&lt;code&gt;artifacts:when&lt;/code&gt;，&lt;code&gt;artifacts:expire_in&lt;/code&gt;，&lt;code&gt;artifacts:reports&lt;/code&gt;，和&lt;code&gt;artifacts:reports:junit&lt;/code&gt;。 在GitLab &lt;a class="link" href="https://about.gitlab.com/pricing/" target="_blank" rel="noopener"&#10; &gt;企业版&lt;/a&gt;，这些都是可供选择：&lt;code&gt;artifacts:reports:codequality&lt;/code&gt;，&lt;code&gt;artifacts:reports:sast&lt;/code&gt;，&lt;code&gt;artifacts:reports:dependency_scanning&lt;/code&gt;，&lt;code&gt;artifacts:reports:container_scanning&lt;/code&gt;，&lt;code&gt;artifacts:reports:dast&lt;/code&gt;，&lt;code&gt;artifacts:reports:license_management&lt;/code&gt;，和&lt;code&gt;artifacts:reports:performance&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#dependencies" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;dependencies&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;作业所依赖的其他作业，以便您可以在它们之间传递工件。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#coverage" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;coverage&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;给定作业的代码覆盖率设置。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#retry" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;retry&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;在发生故障的情况下，可以自动重试作业的次数和次数。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#parallel" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;parallel&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;应该并行运行多少个作业实例。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#trigger-premium" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;trigger&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定义下游管道触发器。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#include" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;include&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;允许此作业包含外部YAML文件。也可用：&lt;code&gt;include:local&lt;/code&gt;，&lt;code&gt;include:file&lt;/code&gt;，&lt;code&gt;include:template&lt;/code&gt;，和&lt;code&gt;include:remote&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#extends" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;extends&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;此作业将继承的配置条目。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#pages" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;pages&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;上传作业结果以用于GitLab Pages。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#variables" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;variables&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;在作业级别定义作业变量。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;strong&gt;注：&lt;/strong&gt; 参数&lt;code&gt;types&lt;/code&gt;和&lt;code&gt;type&lt;/code&gt;被&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html#deprecated-parameters" target="_blank" rel="noopener"&#10; &gt;弃用&lt;/a&gt;。&lt;/p&gt;&#10;&lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考&#10;&lt;/h2&gt;&lt;p&gt;官方构建案例&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/examples/deploy_spring_boot_to_cloud_foundry/index.html" target="_blank" rel="noopener"&#10; &gt;Deploy a Spring Boot application to Cloud Foundry with GitLab CI/CD&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;参考其脚本&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;h2 id="configure-gitlab-cicd-to-deploy-your-application"&gt;&lt;a href="#configure-gitlab-cicd-to-deploy-your-application" class="header-anchor"&gt;&lt;/a&gt;Configure GitLab CI/CD to deploy your application&#10;&lt;/h2&gt;&lt;p&gt;Now we need to add the GitLab CI/CD configuration file (&lt;a class="link" href="https://docs.gitlab.com/ee/ci/yaml/README.html" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;.gitlab-ci.yml&lt;/code&gt;&lt;/a&gt;) to our project’s root. This is how GitLab figures out what commands need to be run whenever code is pushed to our repository. We will add the following &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file to the root directory of the repository, GitLab will detect it automatically and run the steps defined once we push our code:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;java:8&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;stages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;build&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;deploy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;build&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./mvnw package&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;artifacts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;target/demo-0.0.1-SNAPSHOT.jar&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;production&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;deploy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;curl --location &amp;#34;https://cli.run.pivotal.io/stable?release=linux64-binary&amp;amp;source=github&amp;#34; | tar zx&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./cf login -u $CF_USERNAME -p $CF_PASSWORD -a api.run.pivotal.io&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./cf push&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;only&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;master&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="配置"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;配置&#10;&lt;/h2&gt;&lt;h3 id="全局变量"&gt;&lt;a href="#%e5%85%a8%e5%b1%80%e5%8f%98%e9%87%8f" class="header-anchor"&gt;&lt;/a&gt;全局变量&#10;&lt;/h3&gt;&lt;p&gt;进入工程CI设置配置全局变量脚本，包含镜像仓库登陆名称、密码、打包名称等&lt;/p&gt;&#10;&lt;p&gt;配置全局变量目的在于配置脚本中&lt;strong&gt;不应该&lt;/strong&gt;包含密码等敏感信息&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46d8dd6a74.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554278638713.png" class="gallery-image" data-flex-basis="755px" data-flex-grow="314" height="507" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46d8dd6a74.png" width="1597"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;若希望使用GitLab内置环境变量，可参考官方表格&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/ci/variables/README.html" target="_blank" rel="noopener"&#10; &gt;GitLab CI/CD environment variables&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="ci脚本"&gt;&lt;a href="#ci%e8%84%9a%e6%9c%ac" class="header-anchor"&gt;&lt;/a&gt;CI脚本&#10;&lt;/h3&gt;&lt;p&gt;结合可用参数和样例配置，根据已经存在的SpringBoot项目编写响应的CI脚本&lt;code&gt;.gitlab-ci.yml&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker:stable&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker:dind&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DOCKER_DRIVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;overlay&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;SPRING_PROFILES_ACTIVE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;gitlab-ci&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;stages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;build&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;package&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;maven-build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;maven:3-jdk-8&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;build&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mvn package -B&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;artifacts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;target/*.jar&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;docker-build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;package&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker build -t $CONTAINER_IMAGE:latest .&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker login -u $DOCKER_HUB_USER -p $DOCKER_HUB_PASS&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;docker push $CONTAINER_IMAGE:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;该脚本对于满足脚本目标的工程都可复用，若需要测试，则增加相关的测试步骤即可&lt;/p&gt;&#10;&lt;p&gt;此处由于工程包含外部依赖关系，不在构建时测试&lt;/p&gt;&#10;&lt;h3 id="自动构建"&gt;&lt;a href="#%e8%87%aa%e5%8a%a8%e6%9e%84%e5%bb%ba" class="header-anchor"&gt;&lt;/a&gt;自动构建&#10;&lt;/h3&gt;&lt;p&gt;默认的触发构建事件为&lt;code&gt;commit&lt;/code&gt;等&lt;/p&gt;&#10;&lt;p&gt;触发后会自动执行任务&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e940608c.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554278973797.png" class="gallery-image" data-flex-basis="1609px" data-flex-grow="670" height="194" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e940608c.png" width="1301"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e93a1220.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554279027476.png" class="gallery-image" data-flex-basis="621px" data-flex-grow="259" height="222" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e93a1220.png" width="575"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Maven自动触发构建，自动镜像打包&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e9490c9f.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554279219445.png" class="gallery-image" data-flex-basis="319px" data-flex-grow="132" height="619" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e9490c9f.png" width="823"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e935f2c2.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554279272711.png" class="gallery-image" data-flex-basis="438px" data-flex-grow="182" height="309" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e935f2c2.png" width="565"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;自动上传（推送）镜像&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e93137c7.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554279311054.png" class="gallery-image" data-flex-basis="407px" data-flex-grow="169" height="439" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e93137c7.png" width="745"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="执行结果"&gt;&lt;a href="#%e6%89%a7%e8%a1%8c%e7%bb%93%e6%9e%9c" class="header-anchor"&gt;&lt;/a&gt;执行结果&#10;&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e921bcd7.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554279508887.png" class="gallery-image" data-flex-basis="2119px" data-flex-grow="883" height="149" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e921bcd7.png" width="1316"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;若执行失败则会发送邮件给开发人员&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e94b500e.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554279616575.png" class="gallery-image" data-flex-basis="405px" data-flex-grow="168" height="945" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/5ca46e94b500e.png" width="1595"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;CICD全套流程目标实现！&lt;/p&gt;&#10;&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结&#10;&lt;/h2&gt;&lt;p&gt;不管使用GitLab CICD或者是使用Jenkins+Ansible的方式，目标都在于践行DevOps，打通开发与运维流程，一旦配置好CICD流程，往后开发人员便不再操心打包、构建等操作，可以专注开发&lt;/p&gt;&#10;</description></item><item><title>DevOps GitLab CICD 实践2——Runner 部署</title><link>https://blog.fjy8018.top/archives/206/</link><pubDate>Wed, 03 Apr 2019 16:31:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/206/</guid><description>&lt;p&gt;前置步骤：&lt;a class="link" href="https://blog.fjy8018.top/archives/205/" &gt;DevOps GitLab CICD 实践1——GitLab 部署&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="官方文档"&gt;&lt;a href="#%e5%ae%98%e6%96%b9%e6%96%87%e6%a1%a3" class="header-anchor"&gt;&lt;/a&gt;官方文档&#10;&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/install/docker.html" target="_blank" rel="noopener"&#10; &gt;文档地址&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;虽然有官方指引，但个人感觉指引的不够清晰，导致初次配置可能频繁失败&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;h1 id="run-gitlab-runner-in-a-container"&gt;&lt;a href="#run-gitlab-runner-in-a-container" class="header-anchor"&gt;&lt;/a&gt;Run GitLab Runner in a container&#10;&lt;/h1&gt;&lt;p&gt;This is how you can run GitLab Runner inside a Docker container.&lt;/p&gt;&#10;&lt;h2 id="general-gitlab-runner-docker-image-usage"&gt;&lt;a href="#general-gitlab-runner-docker-image-usage" class="header-anchor"&gt;&lt;/a&gt;General GitLab Runner Docker image usage&#10;&lt;/h2&gt;&lt;p&gt;GitLab Runner Docker images (based on &lt;a class="link" href="https://docs.gitlab.com/runner/install/docker.html#docker-images" target="_blank" rel="noopener"&#10; &gt;Ubuntu or Alpine Linux&lt;/a&gt;) are designed as wrappers around the standard &lt;code&gt;gitlab-runner&lt;/code&gt; command, like if GitLab Runner was installed directly on the host.&lt;/p&gt;&#10;&lt;p&gt;The general rule is that every GitLab Runner command that normally would be executed as:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gitlab-runner &lt;span class="o"&gt;[&lt;/span&gt;Runner &lt;span class="nb"&gt;command&lt;/span&gt; and options...&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;can be executed with:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run &lt;span class="o"&gt;[&lt;/span&gt;chosen docker options...&lt;span class="o"&gt;]&lt;/span&gt; gitlab/gitlab-runner &lt;span class="o"&gt;[&lt;/span&gt;Runner &lt;span class="nb"&gt;command&lt;/span&gt; and options...&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For example, getting the top-level help information for GitLab Runner command could be executed as:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm -t -i gitlab/gitlab-runner --help&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gitlab-runner - a GitLab Runner&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;USAGE:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gitlab-runner &lt;span class="o"&gt;[&lt;/span&gt;global options&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt; options&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;arguments...&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VERSION:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 10.7.0 &lt;span class="o"&gt;(&lt;/span&gt;7c273476&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;(&lt;/span&gt;...&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In short, the &lt;code&gt;gitlab-runner&lt;/code&gt; part of the command is replaced with &lt;code&gt;docker run [docker options] gitlab/gitlab-runner&lt;/code&gt;, while the rest of Runner’s command stays as it is described in the &lt;a class="link" href="https://docs.gitlab.com/runner/register/index.html" target="_blank" rel="noopener"&#10; &gt;register documentation&lt;/a&gt;. The only difference is that the &lt;code&gt;gitlab-runner&lt;/code&gt; command is executed inside of a Docker container.&lt;/p&gt;&#10;&lt;h2 id="docker-image-installation-and-configuration"&gt;&lt;a href="#docker-image-installation-and-configuration" class="header-anchor"&gt;&lt;/a&gt;Docker image installation and configuration&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Install Docker first:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl -sSL https://get.docker.com/ &lt;span class="p"&gt;|&lt;/span&gt; sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;You need to mount a config volume into the &lt;code&gt;gitlab-runner&lt;/code&gt; container to be used for configs and other resources:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker run -d --name gitlab-runner --restart always &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /srv/gitlab-runner/config:/etc/gitlab-runner &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /var/run/docker.sock:/var/run/docker.sock &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gitlab/gitlab-runner:latest&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; On macOS, use &lt;code&gt;/Users/Shared&lt;/code&gt; instead of &lt;code&gt;/srv&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Or, you can use a config container to mount your custom data volume:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker run -d --name gitlab-runner-config &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /etc/gitlab-runner &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; busybox:latest &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /bin/true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then, run the Runner:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker run -d --name gitlab-runner --restart always &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /var/run/docker.sock:/var/run/docker.sock &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --volumes-from gitlab-runner-config &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gitlab/gitlab-runner:latest&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Register the runner you just launched by following the instructions in the &lt;a class="link" href="https://docs.gitlab.com/runner/register/index.html#docker" target="_blank" rel="noopener"&#10; &gt;Docker section of Registering Runners&lt;/a&gt;. The runner won’t pick up any jobs until it’s registered.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="安装步骤"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e6%ad%a5%e9%aa%a4" class="header-anchor"&gt;&lt;/a&gt;安装步骤&#10;&lt;/h2&gt;&lt;h3 id="获取gitlab-runner秘钥"&gt;&lt;a href="#%e8%8e%b7%e5%8f%96gitlab-runner%e7%a7%98%e9%92%a5" class="header-anchor"&gt;&lt;/a&gt;获取Gitlab Runner秘钥&#10;&lt;/h3&gt;&lt;p&gt;可以通过Gitlab管理员账号获取，也可以让每一个用户自行配置&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;普通用户查看秘钥&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;进入任意一个仓库的设置中，查看CICD配置&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d8f7ec77.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554266163188.png" class="gallery-image" data-flex-basis="148px" data-flex-grow="61" height="776" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d8f7ec77.png" width="480"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;准备注册专用Runner令牌&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d8ff2aa9.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554266217632.png" class="gallery-image" data-flex-basis="179px" data-flex-grow="74" height="612" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d8ff2aa9.png" width="457"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;管理员查看令牌&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;进入总设置页面，配置全局Runner令牌&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d907392b.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554266287842.png" class="gallery-image" data-flex-basis="913px" data-flex-grow="380" height="446" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d907392b.png" width="1698"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="runner注册"&gt;&lt;a href="#runner%e6%b3%a8%e5%86%8c" class="header-anchor"&gt;&lt;/a&gt;Runner注册&#10;&lt;/h3&gt;&lt;p&gt;由于Runner一般运行复杂构建、打包任务，推荐配置在性能、带宽更大的机房&lt;/p&gt;&#10;&lt;h4 id="准备docker环境"&gt;&lt;a href="#%e5%87%86%e5%a4%87docker%e7%8e%af%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;准备Docker环境&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -sSL https://get.docker.com/ &lt;span class="p"&gt;|&lt;/span&gt; sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="注册"&gt;&lt;a href="#%e6%b3%a8%e5%86%8c" class="header-anchor"&gt;&lt;/a&gt;注册&#10;&lt;/h4&gt;&lt;p&gt;可以根据需要选择注册Runner类型&lt;/p&gt;&#10;&lt;p&gt;同时，为了方便配置，使用单行注册并且关闭交互&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://docs.gitlab.com/runner/register/index.html#one-line-registration-command" target="_blank" rel="noopener"&#10; &gt;单行注册官方文档&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;命令说明：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;-v&lt;/code&gt;挂载的目的是为了将注册后的配置文件持久化，用于运行容器&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--rm&lt;/code&gt;指定容器运行结束后自动删除停止的容器&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-it&lt;/code&gt;指定使用命令行交互方式运行，便于查看注册结果&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run --rm -it &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /www/wwwroot/gitlab/srv/gitlab-runner/config:/etc/gitlab-runner &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gitlab/gitlab-runner:alpine-v11.8.0 register &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --non-interactive &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --executor &lt;span class="s2"&gt;&amp;#34;docker&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --docker-image docker:stable &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --url &lt;span class="s2"&gt;&amp;#34;Gitlab URL&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --registration-token &lt;span class="s2"&gt;&amp;#34;令牌&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --description &lt;span class="s2"&gt;&amp;#34;描述&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --tag-list &lt;span class="s2"&gt;&amp;#34;标签1,标签2&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --run-untagged &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --docker-privileged &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --locked&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注册成功提示&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d8cb31ce.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554277014308.png" class="gallery-image" data-flex-basis="3007px" data-flex-grow="1253" height="81" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d8cb31ce.png" width="1015"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;此时管理面板显示新的Runner已经注册&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d8db2078.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554277086811.png" class="gallery-image" data-flex-basis="663px" data-flex-grow="276" height="484" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d8db2078.png" width="1339"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="runner-启动"&gt;&lt;a href="#runner-%e5%90%af%e5%8a%a8" class="header-anchor"&gt;&lt;/a&gt;Runner 启动&#10;&lt;/h3&gt;&lt;p&gt;挂载本地配置信息并启动Runner&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -d --name gitlab-runner --restart always &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#9;-v /www/wwwroot/gitlab/srv/gitlab-runner/config:/etc/gitlab-runner &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /var/run/docker.sock:/var/run/docker.sock &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gitlab/gitlab-runner:alpine-v11.8.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此时可见Runner已经保持和Gitlab的联系&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d8c56a69.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554277457677.png" class="gallery-image" data-flex-basis="2026px" data-flex-grow="844" height="158" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d8c56a69.png" width="1334"&gt;&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>DevOps GitLab CICD 实践1——GitLab 部署</title><link>https://blog.fjy8018.top/archives/205/</link><pubDate>Wed, 03 Apr 2019 16:30:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/205/</guid><description>&lt;h2 id="配置目标"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae%e7%9b%ae%e6%a0%87" class="header-anchor"&gt;&lt;/a&gt;配置目标&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;邮件提示&lt;/li&gt;&#10;&lt;li&gt;GitHub第三方授权登陆&lt;/li&gt;&#10;&lt;li&gt;GitLab Runner&lt;/li&gt;&#10;&lt;li&gt;Docker私服注册&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="官方介绍"&gt;&lt;a href="#%e5%ae%98%e6%96%b9%e4%bb%8b%e7%bb%8d" class="header-anchor"&gt;&lt;/a&gt;官方介绍&#10;&lt;/h2&gt;&lt;p&gt;目前微服务盛行环境下，服务部署优先考虑Docker方式，便于迁移和弹性伸缩&lt;/p&gt;&#10;&lt;p&gt;官方镜像介绍 &lt;a class="link" href="https://docs.gitlab.com/omnibus/docker/" target="_blank" rel="noopener"&#10; &gt;GitLab Docker images&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;h1 id="gitlab-docker-images"&gt;&lt;a href="#gitlab-docker-images" class="header-anchor"&gt;&lt;/a&gt;GitLab Docker images&#10;&lt;/h1&gt;&lt;p&gt;Both GitLab CE and EE are in Docker Hub:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://registry.hub.docker.com/u/gitlab/gitlab-ce/" target="_blank" rel="noopener"&#10; &gt;GitLab CE Docker image&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://registry.hub.docker.com/u/gitlab/gitlab-ee/" target="_blank" rel="noopener"&#10; &gt;GitLab EE Docker image&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The GitLab Docker images are monolithic images of GitLab running all the necessary services on a single container.&lt;/p&gt;&#10;&lt;p&gt;In the following examples we are using the image of GitLab CE. To use GitLab EE instead of GitLab CE, replace the image name to &lt;code&gt;gitlab/gitlab-ee:latest&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;If you want to use the latest RC image, use &lt;code&gt;gitlab/gitlab-ce:rc&lt;/code&gt; or &lt;code&gt;gitlab/gitlab-ee:rc&lt;/code&gt; for GitLab CE and GitLab EE respectively.&lt;/p&gt;&#10;&lt;p&gt;The GitLab Docker images can be run in multiple ways:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/docker/#run-the-image" target="_blank" rel="noopener"&#10; &gt;Run the image in Docker Engine&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/docker/#install-gitlab-into-a-cluster" target="_blank" rel="noopener"&#10; &gt;Install GitLab into a cluster&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/docker/#install-gitlab-using-docker-compose" target="_blank" rel="noopener"&#10; &gt;Install GitLab using docker-compose&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="docker-compose-脚本"&gt;&lt;a href="#docker-compose-%e8%84%9a%e6%9c%ac" class="header-anchor"&gt;&lt;/a&gt;docker-compose 脚本&#10;&lt;/h2&gt;&lt;p&gt;此处选择社区版(CE)安装，同时为了便于参数配置，使用&lt;code&gt;docker-compose&lt;/code&gt;方式编写脚本文件&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;h2 id="install-gitlab-using-docker-compose"&gt;&lt;a href="#install-gitlab-using-docker-compose" class="header-anchor"&gt;&lt;/a&gt;Install GitLab using docker-compose&#10;&lt;/h2&gt;&lt;p&gt;With &lt;a class="link" href="https://docs.docker.com/compose/" target="_blank" rel="noopener"&#10; &gt;Docker compose&lt;/a&gt; you can easily configure, install, and upgrade your Docker-based GitLab installation.&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://docs.docker.com/compose/install/" target="_blank" rel="noopener"&#10; &gt;Install&lt;/a&gt; Docker Compose&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Create a &lt;code&gt;docker-compose.yml&lt;/code&gt; file (or &lt;a class="link" href="https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/docker/docker-compose.yml" target="_blank" rel="noopener"&#10; &gt;download an example&lt;/a&gt;):&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;web&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gitlab/gitlab-ce:latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gitlab.example.com&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;GITLAB_OMNIBUS_CONFIG&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; external_url &amp;#39;https://gitlab.example.com&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; # Add any other gitlab.rb configuration here, each on its own line&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;80:80&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;443:443&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;22:22&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;/srv/gitlab/config:/etc/gitlab&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;/srv/gitlab/logs:/var/log/gitlab&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;/srv/gitlab/data:/var/opt/gitlab&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Make sure you are in the same directory as &lt;code&gt;docker-compose.yml&lt;/code&gt; and run &lt;code&gt;docker-compose up -d&lt;/code&gt; to start GitLab&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Read &lt;a class="link" href="https://docs.gitlab.com/omnibus/docker/#pre-configure-docker-container" target="_blank" rel="noopener"&#10; &gt;“Pre-configure Docker container”&lt;/a&gt; to see how the &lt;code&gt;GITLAB_OMNIBUS_CONFIG&lt;/code&gt; variable works.&lt;/p&gt;&#10;&lt;p&gt;Below is another &lt;code&gt;docker-compose.yml&lt;/code&gt; example with GitLab running on a custom HTTP and SSH port. Notice how the &lt;code&gt;GITLAB_OMNIBUS_CONFIG&lt;/code&gt; variables match the &lt;code&gt;ports&lt;/code&gt; section:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;web&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gitlab/gitlab-ce:latest&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gitlab.example.com&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;GITLAB_OMNIBUS_CONFIG&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; external_url &amp;#39;http://gitlab.example.com:9090&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;gitlab_shell_ssh_port&amp;#39;] = 2224&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;9090:9090&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;2224:22&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;/srv/gitlab/config:/etc/gitlab&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;/srv/gitlab/logs:/var/log/gitlab&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;/srv/gitlab/data:/var/opt/gitlab&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is the same as using &lt;code&gt;--publish 9090:9090 --publish 2224:22&lt;/code&gt;.&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;官方提示说明Docker CE版基于&lt;code&gt;Omnibus&lt;/code&gt;版本，故环境配置也可参考相关文档&lt;/p&gt;&#10;&lt;h3 id="omnibus文档目录"&gt;&lt;a href="#omnibus%e6%96%87%e6%a1%a3%e7%9b%ae%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;Omnibus文档目录&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;h4 id="installation-and-configuration-using-omnibus-package"&gt;&lt;a href="#installation-and-configuration-using-omnibus-package" class="header-anchor"&gt;&lt;/a&gt;Installation and Configuration using omnibus package&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This section describes the commonly used configuration settings. Check &lt;a class="link" href="https://docs.gitlab.com/omnibus/README.html#configuring" target="_blank" rel="noopener"&#10; &gt;configuration&lt;/a&gt; section of the documentation for complete configuration settings.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Installing GitLab&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/manual_install.html" target="_blank" rel="noopener"&#10; &gt;Manually downloading and installing a GitLab package&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab" target="_blank" rel="noopener"&#10; &gt;Setting up a domain name/URL&lt;/a&gt; for the GitLab Instance so that it can be accessed easily&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/settings/nginx.html#enable-https" target="_blank" rel="noopener"&#10; &gt;Enabling HTTPS&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/settings/smtp.html#smtp-settings" target="_blank" rel="noopener"&#10; &gt;Enabling notification EMails&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Enabling replying via email&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/ce/administration/reply_by_email_postfix_setup.html" target="_blank" rel="noopener"&#10; &gt;Installing and configuring postfix&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Enabling container registry on GitLab&#10;&lt;ul&gt;&#10;&lt;li&gt;You will require SSL certificates for the domain used for container registry&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Enabling GitLab Pages&#10;&lt;ul&gt;&#10;&lt;li&gt;If you want HTTPS enabled, you will have to get wildcard certificates&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/integration/elasticsearch.html" target="_blank" rel="noopener"&#10; &gt;Enabling Elasticsearch&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/gitlab-mattermost/README.html" target="_blank" rel="noopener"&#10; &gt;GitLab Mattermost&lt;/a&gt; Set up the Mattermost messaging app that ships with Omnibus GitLab package.&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/ce/administration/monitoring/performance/prometheus.html" target="_blank" rel="noopener"&#10; &gt;GitLab Prometheus&lt;/a&gt; Set up the Prometheus monitoring included in the Omnibus GitLab package.&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/roles/README.html" target="_blank" rel="noopener"&#10; &gt;GitLab High Availability Roles&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;结合配置目标编写yaml文件&lt;/p&gt;&#10;&lt;p&gt;注意：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;此处邮件使用163邮箱（官方没有提供163邮箱支持案例）&lt;/li&gt;&#10;&lt;li&gt;Docker私服公钥执行从私服上获取&lt;/li&gt;&#10;&lt;li&gt;由于特殊原因，目标配置未启动SSL安全连接，但GitLab可以通过简单配置支持SSL并&lt;strong&gt;自动更新证书&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://docs.gitlab.com/omnibus/settings/ssl.html#lets-encrypthttpsletsencryptorg-integration" target="_blank" rel="noopener"&#10; &gt;配置文档&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;h3 id="lets-encrypt-integration"&gt;&lt;a href="#lets-encrypt-integration" class="header-anchor"&gt;&lt;/a&gt;&lt;a class="link" href="https://letsencrypt.org/" target="_blank" rel="noopener"&#10; &gt;Let’s Encrypt&lt;/a&gt; Integration&#10;&lt;/h3&gt;&lt;h4 id="primary-gitlab-instance"&gt;&lt;a href="#primary-gitlab-instance" class="header-anchor"&gt;&lt;/a&gt;Primary GitLab Instance&#10;&lt;/h4&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Introduced in GitLab version &lt;strong&gt;10.5&lt;/strong&gt; and disabled by default. Enabled by default in GitLab version &lt;strong&gt;10.7&lt;/strong&gt; and later if &lt;code&gt;external_url&lt;/code&gt; is set with the &lt;em&gt;https&lt;/em&gt;protocol and no certificates are configured.&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: In order for Let’s Encrypt verification to work correctly, ports 80 and 443 will need to be accessible to the Let’s Encrypt servers that run the validation. Also note that the validation currently &lt;a class="link" href="https://gitlab.com/gitlab-org/omnibus-gitlab/issues/3580" target="_blank" rel="noopener"&#10; &gt;does not work with non-standard ports&lt;/a&gt;.&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;Caution&lt;/strong&gt; Administrators installing or upgrading to GitLab version &lt;strong&gt;10.7&lt;/strong&gt; or later and do not plan on using &lt;strong&gt;Let’s Encrypt&lt;/strong&gt; should set the following in &lt;code&gt;/etc/gitlab/gitlab.rb&lt;/code&gt; to disable:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-properties" data-lang="properties"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;letsencrypt[&amp;#39;enable&amp;#39;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;Add the following entries to &lt;code&gt;/etc/gitlab/gitlab.rb&lt;/code&gt; to enable &lt;strong&gt;Let’s Encrypt&lt;/strong&gt; support for the primary domain:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-properties" data-lang="properties"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;letsencrypt[&amp;#39;enable&amp;#39;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true # GitLab 10.5 and 10.6 require this option&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;external_url&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;https://gitlab.example.com&amp;#34;&#9; # Must use https protocol&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;letsencrypt[&amp;#39;contact_emails&amp;#39;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;[&amp;#39;foo@email.com&amp;#39;] # Optional&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;生成163邮箱授权密码&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d909bef7.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554263126117.png" class="gallery-image" data-flex-basis="397px" data-flex-grow="165" height="567" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d909bef7.png" width="938"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;生成GitHub授权秘钥&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d8fef5f8.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554262788318.png" class="gallery-image" data-flex-basis="945px" data-flex-grow="393" height="311" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d8fef5f8.png" width="1225"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2019/04/03/5ca46d9022cde.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="1554262821319.png" class="gallery-image" data-flex-basis="336px" data-flex-grow="140" height="559" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2019/04/03/5ca46d9022cde.png" width="784"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;最终配置&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;gitlab&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;GITLAB_OMNIBUS_CONFIG&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; external_url &amp;#39;外部访问地址&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;gitlab_shell_ssh_port&amp;#39;] = 外部SSH端口&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; registry_external_url &amp;#39;Docker私服地址&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; registry_nginx[&amp;#39;ssl_certificate&amp;#39;] = &amp;#34;Docker 私服CA证书 crt文件&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; registry_nginx[&amp;#39;ssl_certificate_key&amp;#39;] = &amp;#34;Docker 私服公钥 pem文件&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_enable&amp;#39;] = true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_address&amp;#39;] = &amp;#34;smtp.163.com&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_port&amp;#39;] = 465&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_user_name&amp;#39;] = &amp;#34;邮件发送者名称&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;gitlab_email_from&amp;#39;] = &amp;#39;邮件发送地址&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_password&amp;#39;] = &amp;#34;授权密码&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_domain&amp;#39;] = &amp;#34;163.com&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_authentication&amp;#39;] = &amp;#34;login&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_enable_starttls_auto&amp;#39;] = true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;smtp_tls&amp;#39;] = true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;omniauth_enabled&amp;#39;] = true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;omniauth_allow_single_sign_on&amp;#39;] = true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;omniauth_block_auto_created_users&amp;#39;] = true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; gitlab_rails[&amp;#39;omniauth_providers&amp;#39;] = [&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;#34;name&amp;#34; =&amp;gt; &amp;#34;github&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;#34;app_id&amp;#34; =&amp;gt; &amp;#34;Client ID&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;#34;app_secret&amp;#34; =&amp;gt; &amp;#34;Client Secret&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;#34;url&amp;#34; =&amp;gt; &amp;#34;https://github.com/&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;#34;args&amp;#34; =&amp;gt; { &amp;#34;scope&amp;#34; =&amp;gt; &amp;#34;user:email&amp;#34; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; ]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;gitlab/gitlab-ce:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;gitlab.fjy8018.top&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;devops-service-bridge&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;8443:443&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;8099:8099&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;8022:22&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./srv/gitlab/config:/etc/gitlab&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./srv/gitlab/logs:/var/log/gitlab&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./srv/gitlab/data:/var/opt/gitlab&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/etc/docker/certs.d:/etc/docker/certs.d&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;devops-service-bridge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;bridge&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>