学习b记 · 第三阶段
持续集成案例
这一章做一个小的案例,git、gitlab、jenkins、sonarqube、maven、shell把这周学的一整个流程串联起来做一个完整的代码发布流程案例,这一部分东西比较多,相对于之前的笔记这个会做的仔细一点。#嘿嘿回家就是舒服
主机名 | 服务 | IP |
---|---|---|
shell | git、gitlab | 10.0.0.200 |
jenkins | jenkins、maven | 10.0.0.201 |
nexus | nexus | 10.0.0.202 |
sonarqube | sonarqube | 10.0.0.203 |
web02 | nginx | 10.0.0.8 |
一、Git
Git*(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
1、安装
#防火墙啥的就不写了该关关
1)yum install git -y #一般系统都有
#安装后配置一下用户和邮箱,不配置不让推项目
[root@shell /]# git config --global user.name "qxl"
[root@shell /]# git config --global user.email "qxl@mail.com"
# 语法高亮
[root@shell /]# git config –-global color.ui true
#配置完了看一下
[root@shell /]# git config --list
user.name=qxl
user.email=qxl@mail.com
color.ui=true
#这样git就算配置完毕
2)初始化
#这一步就是准备个目录用作于使用git
[root@shell git_workspace]# git init
Initialized empty Git repository in /root/git_workspace/.git/
#在家目录下创建一个目录git_workspace,初始化完会生成.git隐藏目录
[root@shell git_workspace]# ll -a
total 0
drwxr-xr-x 3 root root 18 Feb 7 00:29 .
dr-xr-x---. 3 root root 206 Feb 7 00:29 ..
drwxr-xr-x 7 root root 119 Feb 7 00:29 .git
3)隐藏文件介绍:
cd .git
branches # 分支目录
config # 定义项目特有的配置选项
description # 仅供git web程序使用
HEAD # 指示当前的分支
hooks # 包含git钩子文件
info # 包含一个全局排除文件(exclude文件)
objects # 存放所有数据内容,有info和pack两个子文件夹
refs # 存放指向数据(分支)的提交对象的指针
index # 保存暂存区信息,在执行git init的时候,这个文件还没有
2、使用
1)创建数据——提交数据
创建的git_workspace是本地工作目录,通过git add提交到暂存区域,在git commit从暂存区提交到本地仓库,最后git push到远程仓库,可以通过远程仓库进行拉取或者克隆#图画的比较草率,这样就差不多了,基础命令前面文章有写
二、Gitlab
1、安装
国内镜像:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
#我用的包是这个版本 gitlab-ce-10.2.2-ce.0.el7.x86_64.rpm 去上面的镜像里面找就行
#依赖,需提前安装
yum install -y curl policycoreutils-python openssh-server
#安装gitlab
rpm -ivh gitlab-ce-10.2.2-ce.0.el7.x86_64.rpm
#修改一下配置文件
vim /etc/gitlab/gitlab.rb # gitlab 配置文件
external_url 'http://10.0.0.200'
gitlab-ctl reconfigure # 更改配置文件后需重新配置
/opt/gitlab/ # gitlab的程序安装目录
/var/opt/gitlab # gitlab目录数据目录
/var/opt/gitlab/git-dfata # 存放仓库数据
gitlab-ctl status # 查看目前gitlab所有服务运维状态
gitlab-ctl stop # 停止gitlab服务
gitlab-ctl stop nginx # 单独停止某个服务
gitlab-ctl tail # 查看所有服务的日志
#直接启动
gitlab-ctl start
2、使用
浏览器直接输入10.0.0.200访问,先创建一下密码然后登陆 注意:如果打开页面后502那是你机器给的配置不够,加点内存啥的 #这是登录后的首页
3、创建组用户 项目
1)点击上方锤子进入管理区域,点击New group创建组
就这样创建即可,下面都是默认选项未改变,名字啥的可以自定义
创建用户就填写上面的,没截到图下面还是默认
创建完用户需要创建密码,把用户放到组内
接下来就得创建仓库存放项目了,名字可以自定义,描述无所谓
创建完后是这样的,上面橙色的部分提示是因为没有做ssh免秘钥,想要来这个页面拉取项目需要服务器的公钥,需要将这个机器的公钥添加到gitlab中,直接点击 add an SSH key
#回到服务器生成秘钥对,复制这一堆
[root@shell ~]# ssh-keygen
[root@shell ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLlHNM5ypJriOW3FxS63bC+jv3q3W3iISe/sQHtsiehcRMdTjR4UXRNx66HSwa03MciPLxLMVyEgCn26WdXLoHMDi4siZ7NxB7rYYAY3mO7Qf6lIXVIROXiKIe+NSZ+ebUBKKoE1EhoZzDw0l20EYTwzFR+kHtfgzbVFZwlDWIzUlw/Hl1Mh4cymnmevKVIHCsJIk9vF0wNoxFyG8+zwhjeLV1vh2uuqrdzImuaaokXd7B8NNXT3MAvdre97zjuoIADLvWpVIRuuumQtrjzsOW5xhAdgmPXEK0LWo/7pZMX25tQtpfTDZKZmSiixF1ISQw3jPI6BRoWQUaRykMzAMp root@shell
复制公钥点击下方按钮添加,这样仓库就设置好了 接下来尝试推送一些文件到gitlab中
4、测试推送
1)添加远程仓库 #第一次拉取会出现指纹验证直接yes就完了
[root@shell git_workspace]# git remote add origin git@10.0.0.200:qxl/game.git
2)上传文件
[root@shell git_workspace]# touch test.txt
[root@shell git_workspace]# git add .
[root@shell git_workspace]# git commit -m "test.txt"
3)给爷往上推
[root@shell git_workspace]# git push -u origin master
#刷新一下浏览器就出来了 现在git推送就没有问题了
5、保护分支
#这次的案例就把主要的功能都做通,这些拓展就不做了,还是写一下是干啥的
1)设置保护主分支
这个功能呢就是保护master主分支除了管理不能让任何人推送,保护线上的代码不出错
6、gitlab备份
#这个直接复制过来了,没讲,用得不多
对gitlab进行备份将会创建一个包含所有库和附件的归档文件。对备份的恢复只能恢复到与备份时的gitlab相同的版本。将gitlab迁移到另一台服务器上的最佳方法就是通过备份和还原。
gitlab提供了一个简单的命令行来备份整个gitlab,并且能灵活的满足需求。
备份文件将保存在配置文件中定义的backup_path中,文件名为TIMESTAMP_gitlab_backup.tar,TIMESTAMP为备份时的时间戳。TIMESTAMP的格式为:EPOCH_YYYY_MM_DD_Gitlab-version。
如果自定义备份目录需要赋予git权限
配置文件中加入
vim /etc/gitlab/gitlab.rb
gitlab_rails['backup_path'] = '/data/backup/gitlab'
gitlab_rails['backup_keep_time'] = 604800 #备份保留的时间(以秒为单位,这个是七天默认值),
mkdir /data/backup/gitlab
chown -R git.git /data/backup/gitlab
gitlab-ctl reconfigure
三、Jenkins
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
1、安装
链接:https://pan.baidu.com/s/1m4vJbK9DkIjVTppGPT2qWQ?pwd=kxxw
提取码:kxxw
#这里面放了几个这次案例用的包
安装jenkins需要jdk,这次采用本地安装
[root@jenkins ~]# ls
anaconda-ks.cfg jdk-8u181-linux-x64.rpm jenkins-2.176.1-1.1.noarch.rpm
[root@jenkins ~]# rpm -ivh jdk-8u181-linux-x64.rpm
warning: jdk-8u181-linux-x64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:jdk1.8-2000:1.8.0_181-fcs ################################# [100%]
Unpacking JAR files...
tools.jar...
plugin.jar...
javaws.jar...
deploy.jar...
rt.jar...
jsse.jar...
charsets.jar...
localedata.jar...
[root@jenkins ~]# rpm -ivh jenkins-2.176.1-1.1.noarch.rpm
warning: jenkins-2.176.1-1.1.noarch.rpm: Header V4 DSA/SHA1 Signature, key ID d50582e6: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:jenkins-2.176.1-1.1 ################################# [100%]
安装完需要修改一下启动用户
vim /etc/sysconfig/jenkins
JENKINS_USER="root"
修改完直接启动就可以了
[root@jenkins ~]# systemctl start jenkins
[root@jenkins ~]# systemctl enable jenkins
安装插件
链接:https://pan.baidu.com/s/1YEgerbWh5-gurQHAcZWdNA?pwd=kxxw
提取码:kxxw
cd /var/lib/jenkins/ #插件所在目录,把plugins这个目录备份一下,直接解压我分享的包就行了
systemctl restart jenkins #记得重启
jenkins主要的目录
/usr/lib/jenkins/:jenkins安装目录,WAR包会放在这里
/etc/sysconfig/jenkins:jenkins配置文件,“端口”,“JENKINS_HOME”等都可以在这里配置
/var/lib/jenkins/:默认的JENKINS_HOME
/var/log/jenkins/jenkins.log:Jenkins日志文件
2、使用
浏览器直接访问ip:8080就会打开下面这个页面,默认密码去它指定位置复制,选择安装插件直接右上角x掉,前面插件已经装上了不需要在安装了
默认进来就是这样的了,原来是英文的,访问之前已经安装上插件就会变成中文。接下来是使用jenkins进行操作了,此次案例是用到了三个类型的项目,下面开始操作
四、自由风格项目
点击首页的创建一个新任务后,跳转到这个页面输入名称选择第一个,确定
修改的部分都会截图,没截图的选项不用动
这里是将gitlab创建的仓库连接粘贴过来,默认是拉取master分支的项目,错误是因为jenkins无法从gitlab上拉取代码,需要公钥。
去jenkins的机器生成一下密钥对,然后把公钥复制到gitlab#怎么生成上面有
复制完之后可以先保存一下项目,去机器上克隆一下项目,添加一下指纹验证
[root@jenkins ~]# git clone git@10.0.0.200:qxl/game.git
克隆完之后继续配置jenkins项目,这时候你会发现不红了,这样就配置好了,接下来放一个小游戏的代码上去测试一下
链接:https://pan.baidu.com/s/1vkBAvBqcEovQuw9k20VMIg?pwd=kxxw
提取码:kxxw
准备了一个经典小游戏,直接解压到git初始化的目录里面,没用的删了就行
[root@shell git_workspace]# ll
total 48
-rw-r--r-- 1 root root 28032 May 24 2021 bgm.mp3
drwxr-xr-x 2 root root 23 May 24 2021 css
drwxr-xr-x 2 root root 23 May 24 2021 images
-rw-r--r-- 1 root root 8956 May 24 2021 index.html
drwxr-xr-x 2 root root 213 May 24 2021 js
drwxr-xr-x 2 root root 4096 May 24 2021 roms
-rw-r--r-- 1 root root 811 May 24 2021 shuoming.html
给他手动提交一下
[root@shell git_workspace]# rm -rf test.txt
[root@shell git_workspace]# git add *
[root@shell git_workspace]# git commit -m "xbw"
[root@shell git_workspace]# git push -u origin master
提交到远程仓库以后就是下面这样的
仓库那边代码上传之后就可以用jenkins进行拉取测试了,点击立即构建等待下方进度条,拉取结束后回到机器,/var/lib/jenkins/workspace 这个目录下有一个刚拉下来的项目就ok了
[root@jenkins workspace]# ll
total 0
drwxr-xr-x 7 root root 135 Feb 7 06:08 free_game
·现在代码可以拉取了,下一步可以给他放到网站里测试,代码拉到jenkins里使用脚本发到web服务器上
·这里准备一台web
·在jenkins服务器上准备一下脚本 给一下执行权限
[root@jenkins scripts]# pwd
/server/scripts
[root@jenkins scripts]# chmod +x xbw.sh
[root@jenkins scripts]# ls
xbw.sh
[root@jenkins scripts]# cat xbw.sh
#!/bin/bash
IP=10.0.0.8
tar zcf /opt/game_$BUILD_ID.tar.gz ./*
scp /opt/game_$BUILD_ID.tar.gz $IP:/code/
ssh $IP "mkdir /code/game_$BUILD_ID;"
ssh $IP "cd /code && tar xf game_$BUILD_ID.tar.gz -C game_$BUILD_ID && rm -rf game_$BUILD_ID.tar.gz;"
ssh $IP "cd /code && rm -rf xbw_game ; ln -s game_$BUILD_ID xbw_game"
·jenkins和web需要做一下免秘钥
·去jenkins项目点击配置拉到下面,选择点击 执行 shell
·把命令粘贴到文本框内 sh /server/scripts/xbw.sh
最后点击构建后代码会直接发送到web指定的目录内
[root@web02 code]# ls
game_5 xbw_game
并且页面也可以直接访问
1、添加钩子
#有个地方忘了写,登录进来先改密码,不然每次都得复制很麻烦,先改这个
拉到下面更改,保存后重新登录
现在的流程是写完代码手动提交在点击立即构建在部署到web服务器,下一步是添加触发器,在你提交代码到远程仓库,触发钩子自动构建部署到web服务器上。 点击配置
点击勾选选项,滑到下面点击Generate生成一个token复制一下
复制好之后返回gitlab,点击进入项目左侧导航列设置,点击Integrations将jenkins复制的token粘贴到对应位置,URL是jenkins勾选那个选项最后面的那个http连接,最后将gitlab和jenkins的设置都保存就可以测试了
操作的详细意义就不写什么意思了,网上有的是,多练练就懂了,测试钩子配置是否成功
#先修改一下index.html,打开往下翻有游戏名称可以加一点标记然后执行下面的操作。
[root@shell git_workspace]# git commit -am "v1.0"
[master bc635fd] v1.0
2 files changed, 2 insertions(+), 2 deletions(-)
delete mode 100644 test.txt
[root@shell git_workspace]# git push -u origin master
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 282 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To git@10.0.0.200:qxl/game.git
4451a4b..bc635fd master -> master
Branch master set up to track remote branch master from origin.
#将项目推到远程仓库之后,会直接发到web服务器上,我在魂斗罗后面加了个标签显示,可以看到已经ok了
五、Sonarqube
SonarQube是一种自动代码审查工具,可以检测出重复代码、代码漏洞、代码规范和安全性漏洞的问题。它可以与您现有的工作流程集成,以实现跨项目分支和提取请求的连续代码检查
Sonar Qube可以与多种软件整合进行代码扫描,比如Maven,Gradle,Git,Jenkins等,并且会将代码检测结果推送回Sonar Qube并且在系统提供的UI界面上显示出来
1、安装
1. SonarQube基础java开发,需安装open JDK8版本
2. SonarQube需要依赖MySQL数据库,至少5.6版本以上
3. SonarQube的小型实例至少4G内存,如果大型实例需要16G内存
Java我上面分享的网盘里面有
安装数据库
下载mysqlyum源
https://dev.mysql.com/downloads/repo/yum/
这个版本看着下我是centos7
下完了上传到服务器上,也可以复制连接直接wget
#下载完直接安装
[root@sonarqube ~]# rpm -ivh mysql80-community-release-el7-11.noarch.rpm
warning: mysql80-community-release-el7-11.noarch.rpm: Header V4 RSA/SHA256 Signature, key ID 3a79bd29: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:mysql80-community-release-el7-11 ################################# [100%]
#安装完之后会下载三个repo源
[root@sonarqube ~]# ls /etc/yum.repos.d/
CentOS-Base.repo epel.repo files mysql-community-debuginfo.repo mysql-community.repo mysql-community-source.repo
#修改一下源 mysql-community.repo 把8.0节点关掉打开5.7的
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch
enabled=1#这里
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2023
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch
enabled=0#这里
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2023
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
#直接安装,安装过程比较慢需要多等一会
[root@sonarqube yum.repos.d]# yum install mysql-community-server -y
[root@sonarqube yum.repos.d]# systemctl start mysqld
启动后默认密码在日志里,末尾12位就是密码
[root@sonarqube yum.repos.d]# cat /var/log/mysqld.log | grep "pass"
密码中有特殊符号加上单引号
[root@sonarqube yum.repos.d]# mysql -uroot -p'Q0kethtukp(<'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
#修改登录数据库密码,创建sonar数据库
mysql> set global validate_password_policy=0; #策略设为0,表示只检查密码长度
mysql> set global validate_password_length=6; #默认密码长度为6
mysql> alter user root@"localhost" identified by '123456';
[root@sonarqube sonarqube]# mysql -uroot -p123456 -e "CREATE DATABASE sonar DEFAULT CHARACTER SET utf8;"
mysql: [Warning] Using a password on the command line interface can be insecure.
#安装java,这个包上面网盘分享有
[root@sonarqube ~]# ls
anaconda-ks.cfg jdk-8u181-linux-x64.rpm
[root@sonarqube ~]# rpm -ivh jdk-8u181-linux-x64.rpm
#安装sonarqube,插件客户端啥的都有
链接:https://pan.baidu.com/s/1fnUVXbfYCF3CYkoIJXM6WA?pwd=kxxw
提取码:kxxw
[root@sonarqube ~]# unzip sonarqube-7.0.zip
[root@sonarqube ~]# ls
anaconda-ks.cfg jdk-8u181-linux-x64.rpm sonarqube-7.0 sonarqube-7.0.zip
[root@sonarqube ~]# mv sonarqube-7.0 /usr/local/
#做个软连接,更改一下启动用户
[root@sonarqube ~]# cd /usr/local/
[root@sonarqube local]# ls
bin etc games include lib lib64 libexec sbin share sonarqube-7.0 src
[root@sonarqube local]# ln -s sonarqube-7.0/ sonarqube
[root@sonarqube local]# useradd sonar
[root@sonarqube local]# chown -R sonar.sonar /usr/local/sonarqube-7.0/
#更改sonar的数据库设置,内容里面有把注释去掉就行了加上用户名密码
[root@sonarqube local]# vim /usr/local/sonarqube/conf/sonar.properties
sonar.jdbc.username=root
sonar.jdbc.password=123456
useUnicode=true&characterEncoding=utf8&rewrieBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
#使用普通用户启动
[root@sonarqube local]# su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start"
Starting SonarQube...
Started SonarQube.
#浏览器访问地址是10.0.0.203:9000
第一次进忘了截图让我关了我g,这个是首页,点击登录 账号密码都是admin,登录后就是获取token,输入个名字点击后面的按钮
右边黑色的那部分命令可以点击copy复制到jenkins找个位置保存下来,因为最下面那个值是唯一的,关闭这个窗口这个代码就再也出不来了,除非你重新创建一个项目,这里完事之后点击右上角跳过就完了,sonar配置完后需要把客户端安装到jenkins上,客户端的包上面连接有
[root@jenkins ~]# cat sonar.txt
sonar-scanner \
-Dsonar.projectKey=html \
-Dsonar.sources=. \
-Dsonar.host.url=http://10.0.0.203:9000 \
-Dsonar.login=d01aae94699940b8f47a15e7a6ce9a10e9f4aa08
2、配置
#上传上来之后解压放到指定目录下面做个软连接,环境变量想用就弄
[root@jenkins ~]# ls
anaconda-ks.cfg game sonar-scanner-4.2.0.1873-linux sonar-scanner-cli-4.2.0.1873-linux.zip sonar.txt
[root@jenkins ~]# mv sonar-scanner-4.2.0.1873-linux/ /usr/local/
[root@jenkins ~]# cd /usr/local/
[root@jenkins local]# ln -s sonar-scanner-4.2.0.1873-linux/ sonar
#下一步在服务端安装sonar的插件 插件的包上面连接也有 做之前先弄个备份 别搞错服务器
[root@sonarqube extensions]# su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart"
#按着做是不会出错的 就不测试了
下一步将sonarqube集成到jenkins里
回到jenkins点击 配置 拉到下面点击增加构建步骤选择图片选项
点击配置sonar 这里就是把sonar生成的那块黑色背景的命令放过来
name自定义,URL就是sonar的访问地址,下面的token现在还没有,需要先保存获取一下,填写完直接保存。重新选择进入全局配置,再点击添加这次就会有jenkins选项
类型选择Secert text 下面的Secret填sonar生成的
sonar-scanner \
-Dsonar.projectKey=html \
-Dsonar.sources=. \
-Dsonar.host.url=http://10.0.0.203:9000 \
-Dsonar.login=d01aae94699940b8f47a15e7a6ce9a10e9f4aa08 #就复制=后面的值
下面的ID自定义
设置配置完后还需要配置全局工具。先返回到jenkins的配置页,点击图片选项
滑倒下面点击新增
路径是jenkins上配置的客户端的路径,配置完后回到jenkins配置错误提示就都消失了。按照图片上把命令填上 点击保存。回到页面会看到屏幕上出现了Sonarqube图标显示,点击构建测试一下。成功就算完事
六、jenkins微信通知
jenkins集成微信,工作中档git有新代码提交会触发钩子自动完成上线,运维和开发人员不须时刻盯着jenkins,通过微信的方式显示给运维和开发人员
链接:https://pan.baidu.com/s/13pvW_asobBq42yxTVQYjFA?pwd=kxxw
提取码:kxxw
这个微信通知需要注册企业微信,就简单写一下步骤不写这部分的东西了(太多了懒得写),注册创建应用,复制Agentid和Secret的值。后面需要放到脚本里。企业可信ip注意一下,换WiFi啥的公网ip都会变
#第一个改的是你自己的企业微信名,下一个应用的agentid,第三个是企业id,最后一个是应用里面获取的
/server/scripts/jenkins_notify.py #我的脚本放这了
jenkins是没有直接使用微信通知的插件的,前面安装插件的地方已经放进去了。安装运行脚本的环境
#安之前下载阿里云的epel源,网络环境要稍微好一点,安装报错就多试几次,一般就是网不好
yum -y install python-pip
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
python get-pip.py
pip2.7 install requests
最后去配置一下项目,添加一个构建后操作,添加一下写的脚本和通知信息,保存后就可以执行构建了,构建成功后会将信息发送到你手机企业app上
下面是jenkins的其他项目配置流程,当然像前面的这些很多功能都可以在其他类型的项目上使用。
七、Pipeline项目
1.什么是pipeline
Jenkins 2.0的精髓是Pipeline as Code,是帮助Jenkins实现CI到CD转变的重要角色。什么是Pipeline,简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline as Code的理念。
2.Pipeline 概念
Pipeline 是一个用户定义的 CD 流水线模式。Pipeline 代码定义了通常包含构建、测试和发布步骤的完整的构建过程。
Node
node 是一个机器,它是 Jenkins 环境的一部分,并且能够执行 Pipeline。同时,node 代码块也是脚本式 Pipeline 语法的关键特性。
Stage
Stage 块定义了在整个 Pipeline 中执行的概念上不同的任务子集(例如“构建”,“测试”和“部署”阶段),许多插件使用它来可视化或呈现 Jenkins 管道状态/进度。
Step
一项任务。从根本上讲,一个步骤告诉 Jenkins 在特定时间点(或过程中的“步骤”)要做什么。例如,使用 sh step:sh 'make' 可以执行 make 这个 shell 命令。
1、配置
创建一个pipline项目,gitlab还是用那个小游戏
这个项目是通过脚本来运行,输出的结果可以按照步骤显示,脚本分为两种编写方法:脚本式、声名式。这里使用声名式。下面的配置是将脚本直接放到项目里面 保存。
链接:https://pan.baidu.com/s/15CvTiMswsy81r_qxGtFoNQ?pwd=kxxw
提取码:kxxw
放到git本备,脚本提交到远程仓库
[root@shell git_workspace]# ls
bgm.mp3 css images index.html Jenkinsfile js roms shuoming.html
[root@shell git_workspace]# git add .
[root@shell git_workspace]# git commit -m "Jenkinsfile"
[master 3997c2a] Jenkinsfile
1 file changed, 28 insertions(+)
create mode 100644 Jenkinsfile
[root@shell git_workspace]# git push -u origin master
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 590 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@10.0.0.200:qxl/game.git
bc635fd..3997c2a master -> master
Branch master set up to track remote branch master from origin.
配置一下sonarqube客户端,需要将地址指向到远程,按着下面改,没有的就加上
[root@jenkins conf]# pwd
/usr/local/sonar/conf
[root@jenkins conf]# ls
sonar-scanner.properties
[root@jenkins conf]# cat sonar-scanner.properties
#----- Default SonarQube server
sonar.host.url=http://10.0.0.203:9000
sonar.login=d01aae94699940b8f47a15e7a6ce9a10e9f4aa08 #这是上面sonarqube生成项目产生的
#----- Default source code encoding
sonar.sourceEncoding=UTF-8
直接立即构建,全绿就完了
八、Maven
Maven是一个强大的项目管理工具,广泛应用于Java开发中。在Linux系统上部署Maven项目需要一些特定的步骤和配置
链接:https://pan.baidu.com/s/1bNgBFD0jHyoOaELdvwDKDg?pwd=kxxw
提取码:kxxw
#安装Maven
下载上传到服务器后解压到指定位置
[root@jenkins ~]# ls
anaconda-ks.cfg apache-maven-3.3.9-bin.tar.gz game get-pip.py jenkins_notify.py sonar.txt
[root@jenkins ~]# tar xf apache-maven-3.3.9-bin.tar.gz -C /usr/local/
[root@jenkins local]# ll
total 0
drwxr-xr-x 6 root root 99 Feb 10 06:59 apache-maven-3.3.9
drwxr-xr-x. 2 root root 6 Apr 11 2018 bin
drwxr-xr-x. 2 root root 6 Apr 11 2018 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 games
drwxr-xr-x. 2 root root 6 Apr 11 2018 include
drwxr-xr-x. 2 root root 6 Apr 11 2018 lib
drwxr-xr-x. 2 root root 6 Apr 11 2018 lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 libexec
lrwxrwxrwx 1 root root 19 Feb 10 07:00 maven -> apache-maven-3.3.9/
drwxr-xr-x. 2 root root 6 Apr 11 2018 sbin
drwxr-xr-x. 5 root root 49 Dec 1 03:52 share
lrwxrwxrwx 1 root root 31 Feb 9 03:37 sonar -> sonar-scanner-4.2.0.1873-linux/
drwxr-xr-x 6 root root 51 Oct 1 2019 sonar-scanner-4.2.0.1873-linux
drwxr-xr-x. 2 root root 6 Apr 11 2018 src
#PATH变量就不弄了
命令释义
validate(验证): 验证项目正确,并且所有必要信息可用。
compile(编译): 编译项目源码
test(测试): 使用合适的单元测试框架测试编译后的源码。
package(打包): 源码编译之后,使用合适的格式(例如JAR格式)对编译后的源码进行打包。
integration-test(集成测试): 如果有需要,把包处理并部署到可以运行集成测试的环境中去。
verify(验证): 进行各种测试来验证包是否有效并且符合质量标准。
install(安装): 把包安装到本地仓库,使该包可以作为其他本地项目的依赖。
deploy(部署): 在集成或发布环境中完成,将最终软件包复制到远程存储库,以与其他开发人员和项目共享。
mvn clean (清除) : 清除上次编译的结果
mvn package -Dmaven.test.skip=true 跳过测试用例
cd hello-world
mvn package #会去maven的中央仓库去下载需要的依赖包和插件到.m2目录下
#配置阿里源
[root@jenkins maven]# pwd
/usr/local/maven
[root@jenkins maven]# ls
bin boot conf lib LICENSE NOTICE README.txt
[root@jenkins maven]# vim conf/settings.xml
#放到配置文件的mirrors标签里面,这样就配置完毕
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
#测试使用后面一起
九、Nexus
Nexus是一款开源的Maven仓库管理工具,可以搭建私有Maven仓库。
链接:https://pan.baidu.com/s/1kTwG47fBa5BEDX_KqwiDxg?pwd=kxxw
提取码:kxxw
#这个是nexus包,还需要java上面的连接有
#上传安装就不说了,都一样的
解压到/usr/local/,在做一个软连接
#启动
[root@nexus bin]# pwd
/usr/local/nexus/bin
[root@nexus bin]# ls
contrib nexus nexus.rc nexus.vmoptions
/usr/local/nexus/bin/nexus start
#访问
10.0.0.202:8081
用户名:admin 密码:admin123
登录后配置阿里云仓库
将图片中的第三步改成 http://maven.aliyun.com/nexus/content/groups/public 修改后点击下方save保存
Nexus 安装成功后,接下来需要修改 Maven 的配置文件(settings.xml),整合 Nexus。
找到 <servers> 标签,添加 Nexus 默认认证信息:
<server>
<id>my-nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>my-nexus-snapshot</id>
<username>admin</username>
<password>admin123</password>
</server>
找到 <mirrors> 标签,添加镜像:
<mirror>
<!--This sends everything else to /public -->
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</mirror>
找到 <profiles> 标签,添加仓库信息:
<profile>
<id>nexus</id>
<!--Enable snapshots for the built in central repo to direct -->
<!--all requests to nexus via the mirror -->
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
激活仓库:
<activeProfiles>
<!--make the profile active all the time -->
<activeProfile>nexus</activeProfile>
</activeProfiles>
配置完成后保存,并重启 nexus 服务。
重启 nexus 服务 完成后,在命令行窗口进入一个使用 Maven 构建的项目,输入 mvn package clean 命令,清理完成后,登录 nexus 的 admin 账号可以看到 Public Repositories 下出现了一些 Jar 包。
#这个文件已经准备好了,不用自己改
链接:https://pan.baidu.com/s/1NKXtA5nJ74IKNBm1i_v_bw?pwd=kxxw
提取码:kxxw
#下载直接上传到这个目录,可以把之前的备份
[root@jenkins conf]# pwd
/usr/local/maven/conf
[root@jenkins conf]# ls
logging settings.xml settings.xml.bak toolchains.xml
#这样maven、nexus就都配置完了,可以进行测试了
链接:https://pan.baidu.com/s/1Ht8TkYJKZotGzR3Ik3jAeQ?pwd=kxxw
提取码:kxxw
这里面是一个war包,下载上传解压
[root@jenkins hello-world-war]# ls
dist pom.xml README.md src
[root@jenkins hello-world-war]# /usr/local/maven/bin/mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Hello World Web Application Repository 1.0.0
[INFO] ------------------------------------------------------------------------
Downloading: http://10.0.0.202:8081/repository/maven-public/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.pom
Downloaded: http://10.0.0.202:8081/repository/maven-public/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plugin-2.6.pom (8 KB at 4.1 KB/sec)
Downloading: http://10.0.0.202:8081/repository/maven-public/org/apache/maven/plugins/maven-plugins/23/maven-plugins-23.pom
#这样就是配置没问题,这个项目打包的依赖都是从202下载
八、分布式构建
如果项目需要定期集成,同时每次集成都需要较长时间。如果都运行在master服务器上,会消耗过多资源,导致其他项目搁置无法集成,这时就需要在建立多台设备,并配置作为slave机器来为master提供负载服务。
1、配置
#从节点就不单独在拎出来一个服务器了,就放到neuxs服务器,当然学会怎么配置想放到那个服务器上都行
#java、git都有就不用安装了
#把jenkins服务器的sonar和maven拷贝过去
[root@jenkins local]# scp -r sonar maven 10.0.0.202:/usr/local/
[root@jenkins /]# scp -r server 10.0.0.202:/ #这个是脚本
#因为从节点肯定也是要拉取代码的,所以要把公钥复制到gitlab上
[root@nexus local]# cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDndzsUYX16oGkFAM1n7+2hmadwl+pc22XyDeyncnKzQPFd5KIzdUhHtCi6YLbGODxJkSWTbYVQiW0wPVdRtJB9CV0gPsiDTQSTdlNHQhZJ33vvKRM26Uyf5vj+pRTfgb9W+s9Gsh4eOuA6FYjQznvMLsfWsB/dqO00Ygp2le/345blF7Bp0Upts+VR0oIWrYJHbSrIUGjV070CNBl8zndqnNYJA7H+RkDXjBlV6Z6en32E+emufFB3QbyPF59vlXZ66oX3ks9ddnErbnfGWIhNaeU6qyNy9ugtAMY69mHdvwOaFjAOBLifKI2ihY1BIYBWeeCs73wnlc+Ihie3DVnL root@nexus
#先拉取一下项目通过一下指纹验证,不然构建项目的时候会有报错 git@10.0.0.200:qxl/game.git
配置jenkins,添加节点。点击系统管理拉到下面
新建节点,名称自定义。添加主机里面配置的是私钥
#把这个复制进去
[root@jenkins local]# cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA8iGi05DXUbEDrXPdR4PMwLAg0zebzx4RSwNd5o78UsRwR2Ay
ANxm1VwCGUzWLbIdYIC4cO1dbGSFx6nGrx6wP/4tGHltBjEFQuEzvSywIzW8bdRE
teFXYqHIgZoa3RbO0DotGg7AAEi/g7bAWqmY2JgoL5Gcg4Pxyf6Gd5BwduNWh
配置一下工具,配置maven忘记添加到全局工具了
构建测试,可以直接复制一个窗口,点击构建后返回到另一个窗口看结果