Gogs+Jenkins+Docker 自动化部署.NetCore
<h2 id="环境说明"><font color="#6495cd"><strong>环境说明</strong></font></h2><hr>
<ul>
<li>腾讯云轻量服务器, 配置 <code>1c 2g 6mb</code> ,系统是 <code>ubuntu 20.14</code>,Docker 和 Jenkins 都在这台服务器上面,</li>
<li>群晖218+一台,Gogs 在这台服务器上。</li>
</ul>
<h2 id="docker安装"><font color="#6495cd"><strong>Docker安装</strong></font></h2>
<hr>
<ul>
<li>
<p>卸载旧的 Docker<br>
<code>sudo apt-get remove docker docker-engine docker.io containerd runc</code></p>
</li>
<li>
<p>更新 apt 包索引并安装包以允许 apt 通过 HTTPS 使用存储库</p>
<pre><code class="language-powershell">sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
</code></pre>
</li>
<li>
<p>添加 Docker 官方的 GPG 密钥<br>
<code>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg</code></p>
</li>
<li>
<p>安装 Docker<br>
<code>sudo apt-get install docker-ce docker-ce-cli containerd.io</code></p>
</li>
<li>
<p>通过运行 hello-world 验证 Docker 是否已正确安装。输出 Hello from Docker! 表示安装成功<br>
<code>sudo docker run hello-world</code></p>
</li>
<li>
<p>不同的系统安装方式可以查阅 docker 官方安装说明</p>
</li>
</ul>
<h2 id="gogs安装"><font color="#6495cd"><strong>Gogs安装</strong></font></h2>
<hr>
<p>Gogs 是一款用 Go 语言开发的轻量级极易搭建的自助 Git 服务。 选择 Gogs 主要因为它相对于 Gitlab 动则几个G的内用暂用率来说轻太多了。Gogs 会大大减低系统消耗,跑起来也就占用100mb内存。我的 Gogs 是跑在群晖上面的,效果都是一样,都是在 Docker 中托管</p>
<ul>
<li>
<p>拉取 Gogs 镜像<br>
<code> sudo docker pull gogs/gogs</code></p>
</li>
<li>
<p>创建 Gogs 文件挂载路径<br>
<code>mkdir -p /var/gogs</code></p>
</li>
<li>
<p>启动容器 6022 是 https,6080 是 http,可以通过 <code>docker ps</code> 命令来查看是否启动成功。<br>
<code>docker run -d --name=my_gogs -p 6022:22 -p 6080:3000 -v /var/gogs:/data gogs/gogs</code></p>
</li>
<li>
<p>容器启动后通过 <code>http://xxxxxxxx:6080</code> 进行 Gogs 的初始配置<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210624195512.png" width="600" height="600" alt="图片名称"></p>
</li>
<li>
<p>数据库类型建议选择 linux 自带的 SQLite3 ,支撑十几个人左右的团队使用足够了。域名填写 Gogs 所在服务器的域名或者 ip 地址。http 端口号和容器内部端口一致,应用 URL 填写访问 Gogs 的域名端口或 ip 端口,点击安装后注册一个新用户登陆即可<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210624200305.png" width="600" height="200" alt="图片名称"></p>
</li>
<li>
<p>Gogs安装完成后新建一个 Demo 仓库稍后使用<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210624201202.png" width="400" height="400" alt="图片名称"></p>
</li>
<li>
<p>Gogs 官方文档</p>
</li>
</ul>
<h2 id="docker中托管netcore服务"><font color="#6495cd"><strong>Docker中托管.NetCore服务</strong></font></h2>
<hr>
<ul>
<li>
<p>新建一个 WebApi 项目<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210624202730.png" width="600" height="400" alt="图片名称"></p>
</li>
<li>
<p>项目中增加一个 DockerFile 文件并且简单配置</p>
</li>
</ul>
<pre><code class="language-powershell"># 指定依赖版本
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim
WORKDIR /app
COPY . /publish
WORKDIR /publish
# 设置Docker容器对外暴露端口
EXPOSE 80
# 设置时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone
# 程序入口
ENTRYPOINT ["dotnet", "DemoWebApi.dll"]
</code></pre>
<ul>
<li>发布Api服务,如果发布文件中没有 DockerFile 文件需要手动修改项目文件,发布成功后将发布文件 copy 到服务器指定的文件夹中</li>
</ul>
<pre><code class="language-csharp"> <ItemGroup>
<None Update="Dockerfile">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</code></pre>
<ul>
<li>
<p>进入服务器刚 copy 的发布文件根路径下,执行 <code>docker build -t {REPOSITORY}:{TAG} .</code> 命令 通过 DockerFile 来生成 Docker 镜像文件,REPOSITORY 是镜像的名字,TAG 是标签。譬如 <code>docker build -t demo:v1 .</code><br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210625155704.png" width="600" height="50" alt="图片名称"><br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210625160527.png" width="600" height="300" alt="图片名称"></p>
</li>
<li>
<p>通过 <code>docker images</code> 命令来查看生成的所有镜像<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210625160633.png" width="600" height="100" alt="图片名称"></p>
</li>
<li>
<p>镜像生成成功后就可以通过镜像创建并运行容器了。执行 <code>docker run --name demoapi -dp 5009:80/tcp demo:v1</code>命令创建并运行容器<br>
-d:后台运行容器,并返回容器ID;<br>
-p:指定端口映射,格式为:主机(宿主)端口:容器端口,容器的端口就是你程序启动的端口,建议直接在项目中写死。<br>
-- name:容器名字</p>
</li>
<li>
<p>执行后可以通过 <code>docker ps</code> 查看所有运行起来的容器状态,需要查看所有容器可以使用 <code>docker ps -a</code> 命令<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210625164639.png" width="600" height="100" alt="图片名称"></p>
</li>
<li>
<p>用 postman 测试一下是否部署成功了<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210625165012.png" width="600" height="430" alt="图片名称"></p>
</li>
<li>
<p>列举一些docker常用命令</p>
<ul>
<li><code>docker restart {容器id}</code> #重启容器</li>
<li><code>docker start {容器id}</code> #启动容器</li>
<li><code>docker attach {容器id}</code> # 这样进入容器退出会导致容器也退出,attach 可以用户看容器的标准输出</li>
<li><code>docker attach {容器id} --sig-proxy=false</code> # 加上参数不会导致同期退出</li>
<li><code>docker exec -it {容器id} /bin/bash</code> # 进入容器需要在容器中执行命令需要使用 exec 命令</li>
<li><code>docker logs {容器id} -f </code> # 跟踪日志输出 -f 跟踪日志输出</li>
<li><code>docker rm -f {容器id}</code> # 删除已经停止的容器</li>
<li><code>docker rmi {REPOSITORY:TAG}</code> # 删除指定镜像</li>
<li><code>docker image prune</code> # 删除悬空镜像,也就是没有被容器引用的镜像</li>
</ul>
</li>
</ul>
<p>到这里服务已经在 Docker 完成了托管,但是每次发布都需要 build 新的镜像,然后停止老的容器,在创建一个新的容器,无形中增加了工作量。Jenkins 可以替我们完成这些工作</p>
<h2 id="jenkins安装"><font color="#6495cd"><strong>Jenkins安装</strong></font></h2>
<hr>
<ul>
<li>
<p>Jenkins 是依赖 java 的,所以需要安装 java 的 sdk,这里选择 java8<br>
<code>sudo apt-get install openjdk-8-jdk</code></p>
</li>
<li>
<p>安装 LTS 版本的 Jenkins</p>
</li>
</ul>
<pre><code>wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > \
/etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
</code></pre>
<ul>
<li>
<p>查看运行状态<code>systemctl status jenkins</code>正常会输出如下内容<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210625191111.png" width="400" height="100" alt="图片名称"></p>
</li>
<li>
<p>Jenkins 默认端口是 8080,安装成功后通过 <code>http://xxxx:8080</code> 即可访问,第一步需要先解锁,管理员密码会在安装成功后输出,也可以通过命令 <code>cat /var/lib/jenkins/secrets/initialAdminPassword</code><br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210625191539.png" width="400" height="200" alt="图片名称"></p>
</li>
<li>
<p>输入密码后进入初始化页面,选择安装推荐插件<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/02C4BE19-FD89-4E62-857C-4316AD93820D.png" width="600" height="200" alt="图片名称"></p>
</li>
<li>
<p>插件安装进度,需要一些些时间<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/F615F80C-A94C-4D4C-A112-0350F603BE1F.png" width="600" height="200" alt="图片名称"></p>
</li>
<li>
<p>结束后创建管理账号登录即可,进入系统管理,选择插件管理,搜索<code>gogs</code>插件后安装。<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210625194731.png" width="600" height="600" alt="图片名称"></p>
</li>
<li>
<p>安装后需要重启一下 Jenkins,访问链接 <code>http://xxxx:8080/restart</code> 后点击重启,或者通过执行 <code>service jenkins restart</code> 重启<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210625195623.png" width="600" height="600" alt="图片名称"></p>
</li>
<li>
<p>为了方便执行脚本,需要让 Jenkins 以 root 用户来运行,编辑文件 <code>vim /etc/sysconfig/jenkins</code> 或 <code>vim /etc/default/jenkins</code> 取消 <code>JENKINS_USER</code> 注释,并把值设置成 <code>JENKINS_USER="root"</code> 后修改文件夹权限</p>
</li>
</ul>
<pre><code class="language-shell">chown -R root:root /var/lib/jenkins
chown -R root:root /var/cache/jenkins
chown -R root:root /var/log/jenkins
</code></pre>
<ul>
<li>jenkins 常用操作
<ul>
<li>启动 <code>service jenkins start</code></li>
<li>重启 <code>service jenkins restart</code> 或访问 <code>http://xxxx:8080/restart</code></li>
<li>停止 <code>service jenkins stop</code> 或访问 <code>http://xxxx:8080/exit</code></li>
<li>重新加载配置文件 <code>http://xxxx:8080/reload</code></li>
</ul>
</li>
</ul>
<h2 id="使用jenkins自动化"><font color="#6495cd"><strong>使用Jenkins自动化</strong></font></h2>
<hr>
<ul>
<li>
<p>因为需要在服务器上 build 项目,所以需要安装 .NetCore 环境,可以查阅 微软官方文档 自行安装</p>
</li>
<li>
<p>把新建的项目推送到 Gogs 仓库中后点击仓库高级设置<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210626092922.png" width="600" height="600" alt="图片名称"></p>
</li>
<li>
<p>选择 Web 钩子,添加新 Gogs 的 Web 钩子<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210626093349.png" width="600" height="600" alt="图片名称"></p>
</li>
<li>
<p>配置 Web 钩子,推送地址前面是 Jenkins 的访问链接,后面 job 名字可以自己定义,选择只有在 push 的时候触发钩子,也可以自己选定事件<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210626094236.png" width="600" height="600" alt="图片名称"></p>
</li>
<li>
<p>添加后重新点击管理 Web 钩子,选择刚才新建的钩子,点击测试推送来验证是否正常,抛出的异常如果是 job 未定义说明钩子是正常的,如果是其他的异常可以查看推送地址是否正确,以及 Jenkins 上的 Gogs 插件是否正确安装<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210626100400.png" width="600" height="600" alt="图片名称"></p>
</li>
<li>
<p>回到 Jenkins 页面,新建一个任务,任务名就是之前 Gogs 里面的 job 名字,选择构建自由风格的软件项目<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210626102103.png" width="600" height="600" alt="图片名称"></p>
</li>
<li>
<p>添加仓库配置,Repository URL 是你的仓库地址,点击添加你的仓库凭据信息,最后指定操作的分支<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210626113255.png" width="600" height="600" alt="图片名称"></p>
</li>
<li>
<p>构建选择执行shell脚本,脚本也可以放在服务器上这里调用就行,为了方便就直接写在这里<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210626113825.png" width="600" height="600" alt="图片名称"><br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210626171031.png" width="600" height="600" alt="图片名称"></p>
</li>
</ul>
<pre><code class="language-powershell">
# 判断是否存在demo镜像是否存在
docker images | grep demo &> /dev/null
if [ $? -ne 0 ]
then
# 不存在不做处理
echo "not existed demo"
else
# 如果镜像存在默认认为容器也是在运行状态
echo "existed demo"
# 停止删除容器和镜像
docker stop demoapi
docker rm -f demoapi
docker rmi demo:v1
fi
# 重新build后生成镜像并运行容器
cd DemoWebApi/
# 发布到到指定路径
dotnet publish -c Release -o /publish
# 进入路径生成镜像后启动容器
cd /publish
docker build -t demo:v1 .
docker run --name demoapi -dp 5009:80/tcp demo:v1
</code></pre>
<ul>
<li>
<p>保存后点击立即构建验证一下,如果构建失败可以在控制台输出中查看详细构建过程和错误信息<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210626165436.png" width="300" height="300" alt="图片名称"></p>
</li>
<li>
<p>回到 Gogs 的管理 Web 钩子页面重新推送,成功后 Jenkins 会自动构建发布,之后只要 Push 到 Master 分支就会自动发布<br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210626165821.png" width="300" height="300" alt="图片名称"><br>
<img src="https://linhuicnblogs.oss-cn-beijing.aliyuncs.com/20210626165834.png" width="300" height="300" alt="图片名称"></p>
</li>
</ul>
<h2 id="总结"><font color="#6495cd"><strong>总结</strong></font></h2>
<hr>
<p>简单记录了自己折腾的全过程,Jenkins 和 Docker 还有很多功能,要在使用过程中慢慢了解。</p><br><br>
来源:https://www.cnblogs.com/linhuiy/p/14943788.html
頁:
[1]