zoukankan      html  css  js  c++  java
  • Asp.net Core Jenkins Docker 实现一键化部署

    写在前面

    在前段时间尝试过用Jenkins来进行asp.net core 程序在IIS上面的自动部署。大概的流程是Jenkins从git上获取代码

    最开始Jenkins是放在Ubuntu的Docker中,但是由于Powershell执行的原因,就把Jenkins搬到了windows上。因为我们网站的部署需要停掉IIS站点,所以需要Powershell来远程操作服务器(上传文件,停止站点,启动站点),也很顺利的利用WinRM+Powershell脚本实现了上面的功能,但是最后在实际使用中发现,脚本停止站点偶尔会有是假状态,进行Copy文件还总是会因为占用而失败,所以还是只能手动去停止站点,这样就没有达到一键化的目的,所以就有了用Docker来镜像。

    Docker Image

    .net core对Docker是大力支持了,在Core之前,我就特别羡慕我在Docker中使用一些工具的体验--一行指令就可以工具自动安全完整了,不用费力进行环境配置,而且对系统的入侵特别少。所以Core出来之后,我就一直会尝试在Docker中运行Core程序 但是一直没敢上正式环境,正好现在遇到自动化部署的问题,就打算先从测试环境开始,把Docker环境一步步的能应用到正式环境上。大概的流程是这样的:

    Jenkins安装

    Docker安装Jenkins可以直接到store.docker.com上搜索Jenkins的镜像然后run容器就行了唯一要注意的是要让容器中的Jenkins共用宿主机的Docker环境,命令如下

    docker run --memory 1.5G  --name ContainerName -p 18181:8080 -p 50000:50000 -u root -d --env JAVA_OPTS="-Xms256m -Xmx512m  -XX:MaxNewSize=256m"  -v /var/run/docker.sock:/var/run/docker.sock  -v /usr/bin/docker:/usr/bin/docker  -v /home/buxiaoxia/software/jenkins:/var/jenkins_home -v /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 jenkins/jenkins:lts
    

    后面的-v是用来指定宿主机的文件/文件夹挂载到宿主机的指定路径上面,这里主要是用来挂载宿主机的Docker环境。当容器启动完成之后,我们可以用命令

    docker exec -it containerid /bin/bash
    

    进入容器中,执行docker ps的命令试试是否能执行成功。

    Jenkins Job

    当容器运行好之后,进行一些初始化的工作之后,我们就可以开始建立的部署Job了

    源代码管理中配置我们Git的地址

    然后就是构建命令直接用执行Shell

    #!/bin/bash
    # 获取短版本号来用Image的版本号
    
    GITHASH=`git rev-parse --short HEAD`
    docker build -t {imagename}:$GITHASH -f {DockerFile-PWD} {镜像的初始目录}
    
    

    这里就是在构建我们的Image了
    然后接下来就是推送当前构建的Image到远程仓库,再在构建后去执行远程连接到需要发布的服务器根据版本号获取到需要部署的镜像进行run就行,因为我当前都在测试环境 所以就直接在本地执行镜像的run了。

    docker stop {containername} #停掉原来的容器
    docker rm {containername}   #删除原来
    docker run -p 9526:80 -d -e ASPNETCORE_ENVIRONMENT='Development' -v /Path/Path/Logs:/app/App_Data/Logs --restart always --name {containername} {imagename}:$GITHASH
    

    这样就基本实现了一键化部署了,当然还是有很多需要优化的地方,接下来我在使用的过程中如果遇到用着不顺的或者是你们有不顺的地方我们在来解决下。

    写在最后

    DockerFile

    最开始构建asp.net core 2.1版本的镜像的时候,运行总是会找不到dotnet sdk,最后就只有在DockerFile中添加了一层 文件内容如下

    FROM microsoft/dotnet:2.1-sdk AS build
    WORKDIR /app
    
    # 拷贝所有文件到环境中,并进行restore,build and release
    COPY . .
    RUN dotnet restore
    RUN dotnet build
    WORKDIR /app/src/Path
    RUN dotnet publish -c Release -o out
     
    
    
    FROM microsoft/dotnet:2.1-aspnetcore-runtime AS runtime
    WORKDIR /app
    COPY --from=build /app/src/Path/out ./ 把发布好的文件拷贝到镜像中
    Copy --from=build /app/src/Path/bin/Debug/netcoreapp2.1/XXX.xml ./ #把Swagger使用的xml拷贝到目录中
    
    EXPOSE 80
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  #时区的本地化
    RUN echo 'Asia/Shanghai' >/etc/timezone
    ENTRYPOINT ["dotnet", "project.dll"] # 启动程序
    
    

    这种方式有个问题就是会有一些无用的images 分享的指令来进行清除

    docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop #停掉状态为Exited的容器
    docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm  #删除状态为Exited的容器
    docker images|grep none|awk '{print $3 }'|xargs docker rmi  # 删除tag为none的镜像
    
    
     docker rmi $(docker images | grep imagename | awk '{print $3}')  #删除镜像名称为imagename的镜像 (只能针对没有被用的Image)
    
    
    
    
  • 相关阅读:
    剑指Offer-30.连续子数组的最大和(C++/Java)
    剑指Offer-29.最小的K个数(C++/Java)
    UVA 1616 Caravan Robbers 商队抢劫者(二分)
    UVA 10570 Meeting with Aliens 外星人聚会
    UVA 11093 Just Finish it up 环形跑道 (贪心)
    UVA 12673 Erratic Expansion 奇怪的气球膨胀 (递推)
    UVA 10954 Add All 全部相加 (Huffman编码)
    UVA 714 Copying Books 抄书 (二分)
    UVALive 3523 Knights of the Round Table 圆桌骑士 (无向图点双连通分量)
    codeforecs Gym 100286B Blind Walk
  • 原文地址:https://www.cnblogs.com/rstar/p/9983438.html
Copyright © 2011-2022 走看看