目标

当代码提交到github后,自动生成构建项目并部署到服务器。接下来介绍一下如何在容器中运行jenkins,并自动化构建github上的项目,使用自动化构建来解放你的双手。

前置条件

一台已经安装了docker的ubuntu服务器,有公网ip并可通过ip或者域名访问。因为github无法访问本地服务器,所以不能触发构建,只能手动触发构建。

这里我们选择使用基于.net core开发的纸壳cms作为演示例子,一步一步搭建自动构建。

当然,一样可以不使用docker在windows、linux上安装jenkins来达到同样的目的。

dockerfile

首先创建一个dockerfile文件,文件名就是dockerfile,然后输入以下内容:

from jenkins/jenkins:lts
user root
workdir /dotnet
run wget -o dotnet.tar.gz https://download.visualstudio.microsoft.com/download/pr/72ce4d40-9063-4a2e-a962-0bf2574f75d1/5463bb92cff4f9c76935838d1efbc757/dotnet-sdk-3.0.100-preview6-012264-linux-x64.tar.gz
run tar zxf dotnet.tar.gz -c ./
run rm -rf dotnet.tar.gz
env path="${path}:/dotnet:/var/jenkins_home/.dotnet/tools"
env dotnet_root="/dotnet"
run apt update -y
run apt install icu-devtools vim zip unzip -y
run usermod -a -g root jenkins
user jenkins

简单说明一下这个dockerfile里面都做了什么事情:

  1. 这个docker镜像基于jenkins
  2. 设置当前用户为root,因为后面安装需要使用root
  3. 设置当前工作目录为dotnet
  4. 下载dotnet sdk包,保存为dotnet.tar.gz。这里要注意下载正确版本的sdk,可前往微软官方网站获取下载链接:
  5. 解压dotnet sdk到当前目录,即/dotnet目录
  6. 删除dotnet sdk包
  7. 把dotnet目录和dotnet tools目录添加到环境变量path,这样就可以使用dotnet命令了
  8. 设置dotnet_root变量
  9. 更新源
  10. 安装一些必需的,常用的工具包,其中icu-devtools是运行dotnet需要的
  11. 修改jenkins用户到root附加组
  12. 设置当前用户为jenkins

到这里,dockerfile就定义完成了。当你的项目升级到更新版本的.net core时,只需要进入容器下载对应的.net core sdk就可以了。

生成docker镜像

接下来使用以下命令来生成docker镜像,镜像名为jenkins,tag是dotnet:

docker build -t jenkins:dotnet .

生成这个镜像要花数分钟的时间,请耐心等待:

 

生成完成以后,可以使用docker images命令查看所有镜像

 

运行jenkins实例

使用docker run命令来运行一个jenkins实例,注意映射端口,右边的8080,50000是jenkin的默认端口,左边的是docker宿主机的端口,可以按情况修改:

docker run -p 8080:8080 -p 50000:50000 --name jenkins jenkins:dotnet

运行命令以后会jenkins会自动初始化,当控制台上出现jenkins is fully up and running的时候就初始化完成了,同时可以看到上面有一个admin的初始化密码,把它复制下来,在第一次使用jenkins的时候要使用到这个密码。

打开浏览器,在地址栏中输入服务器的ip地址和端口号访问jenkins:

 

然后将刚才复制下来的密码,粘贴到密码输入框中,然后点击继续:

 

然后点击选择安装插件,因为除了默认推荐的插件,我们还需要安装一些其它插件:

 

除了推荐的插件外,我们还需要安装github的插件,publish over ssh插件,这个插件可以将你发布好的程序通过ssh复制到你的服务器上

 

然后点击安装,等待安装完成:

 

插件安装完成以后,输入初始化用户名和密码等信息后,就可以开始使用jenkins了:

 

接下来的使用默认信息一直点下一步就可以了。

添加项目

点击添加新作业,创建一个项目:

 

输入名称,选择freestyle project,然后点击ok创建:

 

勾选github project,然后输入项目地址:

 

在源码管理里面选择git,然后输入git地址:

 

有了源代码之后,就可以添加生成操作了。在生成这里添加一个执行shell的步骤,我们将在这里使用dotnet的publish命令来发布项目

 

然后就可以在这里输入dotnet publish命令了:

 

因为我们这里演示使用的是纸壳cms,有点不一样,需要使用官方的发布工具,所以要输入以下命令:

 

由于zkeacms.publisher没有在容器中安装,所以发布会报错,这里我们还需要进入窗口安装一下发布工具,首先进入容器:

docker exec -it jenkins bash

然后使用以下命令来安装发布工具: 

dotnet tool install -g zkeacms.publisher

点击保存。到这里,添加项目,并且发布项目就完成了,点击立即生成来尝试生成一下:

 

build history里面可以看到所有的构建历史记录,点击进度条,可以查看当前生成任务的控制台输出:

 

到这里,生成、发布已经可以了,但是提交代码后不会自动触发,我们需要在github上添加一个webhook,来自动触发生成、发布。

添加github webhook

首先,开启项目的github触发事件,点击配置项目:

 

然后勾选生成事件中的github hook trigger

 

接下来要在github上设置项目的webhook,点击项目设置下的webhooks来添加

 

注意jenkins的github插件设定的默认的github的webhook地址是{ip}:端口/github-webhook/,所以在payload url输入以下url即可,如果有域名可以使用域名:

 

在添加完后,github会先尝试一送一个请求,这时候就可以到jenkins看一下是否会生成了。如果没有生成,可以通过查看log来了解原因:

 

部署到服务器

现在自动触发构建已经设置好了,就剩下最后一步,将发布好的程序推送到服务器。

首先,要在jenkins里面配置服务器的相关信息,点击manage jenkins:

选择configure system:

 

然后输入服务器的相关信息,jenkins将会使用这些信息来远程连接你的服务器:

 

注意:devops目录须要在目录服务器上存在。

添加完服务器后,再次编辑项目,添加一个生成步骤,该步骤就是发送文件:

输入要复制的文件目录,和在复制完成之后要执行的命令,文件复制完成以后,我们重新启动一下程序的服务:

 

  • source files:要复制的文件
  • remove prefix:如果不输入,目标服务器的devops目录(在配置ssh服务器的时候指定的目录)下会创建和sourece files一样的目录结构
  • remote directory:目标服务器下devops目录下的子目录
  • exec command:在文件复制完成后将会在远程服务器上执行该命令

到这里整个自动构建环境就搭配完成了。

源文地址: