构建伟大,无所不能

一、环境准备

  1、运行环境Linxu系统 CentOS7.5【腾讯云】

  2、安装Docker:https://www.cnblogs.com/whereGo/p/12427247.html

二、Jenkins 是什么?

  Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。

  Jenkins支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。

三、CI&CD是什么?

  CI(Continuous integration,中文意思是持续集成)是一种软件开发时间。持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。

  CD(Continuous Delivery, 中文意思持续交付)是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境。

四、在Docker中下载并运行Jenkins

docker run \
  -u root \
  --restart=always \
  --name jenkins \
  -d \
  -p 8080:8080 \
  -p 50000:50000 \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean

(1)--restart=always:Docker重启时自动启动jenkinsci/blueocean。

(2)-d:jenkinsci/blueocean 在后台运行容器(即“分离”模式)并输出容器ID。如果您不指定此选项, 则在终端窗口中输出正在运行的此容器的Docker日志。

(3)-p 8080:8080:映射(例如“发布”)jenkinsci/blueocean 容器的端口8080到主机上的端口8080。 第一个数字代表主机上的端口,而最后一个代表容器的端口。
因此,如果您为此选项指定 -p 49000:8080 ,您将通过端口49000访问主机上的Jenkins。

(4)-p 50000:50000:将 jenkinsci/blueocean 容器的端口50000 映射到主机上的端口50000。 如果您在其他机器上设置了一个或多个基于JNLP的Jenkins代理程序,而这些代理程序又与 jenkinsci/blueocean 容器交互(充当“主”Jenkins服务器,或者简称为“Jenkins主”), 则这是必需的。默认情况下,基于JNLP的Jenkins代理通过TCP端口50000与Jenkins主站进行通信。
您可以通过“ 配置全局安全性” 页面更改Jenkins主服务器上的端口号。如果您要将您的Jenkins主机的JNLP代理端口的TCP端口 值更改为51000(例如),那么您需要重新运行Jenkins(通过此 docker run …​命令)并指定此“发布”选项 -p 52000:51000,其中最后一个值与Jenkins master上的这个更改值相匹配,
第一个值是Jenkins主机的主机上的端口号, 通过它,基于JNLP的Jenkins代理与Jenkins主机进行通信 - 例如52000。

 

五、初始化:

 1、查看启动日志

docker logs charming_austin

 2、进入到Jenkins容器,进入上面的路径查看密码存储的文件

docker exec -it jenkins bash
cat /var/jenkins_home/secrets/initialAdminPassword

复制密码,在页面中密码框中粘贴,并点击继续。

3、设置Jenkins本地化(不需要本地化的可以跳过)

 

 

六、准备.Net项目

1、我这里使用的是基于.Net5.0的Abp VNext项目

2、选择添加=>Docker支持..。现在会弹出Docker文件选项提示框,选择Linux点击确定按钮即可。如下图所示:

3、然后项目列表中会出现一个Dockerfile文件。如下图:

4、做完上述操作,把项目推送到Github上。

七、持续部署

1、登录Jenkins点击系统管理->插件管理->下载Github插件(现在新版本的Jenkins都自动安装了Github插件)。

2、安装好插件后,返回首页。选择“新建任务”=》“构建一个自由风格的软件项目”,输入任务名称,然后点击确定。如下图所示:

3、如步骤2点击确定按钮以后会跳转到配置页面,在该页面对任务进行配置。具体流程如下:

a、General主要是设置该任务的一些基本信息。

 

b、源码管理选择Git,在Repository URL中输入源代码地址,在Credentials中添加登录Git的用户凭证信息,点击高级按钮可以设置源代码分支。如下图所示:

 

c、构建触发器是指在达到什么条件下触发自动化构建

d、构建环境可以根据自己的需求进行设置,在这里我只设置了“Abort the build if it's stuck”如果生成被卡住,自动中止。

e、在构建中点击“增加构建步骤”下拉框,选中“执行shell”。然后在输入框中输入执行命令。如下所示:

#!/bin/bash
image_version=`date +%Y%m%d%H%M`;    #设置image版本号
echo $image_version;        #在控制台显示当前版本号

# 停止之前的docker container
CID=$(docker ps | grep "abpapplicationbase" | awk '{print $1}')     #查询Container Id
echo $CID
if [ "$CID" != "" ];then
  docker stop $CID     #停止容器
  docker rm $CID       #删除容器
fi

# 进入项目根目录
cd /var/jenkins_home/workspace/AbpApplicationBase/aspnet-core
# build镜像并且打上tag
docker build -t abpapplicationbase:$image_version -f src/AbpApplicationBase.HttpApi.Host/Dockerfile .
docker images;
# 把刚刚build出来的镜像跑起来
docker run -p 80:80 -p 443:443 --name abpapplicationbase -d abpapplicationbase:$image_version;
# 删除构建镜像过程中生成的无名称临时镜像
docker rmi $(docker images -f "dangling=true" -q)
docker logs abpapplicationbase;

f:构建后操作(在构建成功以后需要执行的下一步操作)。该操作暂时无需使用,就不做详细说明。

g:点击应用,在点击保存按钮。

4、返回首页,执行构建。

 

 

 5、在构建历史中可以查看构建是否成功。如下图所示:

 6、在浏览器中输入服务器ip(或指定的域名)和在“e”步骤中指定的端口就可以正常访问了。如下图所示(因为我通过nginx做了反向代理所以端口和“e”中不一致):