专业的编程技术博客社区

网站首页 > 博客文章 正文

Jenkins+Docker+Net5 自动化部署(jenkins实现自动化部署)

baijin 2024-08-18 13:30:00 博客文章 6 ℃ 0 评论

前言

Jenkins自动化部署DotNet5到DocKer已经很多,这篇的写的目的是为我在部署的时候遇到的坑整理一份写出来。

准备工作

  • CentOS 7.x
  • Docker
  • Jenkins
  • 支持Docker的.Net5的项目,可以用我自己测试的项目(https://gitee.com/i386ee/jenkins-test-project.git),当然也可以用自己现有的项目

安装CentOS 7.x

大家可以根据自己习惯下载对应的版本,这边只是为了给大家演示用

1.下载VMware Workstation 16 Player(官方下载地址:https://www.vmware.com/products/workstation-player/workstation-player-evaluation.html)

2.下载CentOS 7.9(清华大学开源软件镜像 下载地址:https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64)

3.VM安装CentOS 7.9 安装过程就不演示了,大家可以自行头条,百度,谷歌搜一搜。

4.CentOS安装好,小编没有直接用VM直接操作系统,因为操作不方便,系统间需要来回切换,这边使用了国产大神开发的工具FinalShell(官方下载地址:http://www.hostbuf.com/t/988.html)连接操作。

安装Docker

1.如果是新的系统,则建议首先更新 yum 和系统内核

yum update

2.确保卸载旧版docker,干净系统不需要此不做

  • /var/lib/docker/ 下的镜像、容器、卷和网络都会保留
  • 旧版本中Docker被命名为dockerdocker-engine,现在被命名为docker-ce
yum remove docker \
           docker-client \
           docker-client-latest \
           docker-common \
           docker-latest \
           docker-latest-logrotate \
           docker-logrotate \
           docker-engine

4.安装 yum-utils(其提供了yum-config-manager,下方要用到)

yum install -y yum-utils

5.配置 yum 阿里云 docker 仓库

  • docker官方仓库: https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

6.安装 docker

yum install -y docker-ce docker-ce-cli containerd.io

7.配置 docker 镜像加速器

  • 获取加速器地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["这里填入你的加速器url"]
}
EOF

8.重启服务

CentOS 7.x开始,CentOS开始使用systemd服务来代替daemon,原来管理系统启动和管理系统服务的相关命令全部由systemctl命令来

sudo systemctl daemon-reload
sudo systemctl restart docker

9.查看 docker 信息

docker info

看到此信息代表已经成功安装了Docker

10.测试 hello-world

docker run hello-world


看到这个我们已经成功运行了。

Docker常用命令

  • docker build 构建镜像
  • docker images 可以列出本地主机上的镜像
  • docker rmi hello-world 删除镜像
  • docker run 运行镜像
  • docker logs 查看容器日记
  • docker rm 删除容器

可以参考:https://www.runoob.com/docker/docker-image-usage.html

安装Docker版的Jenkins

正常在 Docker 中拉取得 Jenkins:lts 是无法执行 dotnet 命令的(就算你宿主机有 dotnet 环境、docker 中也有 dotnet 环境也不可以), 所以我们只能构建一个包含 dotnet 的镜像

1.切换根目录

CD /


2.创建.dockerignore文件,编写.dockerignore内容如下:

*

3.创建Dockerfile文件,编写Dockerfile内容如下:

# 封装Jenkins镜像(带有dotnet环境的) sdk=5.1
FROM jenkins/jenkins:lts
USER root
WORKDIR /dotnet
RUN apt-get update
RUN apt-get install wget
RUN wget -O dotnet.tar.gz https://download.visualstudio.microsoft.com/download/pr/820db713-c9a5-466e-b72a-16f2f5ed00e2/628aa2a75f6aa270e77f4a83b3742fb8/dotnet-sdk-5.0.100-linux-x64.tar.gz
RUN tar zxf dotnet.tar.gz -C ./
RUN rm -rf dotnet.tar.gz
ENV PATH="${PATH}:/dotnet:/var/jenkins_home/.dotnet/tools"
ENV DOTNET_ROOT="/dotnet"
RUN apt update -y
RUN apt install icu-devtools vim zip unzip -y
RUN usermod -a -G root jenkins
USER jenkins

命令行解析

- 1. 这个Docker镜像基于jenkins
- 2. 设置当前用户为root,因为后面安装需要使用root
- 3. 设置当前工作目录为dotnet
- 4. 更新apt-get
 -5. 安装wget
- 6. 下载dotnet SDK包,保存为dotnet.tar.gz。这里要注意下载正确版本的SDK
- 7. 解压dotnet SDK到当前目录,即/dotnet目录
- 8. 删除dotnet SDK包
- 9. 把dotnet目录和dotnet tools目录添加到环境变量PATH,这样就可以使用dotnet命令了
- 10. 设置DOTNET_ROOT变量
- 11. 更新源
- 12. 安装一些必需的,常用的工具包,其中icu-devtools是运行dotnet需要的
- 13. 修改jenkins用户到root附加组
- 14. 设置当前用户为jenkins

下载dotnet SDK包,可前往微软官方网站获取下载链接:https://dotnet.microsoft.com/download

4.构建 Docker 镜像 name=jenkins:dotnet。

 docker build -t jenkins:dotnet .

[不看][不看][不看]特别注意:结尾 . 不能省略

5.运行查看镜像列表命令

docker images

能看到图片红框所示的镜像,至此Docker版的Jenkins的镜像已经构建完成了。



6.运行Jenkins:dotnet镜像

docker run -d -p 51001:8080 -p 50000:50000 --name mjenkins  \
           --privileged=true \
           --restart always \
           -u root \
           -e TZ="Asia/Shanghai" \
           -v /mudata/jenkins:/var/jenkins_home \
           -v /usr/bin/docker:/usr/bin/docker \
           -v /var/run/docker.sock:/var/run/docker.sock \
           -v /mudata/webroot/:/mudata/webroot \
           jenkins:dotnet

5.运行查看容器列表命令

docker ps

能看到图片红框所示的镜像,好了我们Docker版的Jenkins已经成功运行起来了,小编喜欢喝啤酒,给自己上3瓶[啤酒][啤酒][啤酒]。接下来就可以通过浏览器访问:http://本机的IP地址:51001

不知道本机IP地址,可以运行

ifconfig

配置Jenkins

1.首次安装jenkins,访问jenkins时,需要输入管理员初始密码



已经我们构建到时候已经把/var/jenkins_home映射到了我们指定 /mudata/jenkins目录,此时我们需要进入路径找到initialAdminPassword文件,打开改文件复制里面的密码。

cd /mudata/jenkins/secrets
ls



当然我们也可以用find命令来查找

find / -name initialAdminPassword


2.安装插件这边演示就直接按默认的安装,大家根据自己的情况而选择,然后jenkins的引导一步的做,这边就不做演示。


3.进来后,jenkins的主页面就长这个样子


4.点击jenkins页面左侧菜单第一个“新建任务”,填入任务名,选择自由风格


5.源码管理勾选GIT,输入GIT上项目的URL地址


6.编写 Shell 脚本


7.Shell 脚本内容

# Jenkins 构建 测试服

echo '============查看打包环境================'
pwd
ls
echo $PATH

image_version=`date +%Y%m%d%H%M`;
echo $image_version;

dotnet --info
dotnet --version

# 获取短版本号
GITHASH=`git rev-parse --short HEAD`

echo '============================begin restore======================================='
dotnet restore
echo '============================end restore======================================='

#要构建的解决方案名称
solutionName=Test.Api
#docker run的容器名称
containerName=jenkinsscmbasic
#指定run的端口
port=9994
#.sln文件全路径
#solutionDir=20-Solution/${solutionName}.sln
#.csproj文件全路径
csprojDir=${solutionName}/${solutionName}.csproj

#项目发布的目录
webDir=/mudata/webroot/jenkins/publish/webapp

#归档目录
archivesDir=/mudata/webroot/jenkins/publish/archives

#清空文件夹
rm -rf ${webDir}/${JOB_NAME}/*

#发布网站到webDir
dotnet publish ${JENKINS_HOME}/workspace/${JOB_NAME}/${csprojDir} -c Release -o ${webDir}/${JOB_NAME} /p:Version=1.0.${BUILD_NUMBER}
#复制配置文件
#cp -rf /vdb1/jenkins/DotNetCoreWebPublishToDockerCommonConfigs/* ${webDir}/${JOB_NAME}/

#判斷是否存在
CID=$(docker ps | grep "${containerName}" | awk '{print $1}')
echo $CID
if [ "$CID" != "" ];then
    docker stop ${containerName}
    docker rm ${containerName}
    docker rmi ${containerName}
#docker stop $CID
#docker rm $CID
fi


#通过Dockerfile重新构建镜像
docker build -t ${containerName} ${webDir}/${JOB_NAME}/.
#docker run容器并绑定到端口
#docker run -d -p ${port}:80 --name ${containerName} ${containerName}
docker run --name ${containerName} --restart=always -d -p ${port}:80 -v /etc/localtime:/etc/localtime:ro ${containerName}
echo "success!"

?[不看][不看][不看] 温馨提示:docker build -t ${containerName} ${webDir}/${JOB_NAME}/. 后面这 ’.‘不能忽略,前后不能有空格。

我们发布后构建:所以需要把当前发布的目录路径作为上下文目录,因为等下我们编写的Dockerfile文件内容,需要把当前的发布文件 COPY到容器目录内。如果上下文目录指定错误,就会导致镜像构建完成,运行容器成功,但是容器状态是重试状态,此时我们查看容器日志

docker logs 容器的ID

在执行DonNet XXX.DLL报错,翻译一下的错误内容大概是这样

无法执行,因为找不到指定的命令或文件。

docker build 命令最后有一个 . 。 . 表示当前目录,而 Dockerfile就在当前目录,因此不少初学者以为这个路径是在指定 Dockerfile 所在路径,这么理解其实是不准确的。如果对应上面的命令格式,你可能会发现,这是在指定上下文路径。那么什么是上下文呢?

??首先我们要理解 docker build 的工作原理。Docker 在运行时分为 Docker 引擎(也就是服务端守护进程)和客户端工具。Docker 的引擎提供了一组 REST API,被称为 DockerRemote API,而如 docker 命令这样的客户端工具,则是通过这组 API 与 Docker 引擎交互,从而完成各种功能。因此,虽然表面上我们好像是在本机执行各种 docker 功能,但实际上,一切都是使用的远程调用形式在服务端(Docker 引擎)完成。也因为这种 C/S 设计,让我们操作远程服务器的 Docker 引擎变得轻而易举。

??当我们进行镜像构建的时候,并非所有定制都会通过 RUN 指令完成,经常会需要将一些本地文件复制进镜像,比如通过 COPY 指令、 ADD 指令等。而 docker build 命令构建镜像,其实并非在本地构建,而是在服务端,也就是 Docker 引擎中构建的。那么在这种客户端/服务端的架构中,如何才能让服务端获得本地文件呢?

??这就引入了上下文的概念。当构建的时候,用户会指定构建镜像上下文的路径, docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。

————————————————

版权声明:本文为CSDN博主「大漠知秋」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/wo18237095579/article/details/80540571


8.至此我们只要在Jenkins点击构建,等待构建成功。我们在执行一下

docker images

看到我们构建的镜像构建成功了[比心][比心][比心]


再执行一下

docker ps

看到我们运行的容器也启动成功[送心][送心][送心]

试着打开浏览器访问一下:http://本机的IP地址:9994。[爱慕][爱慕][爱慕]


9.到此我们已经全部完成自动化部署

.DotNet项目创建Dockerfile

我们主要讲一下如何在项目内添加Dockerfile文件并编写文件内容。

1.右键项目-添加-Docket项目支持,目标OS:LINUX。


2.右键点击Dockerfile文件,属性-复制到输出目录-如果较新则复制



??[不看][不看][不看]温馨提示:如果步骤不执行,当我们发布的时候,就没有Dockerfile文件,Jenkens Shell build的时候就会报错

3.Dockerfile文件内容


FROM mcr.microsoft.com/dotnet/aspnet:5.0.9

WORKDIR /app

EXPOSE 9994

COPY .  .

RUN ls

ENTRYPOINT ["dotnet", "Test.Api.dll"]

命令行解析

- 1.  设置基础镜像的来源 aspnet:5.0 运行时
- 2. 切换目录app文件夹
- 3. 指定暴露的端口
- 4. 拷贝当前上下文目录文件到当前容器目录也就是 /app
- 5. 运行 ls 命令,查看当前容器是否已经有我们发布的文件了。此命令如果不要可以删掉
- 6.运行项目

.结束

至此整篇文章已经写好了,欢迎反馈与建议。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表