首先,咱们要有个Jenkins咯,下载连接:https://jenkins.io/download/html
咱们安装官网教程安装好jenkins,安装教程略....java
嗯?不是说好手把手么?你妹的.git
好好好,咱们仍是来手把手教程好了.github
添加安装源以后直接apt-get install就好,下面是ubuntu的安装命令,其余系统本身玩一下就好.web
sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer
下载连接:http://mirrors.jenkins.io/war-stable/docker
在这里面找最新的下载,我当前最新的应该是2.107.2shell
下载好了jenkins.war以后,在当前目录建立一个jenkins-home文件夹,设置JENKINS_HOME环境变量为jenkins-home(不设置也能够,默认在~/.jenkins)json
wget http://mirrors.jenkins.io/war-stable/2.107.2/jenkins.war; mkdir ~/jenkins-home; export JENKINS_HOME=~/jenkins-home; tmux; java -jar jenkins.war
通常建议开个后台进程来跑jenkins,省得终端退出以后jenkins就死掉了.ubuntu
因此上面我先打开了tmux以后再跑java -jar jenkins.war.浏览器
以下图:
接着留意一下initialAdminPassword的输出
Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: XXXXXXXXXXXXXX This may also be found at: /root/jenkins-home/secrets/initialAdminPassword
这个时候访问当前主机的8080端口已经能够看到jenkins正在启动了,稍等片刻就能够看到jenkins登陆页.
这个时候把上面的XXXXXXXXXXXXXX复制出来,输进去点击继续配置jenkins帐号密码信息之类的.
接着安装默认插件.
这里估计也要等几分钟不等,看你的机器性能和网络速度.
安装好了以后会进入配置登陆帐号密码,安装提示配置就完事.
最后进入jenkins页面是这样的.
到如今咱们已经把jenkins跑起来了,也有了一些经常使用的插件.
咱们先去把dotnet core docker 编译发布相关的东西弄好以后再回来继续作jenkins任务.
在项目目录下新建Dockerfile文件,内容以下:
FROM microsoft/aspnetcore-build:2.0 AS build-env WORKDIR /app # copy csproj and restore as distinct layers COPY *.csproj ./ RUN dotnet restore # copy everything else and build COPY . ./ RUN dotnet publish -c Release -o out # build runtime image FROM microsoft/aspnetcore:2.0 WORKDIR /app COPY --from=build-env /app/out . ENTRYPOINT ["dotnet", "你的dotnet core程序.dll"]
这个Dockerfile基本就是把当前目录的文件拷贝到aspnetcore-build镜像中,再里面编译好以后再发布到aspnetcore:2.0镜像中,
最后指定运行你的dotnet core程序
来源:https://github.com/DaoCloud/dotnet-docker-samples
以HouseCrawler.Web为例,
#!/bin/sh image_version=`date +%Y%m%d%H%M`; echo $image_version; cd ~/code/58HouseSearch/HouseCrawler.Core/HouseCrawler.Web; git pull --rebase origin master; docker stop house-web; docker rm house-web; docker build -t house-web:$image_version .; docker images; docker run -p 8080:80 -v ~/docker-data/house-web/appsettings.json:/app/appsettings.json -v ~/docker-data/house-web/NLogFile/:/app/NLogFile --restart=always --name house-web -d house-web:$image_version; docker logs house-web;
经过上面这个build+run脚本,咱们已经把dotnet core程序编译好了,而且打包成了docker images,还直接跑起来了.
可是咱们想要的应该是自动化编译部署,并且上面咱们都把jenkins跑起来了,因此....
打开jenkins首页,左侧选择"新建任务"(newJob),以下图:
给新的job取个名字,而后选择"构建自由风格的软件项目",如图:
确认以后进入Job配置页面,源码管理里面选择git,如图:
若是git仓库是须要权限的话须要配置一下权限,我通常简单粗暴直接把jenkins主机的公钥添加到git仓库里面,因此这里直接配置成'From the Jenkins master ~/.ssh',也能够用帐号密码访问等等的.
"Branch Specifier (blank for 'any') "默认master分支,根据本身的需求填入不一样的分支.
构建触发器和构建环境先跳过,咱们无论,待会弄.
点击"添加构建步骤",选择"Execute shell",而后能看到以下图:
还记得咱们上一步的脚本么?修改一下源码路径再放进去.
# 切换到源码目录,对应在jenkins-home的workspace下面 cd ~jenkins-home/workspace/项目名称/Dockerfile所在目录; image_version=`date +%Y%m%d%H%M`; echo $image_version; # 中止以前的docker container docker stop house-web; # 删除这个container docker rm house-web; # build镜像而且打上tag docker build -t house-web:$image_version .; docker images; # 把刚刚build出来的镜像跑起来 docker run -p 8080:80 -v ~/docker-data/house-web/appsettings.json:/app/appsettings.json -v ~/docker-data/house-web/NLogFile/:/app/NLogFile --restart=always --name house-web -d house-web:$image_version; docker logs house-web;
若是jenkins主机和程序运行主机不在一台机器上,建议直接在把上面的脚本放在运行主机上,命名成 start_XXX.sh.
上面的命令直接就是成了
ssh username@发布主机的IP '~/start_XXX.sh'
ps:记得在jenkins主机配置ssh免登录
构建触发器就是咱们选择何时来触发构建任务,有几种方案能够作.
我这里选择第4种方案,安装Generic Webhook Trigger插件,下面立刻回告诉你为何这样作的.
Generic Webhook Trigger插件在"系统管理-管理插件-可选插件"里面直接搜"Generic Webhook Trigger"安装就能够.
从上一步的构建步骤里面的脚本中咱们就知道,其实咱们如今要不就在jenkins主机上docker build,要不就在发布目标主机上build,
build过程比较慢并且还会产生镜像在本机or目标主机上,docker images也没有被管理起来.
有什么好的办法么?嗯,还真有.直接用阿里云"容器镜像服务"来构建镜像
首先登陆阿里云,而后进入容器镜像服务,地址是https://cr.console.aliyun.com/
首次进入估计须要建立一个命名空间,通常用公司名或者你的名字就完事.
接着选择"建立镜像仓库".
选地区-选命名空间-填仓库名称(就是镜像名称)-填摘要-设置代码源(支持GitHub/阿里云code/Bitbucket/私有Gitlab/本地Git等等,给个受权就完事)
构建设置选择"代码变动时自动构建镜像",而后选一下构建分支为你想要的分支,填入Dockerfile在源码中的路径,而后保存
接着咱们进入管理平台看一下.
点击一下"当即构建",而后查看一下日志.
这个时候,咱们用docker pull registry-internal.cn-hangzhou.aliyuncs.com/你的命名空间/你的镜像名称 就能够拉到这个阿里云build成功的镜像了.
镜像build的问题解决了,那么咱们怎么自动把镜像发布到咱们的运行主机呢?
这时候webhook又出来了.
咱们看阿里云镜像构建服务里面,有一项是webhook的,官方介绍在这里:阿里云-webhook管理
这里就须要填入咱们的webhook地址,还记得前面我无故端选择的第四种方案,而后让你们跟着安装的Generic Webhook Trigger插件么?
咱们就是用这货来为咱们提供webhook API.
理一下流程:
git仓库代码变化 ->阿里云容器构建服务启动 -> 构建好镜像以后触发webhook -> jenkins收到阿里云的webhook以后触发job执行部署脚本 ->部署脚本使用阿里云镜像run起来 ->完事.
咱们继续配置Generic Webhook Trigger.
Generic Webhook Trigger支持的命名触发URL格式是这样的:
http://jenkins登陆用户名:token受权码@jenkins IP:8080/generic-webhook-trigger/invoke?token=触发器名称
jenkins登陆名和token在"帐号-设置-API Token-Show API Token..."里面能看到,找出来以后填到上面去就能够.
最后一个token参数其实就是"构建触发器"中"触发远程构建"的参数,建议使用job名字.这里的配置大概是这样的:
最后咱们还须要在jenkins全局安全设置中取消勾选“防止跨站点请求伪造(Prevent Cross Site Request Forgery exploits)"选项,这样阿里云webhook才能过得来.
手动在浏览器中访问一下http://jenkins登陆用户名:token受权码@jenkins IP:8080/generic-webhook-trigger/invoke?token=触发器名称
若是对应的jenkins Job能正常开始执行,说明整个流程已经ok了.
最后咱们回到上面"阿里云-容器镜像服务-对应镜像仓库-webhook-添加记录"
PS:webhook名称不要带特殊字符or "-"之类的,否则一直保存失败并且还不会提示你是由于名字不合法,下午被这个坑了半个小时.
到这里,咱们基本大功告成了.
最后咱们再改一下jenkins的脚本,不在本地build docker了,直接拿阿里云镜像服务构建出来的镜像跑就能够.
# 中止以前的docker container docker stop house-web; # 删除这个container docker rm house-web; docker pull 你的阿里云镜像地址; # 把刚刚build出来的镜像跑起来 docker run --restart=always --name 你的contianer名称 你的阿里云镜像地址;