此次整理的文档是Jenkins+Docker实现自动化部署,很早以前就写的,今天有时间就搬到博客园作个记录。java
Jenkins是基于Java开发的一种持续集成工具,主要用于持续、自动的构建/测试软件等相关项目。在Java开发中咱们常常能看到使用jenkins来部署,.Net core目前仍是比较少见的,可是好的东西咱们就应该要拿来使用、借鉴。linux
这里使用Docker来安装JenKins,固然也能够直接安装到Linux中。git
建立jenkins工做目录web
mkdir /usr/local/jenkinsdocker
拉取jenkins镜像shell
docker pull jenkinsjson
这里有个小插曲,我用的是jenkins镜像,默认也是latest通常意味着最后最新版本。不少官方最新镜像也都是如此命名;直到后来安装配置完成后,登陆进去提示我不是最新版本,让我更新,而且不少插件已经不支持此版本了。发现当前版本和最新版本还相差好几个。心想这不是官方镜像吗 怎么仍是这么旧的版本,最后经过搜索发现,Jenkins官方最新镜像如今已改成jenkins/jenkins的了。bash
因此最新版是:jenkins/jenkins服务器
咱们拉取最新lts版本。并发
docker pull jenkins/jenkins:lts
看以下图jenkins和jenkins/jenkins两个镜像的差异,发现常规下的latest版本并不最新的了,它们的建立时间已是1年之前了。而jenkins/jenkins 则建立时间在2天不到。
因此常规的latest并不意味着最新版本。
修改jenkins目录和docker目录权限,这里1000是容器中Jenkins 的用户 uid
chown -R 1000:1000 /usr/local/Jenkins
sudo chown -R 1000:1000 /var/run/docker.sock
尤为docker.sock 这个权限很重要,到时候容器里的Jenkins须要执行docker命令须要的
运行Jenkins 注意后面的镜像名称和版本lts
docker run -itd -p 8080:8080 -p 50000:50000 --name jenkins --privileged=true -v /usr/local/jenkins:/var/jenkins_home -v /usr/bin/docker:/bin/docker -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:lts
参数解释:
-p 8080:8080 -p 50000:50000 --映射jenkins端口
--name jenkins --容器名称本身命名
privileged=true --授予容器管理员权限
-v /usr/local/jenkins:/var/jenkins_home --映射jenkins目录
-v /usr/bin/docker:/bin/docker --映射docke目录 到时候须要在容器里执行docker命令
-v /var/run/docker.sock:/var/run/docker.sock --映射docker执行命令 到时候须要容器里执行docker命令。
容器是否启动成功最好仍是经过docker ps 或者netstat –ntlp |grep 8080 (查看咱们容器映射的端口是否监听成功) 查看当前容器是否运行成功。
某些状况下,如权限没有配对,启动会不成功的。
查看正在运行的容器。
docker ps
查看容器启动成功后,咱们能够经过地址+端口访问刚刚运行的Jenkins
例如http://192.168.1.101:8080
安装成功访问后会以下图所示。
提示首次访问须要密码,咱们经过刚刚映射的Jenkins目录里查看这个默认密码。
默认密码路径:/usr/local/jenkins/secrets/ (注意前面usr/local/jenkins路径就是刚刚本身映射的目录)
查看密码文件
cat initialAdminPassword
输入密码而后继续下一步。
下一步若是有出现404的,以下图
网上搜索了解据说是Jenkins的一个bug;部分版本存在。
解决办法(如下步骤是解决登陆404的;若是没有404则能够跳过)
首先回到Jenkins主目录找到config.xml文件并打开。
将<useSecurity> 修改成false
中止并从新运行jenkins
重启后必定要从新查看默认密码,不然旧密码是登陆不成功的。
登陆进去之后这里默认选择推荐的插件。
接下来就是等待安装,这里须要注意,若是jenkins版本比较老,则可能不少插件安装失败,直接红色的。此时能够跳过该界面进入首页。会有提示让你升级最新Jenkins版本。
安装完成后建立一个用户名和密码,便可完成安装进入首页。
一、源代码编译发布工程
源代码发布工程即将源代码提交到git服务器,jenkins经过git拉取最新的源代码,并经过Dockerfile里的配置进行编译发布过程。而后经过Docker构建此镜像并运行到容器。
建立一个.Net Core Web项目。
建立项目的时候能够选择启用Docker支持。
对于以前的项目能够右键添加Docker支持。
项目目录
默认的Dockerfile是有帮咱们进行代码编译并发布动做的。因此默认的Dockerfile文件是适合和代码一块儿提交到服务器而后使用Docker进行构建镜像。
项目建立完成后随代码一块儿提交到git服务器。(svn等也均可以)
git项目目录,注意将Dockerfile复制到根目录。因为到时候构建镜像的时候就是从根目录执行的。git目录以下所示。
二、已编译的Release工程
已编译的Release工程,此种方式适合git或svn在局域网的;又不但愿源代码不暴露到外网的须要。此种方式是将项目工程进行进行发布打包操做。例如java常见的打包成一个war包文件。.Net 就是生成对应的DLL 文件。
项目在发布以前咱们对项目的Dockerfile文件属性作个更改,以便在发布时将此文件复制到发布时的目录。
选择上面创建的WebTest项目右键发布,选择发布到指定文件夹。
将发布文件发布到本身的git(或svn)目录,以下图所示的,必定要包含Dockerfile文件。发布后的文件,能够根据本身须要将没有更新DLL或者appsetting.json等文件剔除掉。只保留本次要更新的文件便可。
修改Dockerfile文件,由于默认的Dockerfile文件是包含编译发布的命令,因此这里要将这些相关命令操做删除掉;保留以下命令配置便可。
保存而后提交到全部文件到git服务器。
提交后的git目录。
建议:不管是代码编译发布工程仍是已编译的Release工程,第一次使用Docker部署时最好先本身手动将这些文件拷贝到服务器,并手动构建对象并运行容器看是否成功;可否访问网站。也就是先不用Jenkins将这些流程本身手动走一遍,确保一些目录包括Dockerfile等都是配置正确的。
项目工程建立完成并提交到git服务器后,开始在Jenkins里面建立任务。
输入项目描述,源代码管理选择本身对应的便可。
我这里选择的git。第一次添加项目时须要添加一种受权方式点击右边添加按钮便可。
选择添加受权方式 经常使用的就是用户名加密码或者SSH方式。
下一步设置构建环境
设置触发器,这里主要是设置自动触发条件,有定时构建、远程触发构建、轮询SCM。
这里只设置轮询SCM形式的,很简单的方式。意思是在指定间隔时间内会去轮询git或svn中版本是否有变化。若是有就当即构建该项目。其实就是作到只要代码提交了 则马上就能自动构建项目进行发布;不在须要其余任何操做了。
选择构建—>执行shell;固然咱们这里是linux服务器全部多数选择执行shell。
添加shell 命令。
注意下面的webtest 改成本身的容器名称和对应镜像名称便可。
#!/bin/bash # 获取短版本号 GITHASH=`git rev-parse --short HEAD` docker stop webtest docker rm webtest echo ---------------Building Docker Image...------------------ docker build -t webtest:$GITHASH . docker tag webtest:$GITHASH webtest:latest echo ---------------Launching Container...------------------ docker run --name webtest -d -p 8005:80 webtest:latest
使用git提交代码进行测试。
自动开始构建了 注意jenkins这里时间是默认是utc时间。utc时间转换咱们北京时间是要+8小时的。
蓝色图标表明构建成功,若是失败会是红色
查看控制台输出信息,尤为构建失败时可以从里面获取到失败缘由等。
控制输出以下图所示
构建成功后咱们到服务器检查下是否有刚刚构建的镜像和运行的容器。(固然通常状况下只要构建成功这两步能够不用检查)
查看镜像
查看运行的容器
访问站点看可否访问成功。