DevOps之自动部署,net6+jenkins+docker+gitee来实现自动部署
<p> devops是敏捷开发升级版,他主要解决的是开发跟运维的协助性问题,通过自动化的方式,减少人工错误,从而提升人与人之间的沟通和犯错成本,及部署效率;由于DevOps是一组过程、方法与系统的统称,所以我来讲讲DevOps的持续集成/持续构建实现方式,持续集成/持续构建是实现DevOps理念的一种工具及思想之一,简单来说就是通过自动化部署来减少人员工作量的部署工具,所以市面上各种持续集成产品应运而生,如jenkins,gitee企业版,coding等;市面上还有很多收费的持续集成工具都非常好用及简单,而且价格也实惠;但今天我讲的主要是jenkins工具的解决方案;</p><p><span style="font-size: 16px"><strong>概念:</strong></span></p>
<p> 1.jenkins</p>
<p> 是一款开源的持续集成工具,可以用于日常管理服务的发布,能快速发布到线上进行测试</p>
<p> 2.shell</p>
<p> 是一种脚本语言,可用于脚本代码,控制linux系统,在持续集成工具上能起到自动发布的主要作用()</p>
<p> 3.ansible</p>
<p> 是一种批量执行命令的工具,在微服务存在多个服务执行同一个脚本时,就可以通过此工具达到批量的作用,本文不选择安装</p>
<p><strong><span style="font-size: 16px">流程:</span></strong></p>
<p> 拉取项目文件→生成项目镜像→远程登录项目服务器→拉取镜像</p>
<p><strong><span style="font-size: 16px">一、准备工作:</span></strong></p>
<p> 1.安装docker(自行百度安装)</p>
<p> 2.通过docker安装jenkins;注意由于jenkins是安装在docker的,而我们运行的docker脚本,所以需要配置jenkins,插件(https://blog.csdn.net/zsd498537806/article/details/81132522)</p>
<p>最后启动时还要挂载/bin/sh的目录,作用是为了在docker内运行shell;(自行百度安装)</p>
<p> 3.远程服务器开启免密登录</p>
<p><strong><span style="font-size: 16px">二、配置免登录</span></strong></p>
<p> 1.生产密钥</p>
<div class="cnblogs_code">
<pre>ssh-keygen</pre>
</div>
<p> 2.查看密钥</p>
<div class="cnblogs_code">
<pre>ll /root/.ssh</pre>
</div>
<p><img src="https://img2023.cnblogs.com/blog/612547/202302/612547-20230226085913527-344774644.png"></p>
<p> </p>
<p> 3.密钥管理</p>
<p> 2.3 免密登录设置:</p>
<p> 2.3.1 免密登录文件说明</p>
<p> id_rsa是私钥<br> id_rsa.pub是公钥,需要把公钥发送给被管主机<br> 2.3.2 使用模式:<br> ssh-copy-id [-i ] machine<br> -i:指定公钥文件<br> 把本地的ssh公钥文件安装到远程主机对应的账户下:<br> ssh-copy-id user@server(命令语句,下面是例子)<br> ssh-copy-id -i ~/.ssh/id_rsa.pub user@server<br><strong><span style="font-size: 16px">三、docker安装jenkins</span></strong></p>
<p> 3.1拉取jenkins镜像</p>
<div class="cnblogs_code">
<pre>docker pull jenkins/jenkins</pre>
</div>
<p> 3.2安装完毕后,通过docker启动jenkins</p>
<div class="cnblogs_code">
<pre>docker run -d -u 0 -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -v /var/jenkins_home:/var/jenkins_home -v /bin/sh:/bin/sh-p 8080:8080 jenkins/jenkins</pre>
</div>
<p> 3.3启动完毕后后,我们进入正常的jenkins配置流程,最后我们进入到下面的界面</p>
<p><img src="https://img2023.cnblogs.com/blog/612547/202302/612547-20230223002856950-1992723012.png"></p>
<p> 3.4接下来我们来配置gitee,首先我们在jenkins下载gitee</p>
<p><img src="https://img2023.cnblogs.com/blog/612547/202302/612547-20230223003300619-451924786.png"></p>
<p> 3.5接下来我们只需要新增一个jenkins项目,然后设置gitee</p>
<p><img src="https://img2023.cnblogs.com/blog/612547/202302/612547-20230223005804574-895537735.png"></p>
<p><img src="https://img2023.cnblogs.com/blog/612547/202302/612547-20230223005819959-1862574030.png"></p>
<p> 3.6去gitee生成令牌</p>
<p><img src="https://img2023.cnblogs.com/blog/612547/202302/612547-20230223005910069-1349680657.png"></p>
<p> 3.7上面gitee私人令牌都可以根据提示之间生成即可</p>
<p> 3.8 最后设置shell执行及执行命令</p>
<p><img src="https://img2023.cnblogs.com/blog/612547/202302/612547-20230223011004541-1600566734.png"></p>
<p> 3.9这个远程构建只是通过docker镜像的方式来实现远程构建,当然也可以通过git来在远程服务器拉取文件后构建dockerfile来发布,值得注意的是,上面出现了明文,在生产环境中是不允许,所以我们尽量避免这样的脚步;最后点击保存。</p>
<p><strong><span style="font-size: 16px">四、项目的dockerfile配置</span></strong></p>
<p> 接下来我们要来配置net6项目,我们需要在net6项目新建一个dockerfile文件,文件内容如下,最后把项目上传到gitee。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 128, 128, 1)">FROM</span> mcr.microsoft.com/dotnet/aspnet:6.0<span style="color: rgba(0, 0, 0, 1)"> AS base
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 128, 128, 1)">RUN</span> echo "deb http://mirrors.aliyun.com/debian stretch main contrib non-free \
<span style="color: rgba(0, 128, 128, 1)"> 4</span> deb-src http://mirrors.aliyun.com/debian stretch main contrib non-free \
<span style="color: rgba(0, 128, 128, 1)"> 5</span> deb http://mirrors.aliyun.com/debian stretch-updates main contrib non-free \
<span style="color: rgba(0, 128, 128, 1)"> 6</span> deb-src http://mirrors.aliyun.com/debian stretch-updates main contrib non-free \
<span style="color: rgba(0, 128, 128, 1)"> 7</span> deb http://mirrors.aliyun.com/debian-security stretch/updates main contrib non-free \
<span style="color: rgba(0, 128, 128, 1)"> 8</span> deb-src http://mirrors.aliyun.com/debian-security stretch/updates main contrib non-free \
<span style="color: rgba(0, 128, 128, 1)"> 9</span> deb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib \
<span style="color: rgba(0, 128, 128, 1)">10</span> deb-src http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib" > /etc/apt/sources.list
<span style="color: rgba(0, 128, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 128, 128, 1)">RUN</span><span style="color: rgba(0, 0, 0, 1)"> apt-get update
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 128, 128, 1)">RUN</span><span style="color: rgba(0, 0, 0, 1)"> apt-get install -y libgdiplus
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 128, 128, 1)">RUN</span><span style="color: rgba(0, 0, 0, 1)"> apt-get install -y fontconfig
</span><span style="color: rgba(0, 128, 128, 1)">15</span>
<span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 128, 128, 1)">WORKDIR</span><span style="color: rgba(0, 0, 0, 1)"> /app
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 128, 128, 1)">EXPOSE</span> 8000
<span style="color: rgba(0, 128, 128, 1)">18</span>
<span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 128, 128, 1)">FROM</span> mcr.microsoft.com/dotnet/sdk:6.0<span style="color: rgba(0, 0, 0, 1)"> AS build
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 128, 128, 1)">WORKDIR</span><span style="color: rgba(0, 0, 0, 1)"> /src
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 128, 128, 1)">COPY</span> ["WebApplication1.csproj", "WebApplication1/"<span style="color: rgba(0, 0, 0, 1)">]
</span><span style="color: rgba(0, 128, 128, 1)">22</span>
<span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 128, 128, 1)">COPY</span><span style="color: rgba(0, 0, 0, 1)"> . .
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 128, 128, 1)">WORKDIR</span> "/src"
<span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 128, 128, 1)">RUN</span> dotnet build "WebApplication1.csproj"<span style="color: rgba(0, 0, 0, 1)"> -c Release -o /app/build
</span><span style="color: rgba(0, 128, 128, 1)">26</span>
<span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 128, 128, 1)">FROM</span><span style="color: rgba(0, 0, 0, 1)"> build AS publish
</span><span style="color: rgba(0, 128, 128, 1)">28</span> <span style="color: rgba(0, 128, 128, 1)">RUN</span> dotnet publish "WebApplication1.csproj"<span style="color: rgba(0, 0, 0, 1)"> -c Release -o /app/publish
</span><span style="color: rgba(0, 128, 128, 1)">29</span>
<span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 128, 128, 1)">FROM</span><span style="color: rgba(0, 0, 0, 1)"> base AS final
</span><span style="color: rgba(0, 128, 128, 1)">31</span>
<span style="color: rgba(0, 128, 128, 1)">32</span> #<span style="color: rgba(0, 128, 128, 1)">FROM</span><span style="color: rgba(0, 0, 0, 1)"> harbor.xhyun.vip/k8s-dev/xuehua-base:latest AS final
</span><span style="color: rgba(0, 128, 128, 1)">33</span> <span style="color: rgba(0, 128, 128, 1)">WORKDIR</span><span style="color: rgba(0, 0, 0, 1)"> /app
</span><span style="color: rgba(0, 128, 128, 1)">34</span> <span style="color: rgba(0, 128, 128, 1)">COPY</span><span style="color: rgba(0, 0, 0, 1)"> --from=publish /app/publish .
</span><span style="color: rgba(0, 128, 128, 1)">35</span> #<span style="color: rgba(0, 128, 128, 1)">RUN</span> cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai'<span style="color: rgba(0, 0, 0, 1)"> >/etc/timezone
</span><span style="color: rgba(0, 128, 128, 1)">36</span> <span style="color: rgba(0, 128, 128, 1)">RUN</span><span style="color: rgba(0, 0, 0, 1)"> unlink /etc/localtime
</span><span style="color: rgba(0, 128, 128, 1)">37</span> <span style="color: rgba(0, 128, 128, 1)">RUN</span><span style="color: rgba(0, 0, 0, 1)"> ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
</span><span style="color: rgba(0, 128, 128, 1)">38</span> <span style="color: rgba(0, 128, 128, 1)">ENTRYPOINT</span> ["dotnet", "WebApplication1.dll"]</pre>
</div>
<p> 4.1最后我们在jenkins进行构建</p>
<p><img src="https://img2023.cnblogs.com/blog/612547/202302/612547-20230223011513025-347275638.png"></p>
<p><img src="https://img2023.cnblogs.com/blog/612547/202302/612547-20230223011528383-535287344.png"></p>
<p> </p>
<p> 4.2 可以看到构建成功了,接下来我们看看我们的远程服务器是否成功发布了net6项目,如下图可以看出确实成功发布了<img src="https://img2023.cnblogs.com/blog/612547/202302/612547-20230223011851118-651350148.png"></p>
<p><span style="font-size: 16px"><strong> 总结:</strong></span></p>
<p> 到这里其实我们实现自动化部署是一个非常简单的事情,但正式环境下,我们就要特别注意服务器的安全问题了。在自动化部署下,其实在实现自动化时我们需要对shell脚本和dockerfile的命令有所了解,当然融会贯通更好,但是我们每个人的精力有限,有些工具或者语言可以不用深入了解,好了今天的分享到这里了,谢谢大家的观看!</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/weirun/p/17115040.html
頁:
[1]