发布于 

GitLab配合Jenkins打造自动化部署

GitLabCICD功能模块,但我对Jenkins更熟悉些,所以先使用Jenkins将自动发布搭建起来,后面再继续研究GitLabCICD功能。

需求

  • 程序使用dotNET Core编写,代码通过GitLabMerge Request的方式推送到服务端
  • 代码Merge后会合并到master分支
  • 通过Jenkinsmaster分支监控,获取最新代码,部署到CentOSDocker容器中

有两种方式进行构建
1、在安装Jenkins的服务器上安装dotNET Core环境,编译和发布在此服务器上进行,Docker中只需要运行环境的镜像即可
2、在Docker中进行编译、发布,但需要下载编译环境的镜像

本文采用第一种方式

环境

Windows10

  • 安装jdk
  • 部署Jenkins2.129
  • 安装VS2017
  • 安装Git

CentOS7.4

  • 安装GitLab10.6.4
  • 安装docker-ce18.04
  • 下载镜像dotnetcore

安装Jenkins

Jenkins的官网https://jenkins.io/download/进行Jenkins的下载,如使用Windows,下载Windows版本即可

-w415

因为Jenkins是基于Java的,所以在Windows上先安装好JDK的最新版本。然后根据安装向导进行安装,安装成功后会出现下面界面:

根据向导安装所有的默认插件,这个步骤也可以手动根据需要来安装相应的插件

安装插件

因为构建时需要通过SSH连接到CentOS,所以需要安装SSHpublish over ssh插件

添加了publish over ssh插件后,在「系统管理/系统设置」中可以看到Publish over SSH的设置区域,将需要构建发布的ContOS的服务器信息添加进去

设置Git路径

在「系统管理/全局工具配置」中设置Git路径C:\Program Files (x86)\Git\bin\git.exe,在构建时拉取代码需要用到Git工具

配置Jenkins

首先需要创建一个任务,选择构建一个自由风格的软件项目

配置分为五个步骤:

  1. 源码管理:设置源代码地址等相关信息
  2. 构建触发器:设置构建检查的时间间隔
  3. 构建环境:设置构建环境
  4. 构建:设置构建相关的命令
  5. 构建后操作:复制文件到CentOS

源码管理

  • Repositroy URL:源码仓库地址
  • CredentialsGitLab的账户密码设置
  • Branch:设置分支,当监控到设置的分支有代码更新后,会自动进行构建
  • 源码库浏览器:选择gitlab
  • URL:代码地址
  • Version:10.6,因为我安装的GitLab为10.6的版本

代码拉到本地需要进行存储,在General中进行路径的设置

构建触发器

构建触发器有很多中,这里我们选择轮询SCM,意思是定时检查源码变更(根据SCM软件的版本号),如果有更新就pull最新code下来,然后执行构建动作。

表达式配置为H/2 * * * * 表示每两分钟检查一次。表达式规则如下:

1
2
3
4
5
6
7
8
* * * * *
(五颗星,中间用空格隔开)

第一颗*表示分钟,取值0~59
第二颗*表示小时,取值0~23
第三颗*表示一个月的第几天,取值1~31
第四颗*表示第几月,取值1~12
第五颗*表示一周中的第几天,取值0~7,其中0和7代表的都是周日

构建环境

构建

构建后操作

构建后的操作选择Send build artifacts over SSH

进行SSH的相关配置

  • SSH Server:可以选择在「系统管理/系统设置」中全局设置的SSH服务器
  • Source filesdotNET Core程序的发布目录
  • Remove reefixdotNET Core程序的发布目录
  • remote direcotryCentOS服务器的根目录中创建webapi目录,此处配置目录路径
  • Exec command:在CentOS服务器的根目录中创建名称为devops_webapi.sh的脚本文件,此处配置文件路径

到此Jenkins配置完成,保存即可。

CentOS相关设置

1、在根目录中创建webapi目录,Jenkins会将dotNET Core发布后的文件复制到该目录中,在该目录中创建Dockerfile文件,用来生成Docker镜像,Dockerfile文件内容如下:

1
2
3
4
5
FROM microsoft/aspnetcore
COPY . /app
WORKDIR /app
EXPOSE 80/tcp
ENTRYPOINT ["dotnet", "FW.WebAPI.dll"]

2、在根目录下创建devops_webapi.sh文件,用来构建镜像和创建容器,文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

echo "del none images"
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
docker images|grep none|awk '{print $3 }'|xargs docker rmi

echo "container del success"
docker stop $(docker ps -a | awk '/webapi:v1/ {print $1}')
docker rm $(docker ps -a | awk '/webapi:v1/ {print $1}')

echo "begin docker build"
cd webapi
docker build -t webapi:v1 .
echo "build end"

docker run -d -p 9011:5000 --restart=always --name webapitest webapi:v1
#echo "none image del start"
#docker rmi $(docker images -f "dangling=true" -q)
#echo "none image del success"

总结

程序自动发布的方式有很多种,先选一种自己熟悉的方式运行起来,再进行更深入的研究,和更优方式的选择。跟写代码一样,不能纸上谈兵,先运行起来,再逐步优化重构。