AspNetCore容器化(Docker)部署(四) —— Jenkins自动化部署
一.前言
(Jenkins、Docker、Git/Svn组建一套简单的自动化发布流程)
文章中用到的相关服务器角色
角色 | 环境 | 功能 |
开发机 | Win10、Docker(Linux OS) | 编码、调试 |
发布机(与开发机共享) | Win10、Docker(Linux OS)、Jenkins | 自动化部署 |
测试服务器 | Ubuntu、Docker | 测试环境 |
二.安装jenkins
1.Windows下安装jenkins
各环境下安装教程 https://jenkins.io/zh/doc/book/installing/
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安装教程 https://docs.docker.com/compose/install/
这里跟宿主机不同的是,要选择在容器内的安装方式“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自动化部署
AspNetCore容器化(Docker)部署(四) —— Jenkins自动化部署的更多相关文章
- AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排
一.前言 上一篇部署了一个最基础的helloworld应用,创建了两个容器和一个network,还算应付得过来. 如果该应用继续引入mysql.redis.job等若干服务,到时候发布一次得工作量之大 ...
- AspNetCore容器化(Docker)部署(一) —— 入门
一.docker注册安装 Windows Docker Desktop https://www.docker.com/products/docker-desktop Linux Docker CE h ...
- AspNetCore容器化(Docker)部署(二) —— 多容器通信
一.前言 着上一篇 AspNetCore容器化(Docker)部署(一) —— 入门,在单个容器helloworld的基础上引入nginx反向代理服务器组成多容器应用. 二.配置反向代理转接 配置转接 ...
- docker安装jenkins自动化部署
Docker之Jenkins自动化部署 1.拉取jenkins镜像images(类比:java中的类) docker pull jenkinsci/jenkins:lts 或 docker pull ...
- springboot docker jenkins 自动化部署并上传镜像
springboot + docker + jenkins自动化部署项目,jenkins.mysql.redis都是docker运行的,并且没有使用虚拟机,就在阿里云服务器(centos7)运行 1. ...
- Docker 之 Jenkins自动化部署
Docker 之 Jenkins自动化部署 Jenkins部署 jenkis 绑定gitlab shell脚本自动化构建Docker镜像 提升maven构建速度 jenkins 无法通过shell脚本 ...
- Jenkins自动化部署最完整教程
1.概述 Jenkins 是一个可扩展的持续集成引擎.主要用于持续.自动地构建/测试软件项目.监控一些定时执行的任务.Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行 ...
- .NETCore 实现容器化Docker与私有镜像仓库管理
原文:.NETCore 实现容器化Docker与私有镜像仓库管理 一.Docker介绍 Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技 ...
- Jenkins 自动化部署上线
转载于互联网 jenkins自动化部署项目,通过jenkins 部署来节省运维时间,不需要手动cp上线及版本发布 Jenkins 自动化部署上线 Jenkins Jenkins 自动化部署上线一.Je ...
随机推荐
- 堆、栈的区别 <转载>
本篇非作者原创,转子链接,仅供学习记录. 一.预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值 ...
- ibatis 中 $与#的区别
ibatis 中 $与#的区别 使用#: select * from table where id = #id# 如果字段为整型:#id#表示成id select * from table where ...
- django上课笔记2-视图CBV-ORM补充-Django的自带分页-Django的自定义分页
一.视图CBV 1.urls url(r'^login.html$', views.Login.as_view()), 2.views from django.views import View cl ...
- PJzhang:贷款逾期与失信被执行人
猫宁!!! 最近看到一家网贷机构在APP上的温馨提示,提到了网贷逾期与个人征信的关系以及向客户发放贷款的7项基本原则. 如下: 贷款申请及逾期告知 尊敬的客户,感谢您选择####股份有限公司为您提供贷 ...
- autolayout UIImageView 根据 UILabel的宽度变换位置
仅个人学习笔记,大牛勿喷 代码写法 使用Masonry //昵称 _nameLableView = [[UILabel alloc]init]; [_nameLableView setTextColo ...
- Swift dynamic关键字
使用dynamic关键字标记属性,使属性启用Objc的动态转发功能: dynamic只用于类,不能用于结构体和枚举,因为它们没有继承机制,而Objc的动态转发就是根据继承关系来实现转发. 参考资料: ...
- Android-apk文件反编译
一:工具介绍及下载 1:apktool 作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看 2:dex2jar 作用:将apk反编译成java源码(classes ...
- 关于<meta NAME="keywords" CONTENT="">
昨天终于以实习身份入职一家小创业公司,今天让我多看看别人的网页怎么写的,发现了一个以前都没关注过的东西. <meta name="keywords" content=&quo ...
- MSDN值得学习的地方
作者:朱金灿 来源:http://blog.csdn.net/clever101 我一直认为:如果你没有乔布斯那样的天才,能够从头脑中原创出好产品,那么最好先学习分析好的产品,它到底好在哪里?哪些地方 ...
- Jenkins+Ant+Jmeter搭建轻量级接口自动化
软件准备 本文所用软件版本如下: Jenkins2.176.1 Tomcat9.0.21 Ant1.9.14 Jmeter5.1.1 我已经把相应的软件上传到我的网盘中,下载地址如下: 下载链接:ht ...