从1-4篇已经学习了docker Harbor k8s的基本用法。接下来进阶一下使用jenkins结合起来做到自动部署项目。

1 安装jenkins

1.1前提条件

  • docker环境,可参考第01篇安装docker
  • 本文使用的是liunx(ubuntu)系统

1.2制作镜像

  • 创建包含net环境的Jenkins镜像Dockerfile

vim Dockerfile

#Docker镜像基于jenkins
FROM jenkins/jenkins
#设置当前用户为root
USER root
#设置当前工作目录为dotnet
WORKDIR /dotnet
#更新源,安装wget,删除apt缓存
RUN apt-get update && apt-get install -y wget && rm -rf /var/lib/apt/lists/*
#下载dotnet sdk,可以前往微软官网查看需要的版本https://dotnet.microsoft.com/download
RUN wget -O dotnet.tar.gz https://download.visualstudio.microsoft.com/download/pr/77d472e5-194c-421e-992d-e4ca1d08e6cc/56c61ac303ddf1b12026151f4f000a2b/dotnet-sdk-6.0.301-linux-x64.tar.gz
#解压sdk到当前目录/dotnet,这是因为上面设置了工作目录
RUN tar zxf dotnet.tar.gz -C ./
#已解压,删除sdk包
RUN rm -rf dotnet.tar.gz
#把dotnet目录和dotnet tools目录添加到环境变量PATH,这样就可以使用dotnet命令了
#PATH="$PATH:your path1:your path2 …"
ENV PATH="${PATH}:/dotnet:/var/jenkins_home/.dotnet/tools"
#设置DOTNET_ROOT变量
ENV DOTNET_ROOT="/dotnet"
#更新源
RUN apt update -y
#安装liunx常用工具,根据自己习惯可自己调整
RUN apt install icu-devtools vim zip unzip -y
#修改jenkins用户到root附加组
RUN usermod -a -G root jenkins
#设置当前用户为jenkins
USER jenkins
  • 构建镜像

docker build -t jenkins:dotnet

1.3运行镜像

  • 运行命令
docker run --name jenkins -d -p 8080:8080 -p 50000:50000 -v /home/jenkins/data:/var/jenkins_home -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock --privileged=true -u root jenkins:dotnet

-p 宿主机端口:镜像端口

1.4ssh免密登录k8s

  • 进入Jenkins容器

1.查看容器id执行docker ps



2.根据id进入容器

docker exec -it df7201ef59ed /bin/bash

3.在容器里执行ssh-keygen -t rsa -C 名称-C名称可以省略,生成密钥对,生成之后在~/.ssh目录下



4.把公钥id_rea.pub里的内容复制到k8s主节点的~/.ssh/authorized_keys文件中,注意这里放在什么用户的ssh下就是免密登录什么用户,本文使用的是root。

4.1 登录k8s主节点服务器,切换至root账号,打开authorized_keys文件

vim ~/.ssh/authorized_keys,然后复制公钥内容进去保存。

4.2 配置ssh

vim /etc/ssh/sshd_config,如下图两行去掉注释然后保存文件



4.3 重启ssh服务service sshd restart

5.验证是否能成功连接

5.1 回到Jenkins所在的服务器在容器里执行ssh root@xxx.xxx.xxx.xxx,出现部分如下图表示成功

1.5Jenkins配置

  1. 安装完成访问http://ip:端口
  2. 根据界面提示完成安装步骤,在选择插件的时候可以选择自定义如下图



    安装的其他步骤不在各种截图了
  3. 中文界面可以先安装简体中文包



  4. 安装其他必要插件如git,nodejs,docker

1.6项目部署(Net6)

  1. 新建任务



  2. 配置git代码库,账号密码和密钥两种方式



    这里介绍一下密钥请求的配置(公钥私钥的生成自行了解跟上面ssh的公私钥生成方法一样)

  3. 构建的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=WebApplication1
#docker run的容器名称
containerName=test1
#指定run的端口
port=9994
#启动项的.csproj路径
csprojDir='YuanYao.Web.Entry/YuanYao.Web.Entry.csproj' #项目发布的目录
webDir=/mudata/webroot/jenkins/publish/webapp #清空文件夹
rm -rf ${webDir}/${JOB_NAME}
mkdir ${webDir}/${JOB_NAME} #发布网站到webDir
dotnet publish ${JENKINS_HOME}/workspace/${JOB_NAME}/${csprojDir} -c Release -o ${webDir}/${JOB_NAME} /p:Version=1.0.${BUILD_NUMBER} #判断是否存在
CID=$(docker ps | grep "${containerName}" | awk '{print $1}')
echo $CID
if [ "$CID" != "" ];then
docker stop ${containerName}
docker rm ${containerName}
docker rmi ${containerName}
fi #通过Dockerfile重新构建镜像
#docker镜像版本号
containerVersion=1.0.${BUILD_NUMBER}
#构建镜像
docker build -t ${containerName}:${containerVersion} ${webDir}/${JOB_NAME}/.
#给镜像打标签
docker tag ${containerName}:${containerVersion} 159.75.71.251:8080/jenkins/${containerName}:${containerVersion} #登录docker
#harbor地址
harborUrl='127.0.0.1:8080'
#harbor账号
harborAccount=jenkins
#harbor密码
harborPwd=@Wyb@123456
echo $harborPwd | docker login $harborUrl --username $haborAccount --password-stdin
docker push ${harborUrl}/${harborAccount}/${containerName}:${containerVersion}
#更新镜像3个参数 Deployments名称 镜像地址 命名空间
deploymentName='test1'
namespace='default'
#k8s主机连接地址
k8sMasterServerUrl='root@127.0.0.1'
ssh ${k8sMasterServerUrl} 'source /etc/profile;bash /home/ubuntu/test.sh' ${deploymentName} ${harborUrl}/${harborAccount}/${containerName}:${containerVersion} ${namespace} #删除镜像
docker rmi --force $(docker images | grep "${containerName}" | awk '{print $3}')
echo "success!"

上面脚本中的test.sh是放在k8s主节点的脚本是更改镜像用的脚本内容为:

#!/bin/bash
# 先更新镜像
#$0执行文件的名称$1dep名称$2新镜像$3命名空间
echo "--------开始执行$0----------------"
echo "$1=$2 -n $3"
resultStr="kubectl set image deployment/$1 $1=$2 -n $3"
echo "------------生成命令为:$resultStr-----下面开始执行---------"
result=$($resultStr)
echo '--------执行结果:'$result'---------'
# 检测镜像是否更新成功
if [[ "$(echo $result | grep updated)" != "" ]]; then
# 镜像地址更新了,会自动重新部署
echo 'UPDATED'
else
# 镜像地址与之前相同,需要触发重新部署
echo 'NOT UPDATE'
kubectl rollout restart deployment $1 -n $3
fi

保存之后点击构建就开始构建部署项目



如果构建失败可以点击数字进入详细查看失败具体信息



根据具体原因做出调整再重新构建

  1. 如果项目之间相互引用假设A项目引用了B项目的某个类库B.B1,且B项目有其他文件夹包裹,就先创建文件夹再把B项目也拉取到Jenkins,然后执行A的构建就能够引用到



    进入文件夹再新建Item,就跟普通创建项目一样的步骤了。

1.7项目部署(VUE)

  1. 配置node环境







    设置完点击保存。
  2. 新建vue项目的任务,跟上面net的方式一样,中间多了一个步骤如下

  3. shell脚本
echo '============查看打包环境================'
pwd
ls
echo $PATH image_version=`date +%Y%m%d%H%M`;
echo $image_version;
webDir='/mudata/webroot/jenkins/publish/webapp'
#清空文件夹
rm -rf ${webDir}/${JOB_NAME}
mkdir ${webDir}/${JOB_NAME} cd ${JENKINS_HOME}/workspace/${JOB_NAME}
node -v #检测node版本
npm -v #检测npm版本
npm config set registry https://registry.npm.taobao.org #把npm源设置为淘宝源
npm config get registry #检测npm是否切换成功
npm install #安装项目中的依赖
npm run build
cp -r dist/* ${webDir}/${JOB_NAME} #docker run的容器名称
containerName='yuanyao-digital-h5'
#判斷是否存在
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 #登录docker
#harbor地址
harborUrl='127.0.0.1:8080'
#harbor账号
harborAccount=jenkins
#harbor密码
harborPwd=@Wyb@123456
echo $harborPwd | docker login $harborUrl --username $haborAccount --password-stdin
docker push ${harborUrl}/${harborAccount}/${containerName}:${containerVersion}
#更新镜像3个参数 Deployments名称 镜像地址 命名空间
deploymentName='yuanyao-digital-h5'
namespace='yuan-yao'
#k8s主机连接地址
k8sMasterServerUrl='root@127.0.0.1'
#k8s主机脚本路径
k8sShell='/home/ubuntu/test.sh'
ssh ${k8sMasterServerUrl} 'source /etc/profile;bash '${k8sShell} ${deploymentName} ${harborUrl}/${harborAccount}/${containerName}:${containerVersion} ${namespace} #删除镜像
docker rmi --force $(docker images | grep "${containerName}" | awk '{print $3}')
echo "success!"

可以看出这个脚本与上面net的脚本只是在构建运行包的时候有差异其他都相同。

1.8扩展用法

  1. 更改构建版本号







    Jenkins.instance.getItemByFullName("任务名称").updateNextBuildNumber(版本数字)

微服务探索之路05篇jenkins构建net6和vue docker镜像到Harbor自动更新k8s服务镜像的更多相关文章

  1. 微服务探索之路03篇-docker私有仓库Harbor搭建+Kubernetes(k8s)部署私有仓库的镜像

    ❝ 目录: 微服务探索之路01篇.net6.0项目本地win10系统docker到服务器liunx系统docker的贯通 微服务探索之路02篇liunx ubuntu服务器部署k8s(kubernet ...

  2. 微服务探索之路02篇liunx ubuntu服务器部署k8s(kubernetes)-kubernetes/dashboard

    本章介绍所需环境:ubuntu18.04,建立在上一篇微服务探索之路01篇已经安装了docker的基础上. 1 替换k8s镜像源为国内镜像 进入目录 cd /etc/apt/sources.list. ...

  3. 微服务探索之路01篇.net6.0项目本地win10系统docker到服务器liunx系统docker的贯通

    本文介绍从创建 net6.0 项目运行在 windows 开发环境的 docker 然后正式部署至 liunx 服务器. 1 windows10 安装 docker 下载docker-desktop ...

  4. 微服务探索之路04篇k8s增加子节点,metrics资源监控,ingress-nginx域名配置及https配置

    1 k8s增加子节点 1.1 子节点服务器安装docker,使用脚本自动安装 curl -fsSL https://get.docker.com | bash -s docker --mirror A ...

  5. Jenkins和Gitlab CI/CD自动更新k8s中pod使用的镜像说明

    Jenkins 使用Jenkins的话,完成的工作主要有如下步骤: 1.从Gogs或Gitlab仓库上拉取代码 2.使用Maven编译代码,打包成jar文件 3.根据jar文件使用相对应的Docker ...

  6. 创建Jenkins构建触发器,代码提交至gitLab即自动触发构建

    下载所需插件,系统设置-->插件管理,搜索以下两个插件,选择安装 登录gitLab,生成一个Personal Access Tokens 进入Jenkins,添加api token,路径:首页- ...

  7. 服务应用突然宕机了?别怕,Dubbo 帮你自动搞定服务隔离!

    某日中午,午睡正香的时候,接到系统的报警电话,提示生产某物理机异常宕机了,目前该物理机已恢复,需要重启上面部署的应用. 这时瞬间没有了睡意,登上堡垒机,快速重启了应用,系统恢复正常.本想着继续午睡,但 ...

  8. 再见Jenkins,从Gitlab代码提交到k8s服务持续交付只需七毛三(走过路过不要错过)

    Gitlab runner 快速搭建CICD pipeline 背景 日常开发中,相信大家已经做了很多的自动化运维环境,用的最多的想必就是利用Jenkins实现代码提交到自动化测试再到自动化打包,部署 ...

  9. .Net Core 商城微服务项目系列(九):使用Jenkins构建自动发布

    1.首先通过Docker运行Consul,并保证各个服务都成功注册: 然后运行jenkins,对MI.Web项目进行发布构建,至于怎么配置之前已经写过了,和上一篇一模一样,这里贴下批处理命令: cd ...

  10. 08 . Jenkins之SpringCloud微服务+Vue+Docker持续集成

    简介 大致流程 /* 1.开发人员每天把代码提交到Gitlab代码仓库 2.jenkins从gitlab中拉取项目源码,编译并打包成war包,然后构建Docker镜像,将镜像上传到Harbor私有仓库 ...

随机推荐

  1. CSEC:香港城市大学提出SOTA曝光矫正算法 | CVPR 2024

    在光照条件不佳下捕获的图像可能同时包含过曝和欠曝.目前的方法主要集中在调整图像亮度上,这可能会加剧欠曝区域的色调失真,并且无法恢复过曝区域的准确颜色.论文提出通过学习估计和校正这种色调偏移,来增强既有 ...

  2. 云存储抽象层-FluentStorage

    FluentStorage 是一个.NET云存储抽象层,支持多种云服务提供商.它提供了一个统一的API来处理不同云服务提供商的Blob存储(如AWS S3, GCP, FTP, SFTP, Azure ...

  3. 【YashanDB数据库】YAS-02079 archive log mode must be enabled when database is in replication mode

    [标题]错误码处理 [问题分类]调整归档 [关键字]关闭归档.YAS-02079.replication mode [问题描述]执行alter database noarchivelog 关闭归档时, ...

  4. 手脱upx

    其实已经是大一下刚开始的事情了,补个档 手动脱壳の新年快乐 查壳,有壳,UPX X32dbg打开文件,查看初始断点 点击PUSHAD跟进,CTRL+*设置EIP,开始F8步过,寻找ESP寄存器第一次单 ...

  5. MySQL笔记--数据库定时备份与恢复

    利用crontab定时.利用mysqldump备份 编写sh启动脚本时记得赋予执行权限(x) 如果没有mysqldump命令执行,基于centos7 yum -y install mysql-clie ...

  6. 大模型应用开发初探 : 基于Coze创建Agent

    大家好,我是Edison. 最近学习了一门课程<AI Agent入门实战>,了解了如何在Coze平台上创建AI Agent,发现它对我们个人(C端用户)而言十分有用,分享给你一下. Coz ...

  7. USB协议详解第11讲(USB描述符-总结)

    描述符回顾总结 1.其实所有的描述符都是USB设备用来描述自己属性及用途的,所以必须在设备端实现对应的描述符,主机会在枚举此设备的时候根据设备实现的描述符去确定设备到底是一个什么样的设备.设备需要的总 ...

  8. 2022年8月中国数据库排行榜:openGauss重夺榜眼,PolarDB反超人大金仓

    "烈日杲杲,夺榜愈烈." 2022年8月的 墨天轮中国数据库流行度排行榜 火热出炉,8月排行榜共有236个数据库参与排名.本月榜单前十名的变化可以用"两反超"来 ...

  9. C#获取环境变量的值

    Environment.GetEnvironmentVariable("Path"); 修改环境变量之后,不能立即生效,需要重启一下VStudio 或重启电脑 : 在 vstudi ...

  10. .NET 内存管理两种有效的资源释放方式

    前言 嗨,大家好!今天我们要聊一聊 .NET 中的内存管理.你知道吗?虽然 .NET 有一个很好的垃圾回收系统来自动清理不再使用的对象,但在某些情况下,我们还需要自己动手来释放一些特殊的资源,比如打开 ...