Gogs+Jenkins+Docker 自动化部署.NetCore
环境说明
- 腾讯云轻量服务器, 配置
1c 2g 6mb,系统是ubuntu 20.14,Docker 和 Jenkins 都在这台服务器上面, - 群晖218+一台,Gogs 在这台服务器上。
Docker安装
卸载旧的 Docker
sudo apt-get remove docker docker-engine docker.io containerd runc更新 apt 包索引并安装包以允许 apt 通过 HTTPS 使用存储库
sudo apt-get update sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
添加 Docker 官方的 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg安装 Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io通过运行 hello-world 验证 Docker 是否已正确安装。输出 Hello from Docker! 表示安装成功
sudo docker run hello-world不同的系统安装方式可以查阅 docker 官方安装说明
Gogs安装
Gogs 是一款用 Go 语言开发的轻量级极易搭建的自助 Git 服务。 选择 Gogs 主要因为它相对于 Gitlab 动则几个G的内用暂用率来说轻太多了。Gogs 会大大减低系统消耗,跑起来也就占用100mb内存。我的 Gogs 是跑在群晖上面的,效果都是一样,都是在 Docker 中托管
拉取 Gogs 镜像
sudo docker pull gogs/gogs创建 Gogs 文件挂载路径
mkdir -p /var/gogs启动容器 6022 是 https,6080 是 http,可以通过
docker ps命令来查看是否启动成功。
docker run -d --name=my_gogs -p 6022:22 -p 6080:3000 -v /var/gogs:/data gogs/gogs容器启动后通过
http://xxxxxxxx:6080进行 Gogs 的初始配置

数据库类型建议选择 linux 自带的 SQLite3 ,支撑十几个人左右的团队使用足够了。域名填写 Gogs 所在服务器的域名或者 ip 地址。http 端口号和容器内部端口一致,应用 URL 填写访问 Gogs 的域名端口或 ip 端口,点击安装后注册一个新用户登陆即可

Gogs安装完成后新建一个 Demo 仓库稍后使用

Docker中托管.NetCore服务
新建一个 WebApi 项目

项目中增加一个 DockerFile 文件并且简单配置
# 指定依赖版本
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"]
- 发布Api服务,如果发布文件中没有 DockerFile 文件需要手动修改项目文件,发布成功后将发布文件 copy 到服务器指定的文件夹中
<ItemGroup>
<None Update="Dockerfile">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
进入服务器刚 copy 的发布文件根路径下,执行
docker build -t {REPOSITORY}:{TAG} .命令 通过 DockerFile 来生成 Docker 镜像文件,REPOSITORY 是镜像的名字,TAG 是标签。譬如docker build -t demo:v1 .


通过
docker images命令来查看生成的所有镜像

镜像生成成功后就可以通过镜像创建并运行容器了。执行
docker run --name demoapi -dp 5009:80/tcp demo:v1命令创建并运行容器
-d:后台运行容器,并返回容器ID;
-p:指定端口映射,格式为:主机(宿主)端口:容器端口,容器的端口就是你程序启动的端口,建议直接在项目中写死。
-- name:容器名字执行后可以通过
docker ps查看所有运行起来的容器状态,需要查看所有容器可以使用docker ps -a命令

用 postman 测试一下是否部署成功了

列举一些docker常用命令
docker restart {容器id}#重启容器docker start {容器id}#启动容器docker attach {容器id}# 这样进入容器退出会导致容器也退出,attach 可以用户看容器的标准输出docker attach {容器id} --sig-proxy=false# 加上参数不会导致同期退出docker exec -it {容器id} /bin/bash# 进入容器需要在容器中执行命令需要使用 exec 命令docker logs {容器id} -f# 跟踪日志输出 -f 跟踪日志输出docker rm -f {容器id}# 删除已经停止的容器docker rmi {REPOSITORY:TAG}# 删除指定镜像docker image prune# 删除悬空镜像,也就是没有被容器引用的镜像
到这里服务已经在 Docker 完成了托管,但是每次发布都需要 build 新的镜像,然后停止老的容器,在创建一个新的容器,无形中增加了工作量。Jenkins 可以替我们完成这些工作
Jenkins安装
Jenkins 是依赖 java 的,所以需要安装 java 的 sdk,这里选择 java8
sudo apt-get install openjdk-8-jdk安装 LTS 版本的 Jenkins
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
查看运行状态
systemctl status jenkins正常会输出如下内容

Jenkins 默认端口是 8080,安装成功后通过
http://xxxx:8080即可访问,第一步需要先解锁,管理员密码会在安装成功后输出,也可以通过命令cat /var/lib/jenkins/secrets/initialAdminPassword

输入密码后进入初始化页面,选择安装推荐插件

插件安装进度,需要一些些时间

结束后创建管理账号登录即可,进入系统管理,选择插件管理,搜索
gogs插件后安装。

安装后需要重启一下 Jenkins,访问链接
http://xxxx:8080/restart后点击重启,或者通过执行service jenkins restart重启

为了方便执行脚本,需要让 Jenkins 以 root 用户来运行,编辑文件
vim /etc/sysconfig/jenkins或vim /etc/default/jenkins取消JENKINS_USER注释,并把值设置成JENKINS_USER="root"后修改文件夹权限
chown -R root:root /var/lib/jenkins
chown -R root:root /var/cache/jenkins
chown -R root:root /var/log/jenkins
- jenkins 常用操作
- 启动
service jenkins start - 重启
service jenkins restart或访问http://xxxx:8080/restart - 停止
service jenkins stop或访问http://xxxx:8080/exit - 重新加载配置文件
http://xxxx:8080/reload
- 启动
使用Jenkins自动化
因为需要在服务器上 build 项目,所以需要安装 .NetCore 环境,可以查阅 微软官方文档 自行安装
把新建的项目推送到 Gogs 仓库中后点击仓库高级设置

选择 Web 钩子,添加新 Gogs 的 Web 钩子

配置 Web 钩子,推送地址前面是 Jenkins 的访问链接,后面 job 名字可以自己定义,选择只有在 push 的时候触发钩子,也可以自己选定事件

添加后重新点击管理 Web 钩子,选择刚才新建的钩子,点击测试推送来验证是否正常,抛出的异常如果是 job 未定义说明钩子是正常的,如果是其他的异常可以查看推送地址是否正确,以及 Jenkins 上的 Gogs 插件是否正确安装

回到 Jenkins 页面,新建一个任务,任务名就是之前 Gogs 里面的 job 名字,选择构建自由风格的软件项目

添加仓库配置,Repository URL 是你的仓库地址,点击添加你的仓库凭据信息,最后指定操作的分支

构建选择执行shell脚本,脚本也可以放在服务器上这里调用就行,为了方便就直接写在这里


# 判断是否存在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
保存后点击立即构建验证一下,如果构建失败可以在控制台输出中查看详细构建过程和错误信息

回到 Gogs 的管理 Web 钩子页面重新推送,成功后 Jenkins 会自动构建发布,之后只要 Push 到 Master 分支就会自动发布


总结
简单记录了自己折腾的全过程,Jenkins 和 Docker 还有很多功能,要在使用过程中慢慢了解。
Gogs+Jenkins+Docker 自动化部署.NetCore的更多相关文章
- Linux文档整理之【Jenkins+Docker自动化部署.Net Core】
这次整理的文档是Jenkins+Docker实现自动化部署,很早之前就写的,今天有时间就搬到博客园做个记录. Jenkins是基于Java开发的一种持续集成工具,主要用于持续.自动的构建/测试软件等相 ...
- .net core +gogs + jenkins +docker自动化发布、部署
1.首先,安装docker,不多bb 2.我们采用docker的方式安装jenkins,同时将宿主机的docker挂载到docker安装的jenkins里面,可能有点拗口.说白了就是 就是要让jenk ...
- CentOS下Docker与.netcore(四)之 三剑客之一Docker-machine+jenkins简单自动化部署
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客 ...
- 从零开始搭建Jenkins+Docker自动化集成环境
本文只简单标记下大概的步骤,具体搭建各个部分的细节,还请自行搜索.第一.二部分只是对Jenkins和Docker的简单介绍,熟悉的同学请直接跳到第三部分. 一.关于Jenkins Jenkins简介 ...
- Docker学习总结(13)——从零开始搭建Jenkins+Docker自动化集成环境
本文只简单标记下大概的步骤,具体搭建各个部分的细节,还请自行搜索.第一.二部分只是对Jenkins和Docker的简单介绍,熟悉的同学请直接跳到第三部分. 一.关于Jenkins Jenkins简介 ...
- 基于 Jenkins Pipeline 自动化部署
最近在公司推行Docker Swarm集群的过程中,需要用到Jenkins来做自动化部署,Jenkins实现自动化部署有很多种方案,可以直接在jenkins页面写Job,把一些操作和脚本都通过页面设置 ...
- gitlab与jenkins的自动化部署(通过webhook与ansilble)
gitlab与jenkins的自动化部署(通过webhook与ansilble) 1.部署介绍 gitlab服务器:192.168.1.49:80jenkins服务器:192.168.1.49:818 ...
- 搭建jenkins实现自动化部署
搭建jenkins实现自动化部署 一.安装jenkins 1.添加yum repos,然后安装 sudo wget -O /etc/yum.repos.d/jenkins.repo https://p ...
- 微服务项目的docker自动化部署流程
目录 微服务的Docker自动化部署 制作JDK1.8的Docker镜像 Docker常用命令介绍 制作image的一般流程 将本地的image上传至私人仓库 使用Maven插件实现自动化docker ...
随机推荐
- BUAA软件工程_结对编程
1.写在前面 项目 内容 所属课程 2020春季计算机学院软件工程(罗杰 任健) (北航) 作业要求 结对项目作业 课程目标 培养软件开发能力 本作业对实现目标的具体作用 培养结对编程开发项目的能力 ...
- 动态类型转换dynamic_cast
C++Primer第十九章的动态类型转换部分讲的不是很清楚,于是自己查cpp的官方手册总结一下. dynamic_cast < new-type > ( expression ) 动态类型 ...
- Java GUI学习,贪吃蛇小游戏
JAVA GUI练习 贪吃蛇小游戏 前几天虽然生病了,但还是跟着狂神学习了GUI的方面,跟着练习了贪吃蛇的小项目,这里有狂神写的源码点我下载,还有我跟着敲的点我下载,嘿嘿,也就注释了下重要的地方,这方 ...
- LTC3780 工作原理分析
流程分析 当 CV调节 调节顺时针调节CV的时候 接入电路部分的电阻变大 Vosense变小 LTC内部的误差放大器 输出的变大 LTC内部逻辑调节 增大电压 我估计最终电压还是大约800mv左右 可 ...
- 服务器RAID配置
一.RAID介绍RAID是Redundent Array of Inexpensive Disks的缩写,直译为"廉价冗余磁盘阵列",也简称为"磁盘阵列".后来 ...
- 关于RabbitMQ的一些问题总结
消息中间件在工作中一般都不会采用单机模式的,该篇其实是对mq的高可用等等常见问题做一些归纳. 消息队列的高可用 普通集群与镜像集群模式,此处不做深究,另开一篇专门讲述此处 如何保证消息不被重复消费 保 ...
- MySQL之数据查询语言(DQL)
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块: SELECT <字段> FROM <表名> WHERE <查询条件> - ...
- 【七】Kubernetes 探针介绍 - 存活、就绪探针案例测试
一.探针概述 探针是有 kubelet 对容器执行的定期诊断,并不是由 Master 节点发起的探测,而是由每一个 Node 所在的 kubelet 进行探测,这样可以减轻 Master 节点系统负载 ...
- 【pytest】使用parametrize将参数化变量传递到fixture
分享一个关于在pytest中,如何将测试用例文件中的变量传递到fixture函数. 一.交代应用场景 目前组内的项目,在根目录下是有一个conftest.py文件的,这里有个生成api token的f ...
- Go语言的函数06---闭包函数
package main import "fmt" /* 李逵和武松的Study方法的逻辑是几乎一模一样的 然而为了分别保存两人的学习进度,需要开辟两个全局变量,函数内部的需要使用 ...