Gitlab+Jenkins+Maven+Codedeploy部署文档

介绍

如题,CI-CD整套部署过程及细节

教程

机器关闭selinux,firewalld。

jenkins与gitlab在同一台机器,所用用户均为root。

本教程所有服务均部署在一台EC2上,但部署过程与分布式部署无异。

因所用EC2处于公网环境,修改Jenkins和gitlab访问端口仅为一种安全思路。

一、创建EC2实例

在AWS的EC2控制台中选择启动实例,然后依次选择

-->系统版本

-->实例类型- 选择实例硬件配置,8G内存足够用

-->配置实例详细信息- 网络和子网选择能用的就行,IAM角色暂时不创建,其他选项默认即可

-->添加存储- 20G够用

-->添加标签- 例如:name uxian

-->配置安全组- 新建安全组默认只开放入站22端口,出站关闭所有端口

-->审核和启动

安全组配置根据需要开启对应端口,否则将会影响对该服务器的web访问

image
image

二、部署Gitlab

1、下载gitlab-rpm

下载地址:https://packages.gitlab.com/gitlab/gitlab-ce选择最新版本即可

2、部署gitlab

依赖关系:

yum -y install curl policycoreutils openssh-server openssh-clients

安装命令:

rpm -ivh gitlab*******.rpm

设置端口:

vim /etc/gitlab/gitlab.rb  (默认80,改为88)
image

相关命令:

gitlab-ctl reconfigure   重新读取配置文件
/usr/bin/gitlab-ctl  start   启动

加入开机自启:

echo "/usr/bin/gitlab-ctl start" >> /etc/rc.d/rc.local 

3、登录并创建项目

第一次登录会要求设置管理员用户密码

创建组→创建项目(代码的容器)

image
image

4、为jenkins配置gitlab API Token、配置gitlab公钥

在部署jenkins的模块中一起说

三、部署Jenkins

1、下载所需软件包

jenkins-rpm:https://pkg.jenkins.io/redhat-stable/选择最新版即可

jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

git:https://mirrors.edge.kernel.org/pub/software/scm/git/选择最新版即可

maven:http://mirror.bit.edu.cn/apache/maven/maven-3/选择最新版本即可

2、安装jenkins,不要启动

安装命令:

rpm -ivh jenkins-*****.rpm

设置端口:

vim /etc/sysconfig/jenkins (默认8080,改为8888)

3、部署java环境

解压jdk包:

tar xvf jdk-8u151****
mv jdk1.8.0_151 /usr/local/java

声明环境变量:

echo "export PATH=$[PATH:/usr/local/java/bin/](http://path/usr/local/java/bin/)" >> /etc/bashrc
source /etc/bashrc
image
image

4、部署git环境

依赖关系:

yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker

安装git:

tar xf git-2.9.5.tar.gz

cd git-2.9.5/

make prefix=/usr/local/git all;make prefix=/usr/local/git install

声明环境变量:

echo "PATH=$PATH:[/usr/local/git/bin](http://bin/usr/local/git/bin)" >> /etc/bashrc

source /etc/bashrc
image

5、部署maven环境

安装maven:

tar xvzf apache-maven-3.5.3-bin.tar.gz -C /usr/local/

声明环境变量:

echo "export PATH=$[PATH:/usr/local/maven/bin](http://path/usr/local/maven/bin)" >> /etc/bashrc

source /etc/bashrc

测试maven:mvn -version

image

6、启动并访问jenkins界面

启动jenkins并设置开启自启:

systemctl start jenkins;systemctl enable jenkins

生成初始密码:

cat /var/lib/jenkins/secrets/initialAdminPassword **登陆后修改密码**

安装推荐插件

安装自定义插件:AWS codedeploy、Gitlab、Maven Integration、Gitlab Hook、Email Extension Plugin

7、jenkisn全局工具配置

jenkins界面-->系统管理-->全局工具配置

image
image

8、创建jenkins凭据(Gitlab API Token、SSH Username with private key)

-Gitlab API Token

image
image
image
image
image

-SSH Username with private key

image
image
image

--将公钥文件内容复制到gitlab端

image

--在jenkins端配置私钥凭据

image
image
image

四、创建S3桶

在AWS的S3控制台点击创建存储桶

名称和区域
|-存储桶名称:按需设计
|-区域:随意,尽量与EC2一致

配置选项
可以设置一个name标签,其他选项默认为空即可,勾选是需要付费的

设置权限
默认设置,无需更改

审核
确认无误后即可创建存储桶

五、在业务服务器安装codedeploy-agent

codedeploy-agent本该安装在部署业务的服务器上,但在该实验环境,连同gitlab,jenkins装在一台机器上。

但部署过程与分布式部署无异。

sudo yum install ruby
sudo yum install wget
cd /home/<username>
wget https://<bucket-name>.s3.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
要检查服务是否正在运行,请运行以下命令:
sudo service codedeploy-agent status 或 sudo systemctl status codedeploy-agent
启动服务:
sudo service codedeploy-agent start 或 sudo systemctl start codedeploy-agent

<username>为业务服务器所用用户名
<bucket-name> 是包含适用于您所在区域的 CodeDeploy 资源工具包文件的 Amazon S3sds-s3-latest-bucket-name 存储桶的名称。例如,对于 美国东部(俄亥俄)区域,将 <bucket-name> 替换为 aws-codedeploy-us-east-2。有关存储桶名称的列表,请参阅各区域的资源工具包存储桶名称

六、在AWS Codedeploy控制台创建应用程序

点击
创建应用程序
-应用程序名称:按需填写
-部署组名称:按需填写

部署类型
选择就地部署即可,关于就地部署/蓝绿部署

环境配置
选择Amazon EC2实例,通过标签键值对选中第一步创建的EC2实例

匹配的实例
选中的EC2实例基本信息将显示在这里

负载均衡器
不需要选中

部署配置
三种部署配置选择,随意一个都可以

\color{red}{服务角色}
\color{red}{选择已配置好对应策略的IAM角色,下一目录会有说到}

七、创建IAM角色配置策略并关联EC2和AWS Codedeploy

1、IAM角色简介

以上均为服务的部署安装阶段,到目前为止:jenkins、S3、codedeploy-agent端所在业务服务器还只是相互独立的个体。

接下来要配置的IAM角色将是链接各部分的纽带,它将原本相互独立的个体整合到一个体系中。

为实现服务整合,需要配置两个IAM角色:
1、业务服务器(codedeploy-agent所在EC2实例):最少需要拥有对S3的get、list权限
2、AWS CodeDeploy应用程序:需要拥有codedeploy的操作权限、最低的S3put权限、EC2的操作权限

2、创建IAM角色并配置策略

1、在IAM控制面版选择 创建角色,选择受信任实体的类型 为 AWS产品,根据角色提供权限的对象选择 将使用此角色的服务
2、为该角色创建权限策略,选择拥有对哪项服务的权限,可使用可视化编辑器或JSON两种方式编辑权限策略,能够达到相应权限即可
3、权限策略设置完成后,为该角色设置标签
4、审核无误后创建成功

3、为EC2和AWS CodeDeploy关联角色

EC2


AWS CodeDeploy控制台选择角色: 使用的是IAM的ARN,在该角色的详细界面可以看到

八、创建并配置Jenkins项目完成自动部署

1.创建一个maven项目

2.配置gitlab项目url

3.配置构建触发器(自动构建/定时构建)

定时构建:


与linux的计划任务类似,五个参数分别为“分 时 日 月 周”,以空格为分隔符。示例如下:
--H/5 0-3 1,3 10,11 * 直译:每5分钟 0时到3时每隔1小时 周1与周3 10月与11月 所有周 翻译:在10月和11月的 每周的 周1和周3的 0点到3点之间 每5分钟 执行构建
触发器构建:

在高级选项中,取消勾选允许所有分支触发构建

在gitlab配置webhook

测试

测试成功即可在Jenkins控制台看到构建信息

配置webhook遇到的问题:

403权限问题,将jenkins系统配置中Gitlab模块的 Enable authentication for '/project' end-point 去掉勾选

若出现其他报错,极大可能为请求未能找到jenkins服务器,请检查url或代理设置或相关安全策略等。。

4.配置BUILD(构建)步骤


关于编译命令:
-e 控制maven的日志级别,产生执行错误相关信息
-T 线程数,可以并行地构建那些相互间没有依赖关系的模块,充分利用多核CPU资源
此处隐藏了开头的mvn命令,因为jenkins会自动补上,加上反而会报错

4.1 maven构建步骤(扩展)

在进行配置maven的构建选项前,先了解一下源码文件通过maven编译打包的过程:

首先,开发人员根据项目需要编写的pom.xml文件,pom.xml会详细地为maven指明编译打包过程的所需资源和步骤(例如打包类型、所需依赖...)。pom.xml文件参考:https://blog.csdn.net/qq_33363618/article/details/79438044

然后,maven会通过jenkins上配置的构建操作命令依据pom.xml文件完成编译打包。运维人员要负责的就是根据需要选择使用编译命令,并在jenkins配置好相关设置。

以下为常用的maven编译命令和区别:

~mvn clean 将以前编译得到的旧的 class 字节码文件删除
~mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。
~mvn clean install依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段。
~mvn clean deploy依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段。
由上面的分析可知主要区别如下,

package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库
deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库  
原文:https://blog.csdn.net/zhaojianting/article/details/80324533

关于maven仓库:
默认本地仓库:通常在用户家目录的 ~/.m2/repository/ 路径下。最直接的配置库方式是在项目中的pom.xml文件中,通过<repositories>配置。
可以存放从远程库中下载到本地的部分构依赖构件、构建完成后的项目文件。

远程仓库:类似yum仓库的存在,为项目编译所需的依赖构件提供下载地址。
分公有仓库和私有仓库。可以自建私有库用来存放构件和构建完成后的项目文件。
阿里等大厂的仓库也属于自建的私有库,不过相对延迟较低,使用人群较多,属于公有库规模的私有库。
如果一个项目需要依赖一个构件,Maven编译的时候会首先从本地库查找该构件。如果本地库中没有,再根据配置的远程库信息,逐个去远程库中查找该构件。

5.构建后操作----将应用程序部署到 AWS CodeDeploy


6.构建后操作----可编辑的电子邮件通知

使用jenkins更强大的邮件通知功能,需要下载插件 Email Extension Plugin。然后
在系统设置中配置电子邮件通知功能
系统管理 --> 系统设置 --> Extended E-mail Notification

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容