本文仅作为学习笔记以及本人实践操作步骤,部分内容节选自博客园其他大佬O(∩_∩)O!
一.不使用宿主机的Docker构建jenkins镜像
1.宿主机安装Docker(如果宿主机已经安装,请跳过此步骤)
//更新系统 sudo yum update
#step1 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#step2 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#step3 缓存并安装docker-ce
sudo yum makecache fast
sudo yum -y install docker-ce
#step4 开启docker服务
sudo service docker start
#step5 设置docker开机自启动
systemctl enable docker
#step6 启动Docker
systemctl start docker
#step7 查看版本
docker --version
2.安装jenkins服务
如果我们使用Docker镜像的话,可以直接Search下,可以看到有很多的镜像文件,
docker search jenkins
其中第一个和第二个其实都是官方的,但是第一个已经不维护了,我们一般都是使用的第二个。这里有一个问题要先思考下,如果用镜像的方案的话,那如何在这个Jenkins容器里使用docker来构建我们的dotnet镜像?这个需要好好的想想,如果你的aspnetcore程序打算使用docker容器化的话,以下这个方案不一定是最终的方案,但是普通的dotnet xxx.dll的这种普通发布模式肯定是可以的,
可能有人会问为什么这个jenkins容器里不能使用docker来打包我们的服务呢?原因在于:创建的容器不能操作和使用宿主机的docker,导致我们无法在Jenkins服务中去使用docker命令去构建asp.netcore项目镜像。因为jenkins官方镜像本身是不带dotnetcore环境和docker环境的,所以我们需要先手动制作一个包含dotnet环境的jenkins的docker的container。
首先那我们在一个空的文件夹里,创建一个Dockerfile文件即可:
FROM jenkins/jenkins # Switch to root to install .NET Core SDK USER root # Show distro information! RUN uname -a && cat /etc/*release # Based on instructiions at https://www.microsoft.com/net/download/linux-package-manager/debian9/sdk-current # Install dependency for .NET Core 3 RUN apt-get update RUN apt-get install -y curl libunwind8 gettext apt-transport-https # Based on instructions at https://www.microsoft.com/net/download/linux-package-manager/debian9/sdk-current # Install microsoft.qpg RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg RUN mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg RUN sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-debian-stretch-prod stretch main" > /etc/apt/sources.list.d/dotnetdev.list' # Install the .NET Core framework RUN apt-get update RUN apt-get install -y dotnet-sdk-3.1 # Switch back to the jenkins user. USER jenkins
根据这个Dockerfile来构建一个新的镜像,
docker build -t my-docker-jenk .
下面生成容器实例:
//创建工作目录 mkdir /root/jenkins_home //赋予权限 chown -R 1000 /root/jenkins_home
docker run -d --name jenkins_01 -p 3033:8080 -v /root/jenkins_home:/home/jenkins_01 my-docker-jenk
Jenkins默认的开放容器端口是8080和50000,但是你可以自定义宿主机的监听端口,比如我 这里开放的是3033端口
安装弯沉后会有一个让我们寻找密码的操作:
// 进入容器 docker exec -it jenkins_01 bash // 查看密码 cat /var/jenkins_home/secrets/initialAdminPassword
进入后悔提示有一个安装插件的过程,然后选择安装推荐的插件就行
中间还有一系列的操作我直接略过。。。最终界面如下
3.测试Helloword
3.1 创建*风格的软件项目
3.2 添加源代码管理
3.3 构建命令
3.4 点击立即构建
构建成功后查看控制台文件
但是这样的一个问题就是 我们没法再jenkins容器里面使用docker,这样就不能使用docker打包我们发布的dotnetcore程序了,这个就是我们刚开始提出来的问题,下面第二部分我们将从另外一个方向安装jenkins
二.使用宿主机的docker来构建我们的jenkins镜像和在jenkins内部打包.netcore程序
还是上面的镜像文件,只不过这次启动容器实例的命令不一样了,如下
docker run -u root --rm -d -p 3033:8080 --name jenkins2 \ -v /usr/bin/docker:/usr/bin/docker \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /home/jenkins_home:/var/jenkins_home \ my-docker-jenk
第一行表示启动一个容器名为Jenkins2的对外开放3033端口实例。
第二行表示将宿主机上面的docker命令行工具挂载到容器中,使jenkins用户能够执行docker命令。
第三行表示将宿主机上的docker.sock挂载到容器中的相应位置,使得容器中的dockercli能跟宿主机的docker通信。
第四行表示挂载我们创建的配置文件存放目录到指定的文件夹。
生成成功后的容器实例:
进入jenkins2容器查看docker和dotnet是否正常
可以看到 dotnet sdk和docker都正常。
然后输入命令查看密码:
docker exec jenkins2 cat /var/jenkins_home/secrets/initialAdminPassword
后续的操作和上面基本一致:
构建shell脚本如下:
dotnet restore dotnet build cd HelloWorldPrj dotnet publish echo "Successfully!!!! ^ please see the file ." cd bin/Debug/netcoreapp3.1/publish/ docker stop helloworldcontainer docker rm helloworldcontainer docker rmi hello-world-docjek docker build -t hello-world-docjek . docker run --name helloworldcontainer -p 5055:80 -d hello-world-docjek
每次构建都是先删掉容器和镜像,重新生成。
执行成功的控制台:
然后在宿主机的docker也能查看到启动的容器实例: