Jenkins + Gitee + .Net6 实现持续集成与持续交付(CI/CD)
<h1 id="目标">目标</h1><p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210142012660-677935344.png" alt="image" loading="lazy"><br>
<strong>创建一个.Net6项目,结合Jenkins、Gitee实现CI/CD</strong> (当编写完代码,并提交到Gitee仓库之后,Jenkins自动帮我们测试,打包,发布项目)</p>
<blockquote>
<p>关于Jenkins,Docker 的环境搭建可以参考我的上一篇文章<br>
https://www.cnblogs.com/kizuna1314/p/15660880.html</p>
</blockquote>
<h1 id="步骤">步骤</h1>
<ol>
<li>Gitee创建一个.Net6项目的仓库</li>
<li>Jenkins创建一个自由风格的软件项目</li>
<li>配置Jenkins和.Net6项目的关联</li>
<li>创建.Net6项目,编写接口代码,本文重点主要CI/CD,所以选择创建轻量的Minimal API项目</li>
<li>提交Gitee,查看CI/CD效果</li>
</ol>
<h1 id="创建项目">创建项目</h1>
<h6 id="gitee准备一个项目">Gitee准备一个项目</h6>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210144407851-464757745.png" alt="image" loading="lazy"></p>
<h2 id="新建一个自由风格的软件项目">新建一个自由风格的软件项目</h2>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210144715325-1277843664.png" alt="image" loading="lazy"></p>
<h6 id="配置构建需要的参数">配置构建需要的参数</h6>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210145709315-2092987257.png" alt="image" loading="lazy"><br>
<em>若出现操作过程中出现下图问题,并且Gitee信息填写正确,原因可能是项目需要开源才能访问到</em><br>
<img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210164825343-1229777699.png" alt="image" loading="lazy"><br>
<img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210165022883-874699948.png" alt="image" loading="lazy"></p>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210150150592-1649543682.png" alt="image" loading="lazy"></p>
<h6 id="选择添加的用户凭证">选择添加的用户凭证</h6>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210150255238-741283774.png" alt="image" loading="lazy"></p>
<h2 id="配置webhooks">配置webHooks</h2>
<h6 id="勾选并复制url">勾选并复制URL</h6>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210150430977-730537860.png" alt="image" loading="lazy"></p>
<h6 id="gitee配置webhooks">Gitee配置webHooks</h6>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210145330381-929569664.png" alt="image" loading="lazy"></p>
<h6 id="填写上一步骤拷贝的url">填写上一步骤拷贝的URL</h6>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210150808986-729073442.png" alt="image" loading="lazy"></p>
<h6 id="点击生成gitee-webhook-密码">点击生成Gitee WebHook 密码</h6>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210150908334-959571790.png" alt="image" loading="lazy"></p>
<h6 id="粘贴到webhook-密码签名密钥文本框中">粘贴到WebHook 密码/签名密钥文本框中</h6>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210151041358-1492475697.png" alt="image" loading="lazy"></p>
<h6 id="验证jenkins是否能拉取提交的内容">验证Jenkins是否能拉取提交的内容</h6>
<p>提交了一段代码<br>
<img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210151535067-1819606761.png" alt="image" loading="lazy"></p>
<h6 id="成功拉同步了gitee的更改接下来只需要把每次同步过来的代码发布即可">成功拉同步了Gitee的更改,接下来只需要把每次同步过来的代码发布即可</h6>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210151632712-828191912.png" alt="image" loading="lazy"></p>
<h6 id="下载net6-运行时由于我之前安装过所以直接显示100">下载.Net6 运行时(由于我之前安装过,所以直接显示100%)</h6>
<p>官网下载地址:https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-centos</p>
<p>Centos7系列版本可直接运行下面命令下载</p>
<pre><code>sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210152349063-735243847.png" alt="image" loading="lazy"></p>
<h6 id="查看安装">查看安装</h6>
<pre><code>dotnet --list-sdks
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210152716935-972123827.png" alt="image" loading="lazy"></p>
<h6 id="安装supervisor">安装supervisor</h6>
<pre><code>yum install -y supervisor
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210153048721-1259273676.png" alt="image" loading="lazy"></p>
<h6 id="查看所有-supervisor服务状态">查看所有 supervisor服务状态</h6>
<pre><code>supervisorctl status
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210153352452-1432226810.png" alt="image" loading="lazy"></p>
<h6 id="编写一个后台进程ini文件">编写一个后台进程(.ini)文件</h6>
<pre><code># 创建并编辑一个.ini文件,我这里以 "net6demo" 为例
vim /etc/supervisord.d/net6demo.ini
</code></pre>
<h6 id="文件内容">文件内容</h6>
<pre><code># !(https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210165543840-343976883.png)
command=dotnet net6test.dll --urls http://0.0.0.0:5000 # 这里改成实际的.dll文件 以及需要暴露的端口
directory=/pub # 这里是发布的文件路径,所以 需要在外面再创建pub文件夹
autorestart=true
startsecs=3
startretries=3
stdout_logfile=/logs/net6test.out.log
stderr_logfile=/logs/net6test.err.log
stdout_logfile_maxbytes=2MB
stderr_logfile_maxbytes=2MB
user=root
priority=999
numprocs=1
process_name=%(program_name)s_%(process_num)02d
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210153916836-1115525291.png" alt="image" loading="lazy"></p>
<h6 id="创建publogs-文件夹并给予读写权限">创建/pub、/logs 文件夹,并给予读写权限</h6>
<pre><code>mkdir /pub /logs
chmod -R 777/pub /logs
</code></pre>
<h6 id="启动supervisor后台进程">启动supervisor后台进程</h6>
<pre><code>supervisord -c /etc/supervisord.conf
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210155625540-1449825271.png" alt="image" loading="lazy"><br>
查看后台后台守护进程状态</p>
<pre><code>supervisorctl status
</code></pre>
<p><strong>进程名称需要记下来,因为后面我们重新发布的时候需要重启这个守护进程</strong><br>
<img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210160020572-841864807.png" alt="image" loading="lazy"></p>
<h2 id="配置ssh构建实现自动拉取并部署项目">配置ssh构建实现自动拉取并部署项目</h2>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210160522617-1340606258.png" alt="image" loading="lazy"></p>
<h6 id="选择增加构建步骤">选择增加构建步骤</h6>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210160720362-672073334.png" alt="image" loading="lazy"></p>
<h6 id="编写shell脚本">编写shell脚本</h6>
<pre><code>echo------------stopapp------------------
supervisorctl stop net6demo:net6demo_00
echo------------publish------------------
cd /app/net6test/net6test
dotnet publish -o /pub
echo------------delcode------------------
cd /app
rm -rf *
echo------------online------------------
supervisorctl start net6demo:net6demo_00
</code></pre>
<h6 id="编辑完内容之后保存">编辑完内容之后,保存</h6>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210161442887-1571672530.png" alt="image" loading="lazy"></p>
<h6 id="立即构建看看是否拉取并发布了">立即构建,看看是否拉取并发布了</h6>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210161833412-1624705445.png" alt="image" loading="lazy"></p>
<h6 id="查看构建明细">查看构建明细</h6>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210163720788-1097333980.png" alt="image" loading="lazy"></p>
<p>我们可以看到,项目已经自动发布到/pub文件夹下面了<br>
<img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210162158911-449962762.png" alt="image" loading="lazy"></p>
<h6 id="访问接口">访问接口</h6>
<p>服务器本机访问</p>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210165905057-615294319.png" alt="image" loading="lazy"></p>
<p>web访问</p>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210163614631-289193068.png" alt="image" loading="lazy"></p>
<h2 id="更改项目内容提交gitee后看看是否会自动发布">更改项目内容,提交Gitee后看看是否会自动发布</h2>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210164037684-1296102018.png" alt="image" loading="lazy"><br>
<strong>几秒钟以后,服务器上的程序已经自动更新了</strong><br>
<img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210164123464-58034455.png" alt="image" loading="lazy"></p>
<h6 id="查看一下控制台">查看一下控制台</h6>
<p><img src="https://img2020.cnblogs.com/blog/1289480/202112/1289480-20211210164237947-277086588.png" alt="image" loading="lazy"></p>
<h4 id="以上就是net6结合jenkins实现cicd的全过程由于是重点介绍cicd-为了让大家更好的上手所以项目编写的比较简陋大家可以根据实际情况自由扩展">以上就是.Net6结合Jenkins实现CI/CD的全过程,由于是重点介绍CI/CD 为了让大家更好的上手,所以项目编写的比较简陋,大家可以根据实际情况自由扩展</h4><br><br>
来源:https://www.cnblogs.com/kizuna1314/p/15672682.html
頁:
[1]