AspNetCore容器化(Docker)部署(四) —— Jenkins自动化部署
一.前言
(jenkins、docker、git/svn组建一套简单的自动化发布流程)
文章中用到的相关服务器角色
角色 | 环境 | 功能 |
开发机 | win10、docker(linux os) | 编码、调试 |
发布机(与开发机共享) | win10、docker(linux os)、jenkins | 自动化部署 |
测试服务器 | ubuntu、docker | 测试环境 |
二.安装jenkins
1.windows下安装jenkins
各环境下安装教程
windows下载地址:https://jenkins.io/zh/download/thank-you-downloading-windows-installer-stable
建议jinkens还是安装在docker的宿主机上,不论是windows还是linux,容器形式安装虽然很方便!但是后续很多坑,比如jenkins容器内共享宿主机docker和容器内运行docker-compose
下面是docker下安装的一些笔记(没走通),最终选择了宿主机下安装jinkens
ps c:\users\administrator> docker run -u root -d -p 8080:8080 -p 50000:50000 -v /e/dockerdata:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean c8222a3716a327ce82770aa729fe80169cbcc28c4d2ada8891cf49ed0b38f3e3 ps c:\users\administrator> docker ps -a container id image command created status ports names c8222a3716a3 jenkinsci/blueocean "/sbin/tini -- /usr/…" about a minute ago up about a minute 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp serene_feistel 66ff08eda2ae c42e9f575fc4 "dotnet helloworld.d…" 2 days ago up 2 days 0.0.0.0:81->80/tcp netcore_helloworld 5357b641a7b1 9c18561d7ab3 "nginx -g 'daemon of…" 2 days ago up 2 days 0.0.0.0:80->80/tcp, 0.0.0.0:801->801/tcp mynginx
-v /e/dockerdata:/var/jenkins_home,把jenkins_home目录(包含插件、配置、工作数据)挂载到宿主机。
这里宿主机是windows,/e/dockerdata相当于"e:\dockerdata",前提是e盘必须被设置为shared drives,如果未设置会弹出提示。
/var/run/docker.sock:/var/run/docker.sock,映射宿主机的docker到jenkins容器。
进入jenkins容器内,查看宿主机docker信息
ps c:\users\administrator> docker exec -it c8222a3716a3 bash bash-4.4# docker version client: version: 18.09.1-ce api version: 1.39 go version: go1.11.4 git commit: 4c52b901c6cb019f7552cd93055f9688c6538be4 built: fri jan 11 15:41:33 2019 os/arch: linux/amd64 experimental: false server: docker engine - community engine: version: 18.09.2 api version: 1.39 (minimum version 1.12) go version: go1.10.6 git commit: 6247962 built: sun feb 10 04:13:06 2019 os/arch: linux/amd64 experimental: false
还需要安装docker-compose,否则shell脚本通过compose来构建镜像时会报docker-compose not found。
docker-compose安装教程
这里跟宿主机不同的是,要选择在容器内的安装方式“install as a container”
ps c:\users\administrator> docker-compose -v #查看宿主机docker-compose版本 docker-compose version 1.23.2, build 1110ad01 ps c:\users\administrator> docker exec -it c8222a3716a3 bash #进入jenkins容器 bash-4.4# curl -l --fail https://github.com/docker/compose/releases/download/1.23.2/run.sh -o /usr/local/bin/docker-compose #bash脚本安装compose % total % received % xferd average speed time time time current dload upload total spent left speed 100 596 0 596 0 0 587 0 --:--:-- 0:00:01 --:--:-- 587 100 1666 100 1666 0 0 831 0 0:00:02 0:00:02 --:--:-- 2127 bash-4.4# chmod +x /usr/local/bin/docker-compose bash-4.4# unable to find image 'docker/compose:1.23.2' locally 1.23.2: pulling from docker/compose 4fe2ade4980c: pull complete 658ccff8d4f1: pull complete 71166c3c8d42: pull complete c246ed86dd59: pull complete digest: sha256:f6e4963cd17f709fb57f7cf0842e269ed6ba173c3490055b50c701a257feb860 status: downloaded newer image for docker/compose:1.23.2 bash-4.4# docker-compose -v #查看jenkins容器内compose版本 docker-compose version 1.23.2, build 1110ad01
2.登入jenkins
浏览器打开localhost:8080
根据提示找到initialadminpassword文件中的初始密码
接下来根据导航依次执行“安装默认插件” ,“创建jenkins账号”,“登入jenkins”
三.创建jenkins发布项目
1.新建item
2.源码设置
如果是私有仓库需要加凭据credentials
failed to connect to repository:error performing command:git.exe,如果有安装git,那就是“global tool configuration”配置的git路径不对。
manage jenkins - global tool configuration
设置正确的git.exe路径
设置好保存后再进入helloworld项目的配置页面。
3.构建触发器和构建环境
构建触发器,就是设置如何进行自动构建。如其他项目构建完后触发该项目的构建、定时构建(不论有没有代码变更)、轮询代码构建(jenkins轮询远程仓库有代码变更则进行构建)。
这里都不选,则需要在工作台使用手动(点击按钮)构建。
4.添加powershell脚本
linux选择shell,windows下建议用powershell,batch command对docker命令的支持不是很友好。
安装powershell插件
切换到“可选插件”选项卡,搜索powershell安装
添加构建命令
#定义变量 $image_version='latest' $registry_user='镜像仓库账号' $registry_pwd='镜像仓库密码' $registry_host='ccr.ccs.tencentyun.com' $registry_namespace='镜像仓库namespace' $service_helloworld='helloworld' $service_mynginx='mynginx' #jenkins拉取的项目默认路径 “安装路径根目录/workspace/jenkins里面建的项目名” $compose_path='d:\program files (x86)\jenkins\workspace\helloworld\docker-compose.yml' echo "------------------------------ 构建镜像 ------------------------------" docker-compose -f "${compose_path}" build echo "------------------------------ 登录远程仓库 ------------------------------" docker login --username=${registry_user} --password=${registry_pwd} ${registry_host} echo "------------------------------ 标记镜像 ------------------------------" docker tag ${service_helloworld}:${image_version} ${registry_host}/${registry_namespace}/${service_helloworld}:${image_version} docker tag ${service_mynginx}:${image_version} ${registry_host}/${registry_namespace}/${service_mynginx}:${image_version} echo "------------------------------ 推送到远程仓库 ------------------------------" docker push ${registry_host}/${registry_namespace}/${service_helloworld}:${image_version} docker push ${registry_host}/${registry_namespace}/${service_mynginx}:${image_version} echo "------------------------------ 清理none ------------------------------" docker rmi $(docker images -f "dangling=true" -q)
5.远程ssh
安装”publish over ssh“插件,安装完之后,进入到”manage jenkins“ - "configure system"中配置远程服务器
passphrase:ssh密码
path to key:ssh私钥的文件路径
key:私钥串,如果“key”和“path to key”都设置,则“key”的优先级较高
disable exec:禁止在目标机上执行命令
ssh server 配置(指定远程服务器的ip,可以配置多个ssh server )
name:ssh节点配置的名称,在job中使用publish over ssh插件时,此名称将出现在“ssh server”中“name”的下拉列表中,如下图:
hostname:通过ssh连接到的远程主机名或ip
username:ssh服务使用的用户名,使用key进行连接时为key指定的用户名
详见插件官方介绍页 https://wiki.jenkins.io/display/jenkins/publish+over+ssh+plugin
添加一个docker-compose.staging.yml提交到git仓库,用于测试环境。
version: '3.4' services: helloworld: image: ccr.ccs.tencentyun.com/wuuu/helloworld:latest environment: #环境变量 - aspnetcore_environment=development ports: #端口映射 - "81:80" container_name: netcore_helloworld deploy: restart_policy: #重启策略 condition: on-failure delay: 5s max_attempts: 3 networks: #指定network - newbridge mynginx: image: ccr.ccs.tencentyun.com/wuuu/mynginx:latest ports: - "80:80" - "801:801" container_name: mynginx deploy: restart_policy: condition: on-failure delay: 5s max_attempts: 3 networks: - newbridge networks: newbridge: #新的network #name: newbridge #compose版本3.5开始才支持自定义名称
继续之前的构建,“增加构建步骤“ - ”send files or execute commands over ssh“
name:选择刚刚配置的远程服务器”staging_server“
source files:要上传的文件的相对路径,多个文件以逗号分隔。相对workspace的路径(其实是相对workspace下项目的路径),也支持表达式,如上图中的“**/*.war”。
如:我的项目通过jenkins git插件拉取下来,所在的目录是d:\program files (x86)\jenkins\workspace\helloworld,docker-compose.staging.yml刚好在hellworld目录下,所以此处直接填文件名
如果yml文件在hellowrold/mycompose/目录下,则需要填写mycompose/docker-compose.staging.yml
remove prefix:文件复制时要过滤的文件夹。
remote directory:远程服务器上的文件夹,此文件夹路径是相对于“ssh server”中的“remote directory”。如果该文件夹不存在将会自动创建。
由于配置staging_server时remote directory没有设置,并且时直接使用root账户登录staging_server的,所以remote directory路径默认为root/
此处填/mydokcercompose,则文件会被复制到服务器的/root/mydokcercompose/docker-compose.staging.yml
exec command:shell命令
#!/bin/bash #定义变量 registry_user='镜像仓库账号' registry_pwd='镜像仓库密码' registry_host='ccr.ccs.tencentyun.com' compose_path='mydockercompose/docker-compose.staging.yml' echo ------------------------------ 登录远程仓库 ------------------------------ docker login --username=$registry_user --password=$registry_pwd $registry_host echo ------------------------------ 卸载服务 ------------------------------ docker-compose -f $compose_path down echo ------------------------------ 拉取镜像 ------------------------------ docker-compose -f $compose_path pull echo ------------------------------ 启动服务 ------------------------------ docker-compose -f mydockercompose/docker-compose.staging.yml up -d echo ------------------------------ 清除none ------------------------------ docker rmi $(docker images -f "dangling=true" -q)
6.手动构建
7.完成
构建完成之后,查看构建日志是否有异常
查看jenkins服务器上构建的image
ps c:\users\administrator> docker images repository tag image id created size ccr.ccs.tencentyun.com/wuuu/helloworld latest 4024cdbb87dc about an hour ago 265mb helloworld latest 4024cdbb87dc about an hour ago 265mb ccr.ccs.tencentyun.com/wuuu/mynginx latest daca457eb2a9 7 hours ago 109mb mynginx latest daca457eb2a9 7 hours ago 109mb mcr.microsoft.com/dotnet/core/sdk 2.2-stretch e4747ec2aaff 4 weeks ago 1.74gb mcr.microsoft.com/dotnet/core/aspnet 2.2-stretch-slim f6d51449c477 4 weeks ago 260mb
查看演示服务器的image和container
root@vm-16-9-ubuntu:~# docker images repository tag image id created size ccr.ccs.tencentyun.com/wuuu/helloworld latest 4024cdbb87dc about an hour ago 265mb ccr.ccs.tencentyun.com/wuuu/mynginx latest daca457eb2a9 7 hours ago 109mb root@vm-16-9-ubuntu:~# docker ps -a container id image command created status ports names e1dc94a1886b ccr.ccs.tencentyun.com/wuuu/mynginx:latest "nginx -g 'daemon of…" 8 minutes ago up 7 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:801->801/tcp mynginx 3ad3db4fbd94 ccr.ccs.tencentyun.com/wuuu/helloworld:latest "dotnet helloworld.d…" 8 minutes ago up 8 minutes 0.0.0.0:81->80/tcp netcore_helloworld
浏览器打开演示服务器ip:801
示例代码github地址:https://github.com/wwwu/aspnetcore_docker
- aspnetcore容器化(docker)部署(一) —— 入门
- aspnetcore容器化(docker)部署(二) —— 多容器通信
- aspnetcore容器化(docker)部署(三) —— docker compose容器编排
- aspnetcore容器化(docker)部署(四) —— jenkins自动化部署
上一篇: 08、MySQL—字符串型
下一篇: 在线转换服务
推荐阅读
-
Linux下自动化部署ASP.NET CORE 3.1(Docker+Jenkins+Nginx)
-
Docker容器使用jenkins部署web项目(总结)
-
Docker容器化部署Python应用
-
Centos7+Docker+Jenkins+ASP.NET Core 2.0自动化发布与部署的实现
-
.net core 项目+jenkins+git+docker实现自动化部署
-
vue 自动化部署 jenkins 篇
-
jenkins实现maven项目自动化部署tomcat
-
AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排
-
【.NET Core】Docker Jenkins ASP.NET Core自动化部署
-
jenkins部署.net平台自动化构建的方法步骤