GitLab配合Jenkins打造自动化部署
GitLab
有CI
和CD
功能模块,但我对Jenkins
更熟悉些,所以先使用Jenkins
将自动发布搭建起来,后面再继续研究GitLab
的CI
和CD
功能。
需求
- 程序使用
dotNET Core
编写,代码通过GitLab
的Merge Request
的方式推送到服务端 - 代码
Merge
后会合并到master
分支 - 通过
Jenkins
对master
分支监控,获取最新代码,部署到CentOS
的Docker
容器中
有两种方式进行构建 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
,所以需要安装SSH
的publish over ssh
插件
添加了publish over ssh
插件后,在「系统管理/系统设置」中可以看到Publish over SSH
的设置区域,将需要构建发布的ContOS
的服务器信息添加进去
设置Git路径
在「系统管理/全局工具配置」中设置Git
路径C:Program Files (x86)Gitbingit.exe
,在构建时拉取代码需要用到Git
工具
配置Jenkins
首先需要创建一个任务,选择构建一个自由风格的软件项目
配置分为五个步骤:
- 源码管理:设置源代码地址等相关信息
- 构建触发器:设置构建检查的时间间隔
- 构建环境:设置构建环境
- 构建:设置构建相关的命令
-
构建后操作:复制文件到
CentOS
中
源码管理
- Repositroy URL:源码仓库地址
-
Credentials:
GitLab
的账户密码设置 - Branch:设置分支,当监控到设置的分支有代码更新后,会自动进行构建
-
源码库浏览器:选择
gitlab
- URL:代码地址
-
Version:10.6,因为我安装的
GitLab
为10.6的版本
代码拉到本地需要进行存储,在General
中进行路径的设置
构建触发器
构建触发器有很多中,这里我们选择轮询SCM
,意思是定时检查源码变更(根据SCM软件的版本号),如果有更新就pull
最新code
下来,然后执行构建动作。
表达式配置为H/2 * * * *
表示每两分钟检查一次。表达式规则如下:
* * * * *
(五颗星,中间用空格隔开)
第一颗*表示分钟,取值0~59
第二颗*表示小时,取值0~23
第三颗*表示一个月的第几天,取值1~31
第四颗*表示第几月,取值1~12
第五颗*表示一周中的第几天,取值0~7,其中0和7代表的都是周日
构建环境
构建
构建后操作
构建后的操作选择Send build artifacts over SSH
进行SSH的相关配置
-
SSH Server:可以选择在「系统管理/系统设置」中全局设置的
SSH
服务器 -
Source files:
dotNET Core
程序的发布目录 -
Remove reefix:
dotNET Core
程序的发布目录 -
remote direcotry:
CentOS
服务器的根目录中创建webapi
目录,此处配置目录路径 -
Exec command:在
CentOS
服务器的根目录中创建名称为devops_webapi.sh
的脚本文件,此处配置文件路径
到此Jenkins
配置完成,保存即可。
CentOS相关设置
1、在根目录中创建webapi
目录,Jenkins
会将dotNET Core
发布后的文件复制到该目录中,在该目录中创建Dockerfile
文件,用来生成Docker
镜像,Dockerfile
文件内容如下:
FROM microsoft/aspnetcore
COPY . /app
WORKDIR /app
EXPOSE 80/tcp
ENTRYPOINT ["dotnet", "FW.WebAPI.dll"]
2、在根目录下创建devops_webapi.sh
文件,用来构建镜像和创建容器,文件内容如下:
#!/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"
总结
程序自动发布的方式有很多种,先选一种自己熟悉的方式运行起来,再进行更深入的研究,和更优方式的选择。跟写代码一样,不能纸上谈兵,先运行起来,再逐步优化重构。
- python 如何设置多线程
- R语言读CSV、txt文件方式以及read.table read.csv 和readr(大数据读取包)
- python 多进程设置 整理版本1
- 11g Dataguard中的snapshot standby特性(r8笔记第49天)
- 物化视图刷新结合ADG的尝试 (r8笔记第47天)
- 关于CPU使用率高的awr分析(r8笔记第46天)
- 图形工具和命令行的博弈-swingbench配置(r8笔记第63天)
- 手把手教你用LDA特征选择
- 一个关于执行计划的小问题测试(r8笔记第60天)
- 【Go 语言社区】www.golangweb.com通过工信部审核,正式挂牌社区域名
- golang 算法课程 正式开课--第一季 第1节
- 在 Mac OS X 装不上 TensorFlow?看了这篇就会装
- 利用python内置函数,快速统计单词在文本中出现的次数
- 物化视图刷新结合ADG的尝试(二)(r8笔记第57天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法