持续集成
Posted duplicity
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了持续集成相关的知识,希望对你有一定的参考价值。
持续集成教程
1..devops介绍
1.1.Devops是什么
应用程序DevOps(Development开发和Operations运维的组合词)是一组过程、方法与系统的统称,用于促进开发(/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
DevOps促进开发、测试、运维之间的沟通、协作与整合
它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
软件它的出现是由于行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运维工作必须紧密合作。
为了快速代码上线
平时我们开发和运维的流程是分析需求(plan) -> 代码开发(code) -> 打包构建(build) -> 用例测试(test) -> 上线部署(deploy) -> 项目运营(operation) ->异常监控(monitor)。在整个流程中一般公司常常会分配三个岗位(开发、测试、运维),而在DevOps出现后,只需一个岗位即可,这个岗位则是囊括了开发、测试和运维的工作,集成了开发、交付、维护、监控等。当前几乎所有的顶尖公司均采用了该方法,用以提高软件开发质量,并缩短软件开发生命周期。从而以达到每个公司对软件产品的期望,交付出客户最满意的产品。
1.2Devops能干什么
提高产品质量
1.自动化测试
比如码云里面的自动化测试,测试你的代码里有没有漏洞,有没有bug
2.持续集成
我们可以把这个持续集成理解为不断的代码合并,开发写完代码会发布到线上,开发的代码是基于原有的功能上写的,当你把新写的模块放到总的代码里面去,我们会进行代码合并
3.代码管理工具
1.3Devops实现
大公司不方便往devops迁移
devops适用于devops
刚建立的小公司。中小型公司慢慢迁移
1.4持续集成概念
持续集成Continuous IntegrationCI
持续交付Continuous DeliveryCD
持续部署Continuous Deployment CD
1、什么是持续集成:
是一种软件开发时间。持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。
开发出来的东西,立马进行上线
2、 什么是持续交付:
持续交付指的是在持续集成的环境基础之上,将代码部署到预生产环境
3、 持续部署:
在持续交付的基础上,把部署到生产环境的过程自动化,持续部署和持续交付的区别就是最终部署到生产环境是自动化的。
4、 部署代码上线流程
1.代码获取(直接了拉取)
2.编译 (可选)
3.配置文件放进去
4.打包
5.scp到目标服务器
6.将目标服务器移除集群
7.解压并放置到Webroot(网站根站点目录)
8.Scp 差异文件
9.重启 (可选)
10.测试
11.加入集群
1.5版本发布介绍
1)AB Test是一种灰度方式,通常差异度较小,侧重从多种方案中选择最优方案。
简单的说,就是为同一个目标制定两个方案(比如两个页面),让一部分用户使用 A 方案,另一部分用户使用 B 方案, 记录下用户的使用情况,看哪个方案更符合。
一般来说,每个设计方案大体上是相同的,只是某一个地方有所不同,比如某出排版、文案、图片、颜色等。然后对不同的用户展示不同的方案。
2)蓝绿部署,英文名Blue Green Deployment,是一种可以保证系统在不间断提供服务的情况下上线的部署方式。
所谓蓝绿部署,是指同时运行两个版本的应用,如图所示,蓝绿部署的时候,并不停止掉老版本,而是直接部署一套新版本,等新版本运行起来后,再将流量切换到新版本上。但是蓝绿部署要求在升级过程中,同时运行两套程序,对硬件的要求就是日常所需的二倍,比如日常运行时,需要10台服务器支撑业务,那么使用蓝绿部署,你就需要购置二十台服务器。
‘
3)滚动发布能够解决掉蓝绿部署时对硬件要求增倍的问题。
所谓滚动升级,就是在升级过程中,并不一下子启动所有新版本,是先启动一台新版本,再停止一台老版本,然后再启动一台新版本,再停止一台老版本,直到升级完成,这样的话,如果日常需要10台服务器,那么升级过程中也就只需要11台就行了。
4)灰度发布也叫金丝雀发布,起源是,矿井工人发现,金丝雀对瓦斯气体很敏感,矿工会在下井之前,先放一只金丝雀到井中,如果金丝雀不叫了,就代表瓦斯浓度高。
在灰度发布开始后,先启动一个新版本应用,但是并不直接将流量切过来,而是测试人员对新版本进行线上测试,启动的这个新版本应用,就是我们的金丝雀。如果没有问题,那么可以将少量的用户流量导入到新版本上,然后再对新版本做运行状态观察,收集各种运行时数据,如果此时对新旧版本做各种数据对比,就是所谓的A/B测试。
当确认新版本运行良好后,再逐步将更多的流量导入到新版本上,在此期间,还可以不断地调整新旧两个版本的运行的服务器副本数量,以使得新版本能够承受越来越大的流量压力。直到将100%的流量都切换到新版本上,最后关闭剩下的老版本服务,完成灰度发布。
如果在灰度发布过程中(灰度期)发现了新版本有问题,就应该立即将流量切回老版本上,这样,就会将负面影响控制在最小范围内。
2.版本控制系统
2.1版本控制系统简介
版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。多人开发
2.2 为什么需要版本控制系统
作用一:备份
程序员每做一步功能性的更新和迭代,都需要备份一次,这是一个很好的习惯,而在版本控制工具中你不需要再复制和粘贴,产生大量的代码冗余,你只需要提交一次到服务器中就可以了。
作用二:协调开发
一般公司的开发团队少则十几个人,多则上百。当多个人共同开发一套系统的时候,你改一部分,我改一部分,肯定有代码冲突的地方,当多个人同时改了一个文件,这么多人,每个人改哪一块了?最终以谁的代码为准?如何处理这种场景下的代码冲突?这就是版本控制的协调开发作用,这在没有工具之前是非常麻烦,你需要打开至少两个窗口,一行一行的比较。
2.3常见版本管理工具
1)SVN
集中式的版本控制系统,只有一个数据仓库,如果中央仓库挂了或者不可访问了,所有的使用者无法使用svn,无法进行提交或备份
2)Git
分布式版本系统,在每个使用者电脑上都有一个完整的数据仓库,没有网络依旧可以使用git,为了多人合作,会将本地数据同步到Git服务器或者Github等代码仓库
3.Git本地仓库
3.1Git安装
3.1.1系统环境准备
1)环境准备
关闭防火墙
关闭selinux
3.1.2Git安装部署
[root@git ~]# yum install git -y
[root@git ~]# git config
用法:git config [选项]
--global 使用全局配置文件
--system 使用系统级配置文件
--local 使用版本库级配置文件
[root@git ~]# git config --global user.name "yunxuan"
[root@git ~]# git config --global user.email "yunxuan@qq.com"
[root@git ~]# git config --global color.ui true
[root@git ~]# git config --list
user.name=yunxuan
user.email=yunxuan@qq.com
color.ui=true
3.1.3 Git初始化
mkdir git_data
cd git_data
初始化仓库
git init
查看工作区状态
git status
[root@git git_data]# tree .git/
branches #分支目录
config#定义项目特有的配置选项
description #定义项目特有的配置选项
HEAD #指示当前的分支
hooks #包括git勾子文件
info #包含一个全局排除文件
objects #存放所有数据内容,有info和pack两个子文件夹
refs #存放指向数据(分支)的提交对象的指针
index #保存暂存区信息,在执行gitinit的时候,这个文件还没有
3.2.Git常规使用
3.2.1创建数据-提交数据
[root@git git_data]# touch a b c
[root@git git_data]# git status
添加a文件到暂存区
[root@git git_data]# git add a
添加所有文件到暂存区
[root@git git_data]# git add .
从暂存去删除c
[root@git git_data]# git rm --cached c
同时删除工作区和暂存区
[root@git git_data]# git rm -f b
把暂存区提交到本地仓库
[root@git git_data]# git commit -m "add newfile a"
3.2.2 Git四种状态
本地目录
缓存区
本地仓库
远程仓库
3.2.3 Git基础命令
修改文件名的两种方法
1)常规改名
[root@git git_data]# git add a.txt
[root@git git_data]# git status
[root@git git_data]# git commit -m "modifiled a a.txt"
2)直接用git改名
[root@git git_data]# git mv a.txt a
[root@git git_data]# git status
[root@git git_data]# git commit -m "modefile a.txt a "
git文件比对
git diff 默认比对工作目录和暂存区有什么不同
git diff --cache #比对暂存区和本地仓库有什么不同
直接从工作目录提交到本地仓库
[root@git git_data]# git commit -am "111"
查看历史提交过的信息
[root@git git_data]# git log
[root@git git_data]# git log –oneline
[root@git git_data]# git log --oneline --decorate
--decorate #显示指针
--oneline #精简显示
-p #显示详细内容
切换历史版本指针
[root@web02 data]# git reset --hard 06fa861
查看所有的历史
[root@web02 data]# git reflog
git分支
创建一个test分支
[root@web02 data]# git branch test
查看分支
[root@web02 data]# git branch
切换分支
[root@web02 data]# git checkout test
创建并切换分支
[root@web02 data]# git checkout -b test
删除分支
[root@web02 data]# git branch -d test
合并test分支
[root@web02 data]# git merge test
代码冲突演示
新版本不会出现错误
3.2.4 Git标签使用
给8a8c51d打tag标签
git log
git tag -a v1.0 8a8c51d -m "tag v1.0 abc index"
查看v1.0信息
git show v1.0
给当前版本打标签
[root@web02 data]# git tag -a v2.0 -m "v2.0"
删除标签
[root@web02 data]# git tag -d v2.0
4.Github使用
开源软件GitHub是一个面向及私有项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名GitHub。
注册用户
创建仓库
配置ssh-key
上传项目
克隆项目到本地
推送新代码到github
添加一个origin的远程仓库
git@github.com:a914356887/git_data.gitgit remote add origin
删除远程仓库
git remote remove origin
查询远程仓库
git remote -v
把当前分支改名
[root@web01 data]# git branch -M main
推送main项目到origin远程仓库
git push -u origin main
生成密钥
[root@web01 data]# ssh-keygen -t rsa
查看密钥
[root@web01 data]# cat /root/.ssh/id_rsa.pub
5.Gitlab
5.1Gitlab简介
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。GitLab由乌克兰程序员DmitriyZaporozhets和ValerySizov开发,它由Ruby写成。后来,一些部分用Go语言重写,现今并在国内外大中型互联网公司广泛使用。
Gitlab是私有的github
git 是一种基于命令的版本控制系统,全命令操作,没有可视化界面
gitlab 是一个基于git实现的在线代码仓库软件,提供web可视化管理界面,通常用于企业团队内部协作开发
github 是一个基于git实现的在线代码托管仓库,亦提供可视化管理界面,同时免费账户和提供付费账户,提供开放和私有的仓库,大部分的开源项目都选择github作为代码托管仓库
GitLab是一个利用Ruby on Rails开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。
GitLab拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。
5.2安装
5.2.1 下载rpm安装
安装环境
Centos6或者7
3G内存(实验)生产至少8G
安装包
禁用防火墙,关闭selinux
https://about.gitlab.com/inst...
清华源下载地址:https://mirrors.tuna.tsinghua...
yum install -y curl policycoreutils-python openssh-server perl
rpm -ivh gitlab-ce-13.6.3-ce.0.el7.x86_64.rpm
5.2.2yum源安装
1)添加yum源
vi/etc/yum.repos.d/gitlab-ce.repo
[gitlab-ce]
name=gitlab-ce
baseurl=http://mirrors.tuna.tsinghua....
gpgcheck=0
enabled=1
2)安装
[root@gitlab ~]# yum -y install openssh-server cronie git wget patch gitlab-ce-13.2.1
3)配置gitlab
vi /etc/gitlab/gitlab.rb
将external_url \'http://gitlab.example.com\'更... \'http://你的地址\'
更改数据目录,也可以默认
git_data_dirs({
"default" => {
"path" => "/data"
}
})
优化进程减少内存占用
unicorn[\'worker_processes\'] = 2
5.3.Gitlab介绍及常用命令
1)常用命令
gitlab-ctl start #启动全部服务
gitlab-ctl restart#重启全部服务
gitlab-ctl stop #停止全部服务
gitlab-ctl restart nginx #重启单个服务,如重启nginx
gitlab-ctl status #查看服务状态
gitlab-ctl reconfigure #使配置文件生效
gitlab-ctl show-config #验证配置文件
gitlab-ctl uninstall #删除gitlab(保留数据)
gitlab-ctl cleanse #删除所有数据,从新开始
gitlab-ctl tail <service name>查看服务的日志
gitlab-ctl tail nginx #如查看gitlab下nginx日志
gitlab-rails console #进入控制台
组件介绍
nginx:静态Web服务器
gitlab-shell:用于处理Git命令和修改authorized keys列表,gitlab是以Git为底层的,操作实际上最后就是调用gitlab-shell命令进行处理。
gitlab-workhorse:轻量级的反向代理服务器
logrotate:日志文件管理工具
postgresql:数据库
redis:缓存数据库
sidekiq:用于在后台执行队列任务(异步执行)
unicorn:GitLab Rails应用是托管在这个服务器上面的
gitlab配置路径:/etc/gitlab/ 路径下有gitlab.rb配置文件
应用代码和组件依赖程序:/opt/gitlab
各个组件存储路径: /var/opt/gitlab/
git push
仓库默认存储路径 /var/opt/gitlab/git-data/repositories
版本文件备份路径:/var/opt/gitlab/backups/
nginx安装路径:/var/opt/gitlab/nginx/
redis安装路径:/var/opt/gitlab/redis
5.4gitlab使用
5.4.1使用gitlab修改图标登录页面提示信息
Navigation bar #导航栏
Favicon #网站图标
Sign in/Sign up pages #登录注册页面
5.4.2构建第一个项目
5.4.2.1创建一个组
5.4.2.2创建项目
5.5推送代码
1)设置登录key
2)三种方式
创建新的仓库
推送现有文件夹
推送现有git存储库
3)推送已有的仓库
因为我在使用github时候已经创建了一个所以我们直接用推送现有仓库
cd existing_repo
git remote remove origin
git remote add origin http://10.0.0.100/test/git_da...
git push -u origin master
5.6设置dev用户并下载代码
5.6.1创建dev用户
1)创建用户
2)设置密码
3)dev用户添加进入组
5.7master分支保护
gitlab12版本之前默认不开启分支保护
gitlab>=12版本默认开启了分支保护,不允许直接推送代码到主干
1.)打开项目
6.Jenkins
6.1jenkins简介
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
官网
https://www.jenkins.io/
6.2安装Jenkins
1)安装jdk
[root@jenkins ~]# rpm -ivh jdk-8u281-linux-x64.rpm
2)安装Jenkins
[root@jenkins ~]# rpm -ivh jenkins-2.263.1-1.1.noarch.rpm
下载地址:https://mirrors.tuna.tsinghua...
6.3安装目录解析
[root@jenkins ~]# rpm -ql jenkins
/etc/init.d/Jenkins #启动文件
/etc/logrotate.d/Jenkins #日志切割
/etc/sysconfig/Jenkins #jenkins主配置文件,比如端口、JENKINX_HOME都可以在这配置
/usr/lib/jenkins/jenkins.war #jenkins主配置,升级直接下载一个war包放在这里
/var/lib/Jenkins #默认的工作目录JENKINX_HOME
/var/log/Jenkins #日志文件
/var/lib/jenkins/plugins/ #插件目录
6.4启动服务
[root@jenkins ~]# systemctl start jenkins
[root@jenkins ~]# systemctl enable jenkins
6.5进入jenkins网页配置
http://10.0.0.101:8080/
查询密码
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
5266a733987e474f9a45c453d772f2b0
修改密码
6.6更换插件源
Advanced首页 --> Manage Jenkins --> Manager Plugins—>
https://updates.jenkins.io/up...
改为
https://mirror.tuna.tsinghua....
更改完成之后需要重启Jenkins
systemctl restart Jenkins
6.7安装中文插件
首页 --> Manage Jenkins --> Manager Plugins
需要安装
Locale plugin和Localization: Chinese (Simplified)
然后系统关系—系统配置--Default Language
注:如果发生一半翻译,一半不翻译的情况先把默认语言改为zh_US重启服务器,然后再改为zh_CN即可解决
6.8导入插件
插件目录/var/lib/jenkins/plugins
6.9基础构建项目
6.9.1构建一个自由风格的项目
新建任务—自由风格项目—输入名字—左下角确定
修改shell创建文件
touch 1.txt
观察
/var/lib/jenkins/workspace/目录下
6.9.2 Jenkins+Gitlab+脚本+Nginx自动发布网站
在gitlab上创建一个仓库
在Jenkins中配置
jenkins服务器编写脚本
[root@jenkins index]# cat /scripts/deploy.sh
!/bin/bash
DATE=date +%F-%H-%M-%S
WEB_html=/usr/share/nginx/
cd /var/lib/jenkins/workspace/freestyle-job/
tar -zcf /tmp/web-${DATE}.tar.gz ./
scp /tmp/web-${DATE}.tar.gz root@10.0.0.7:/$WEB_HTML
ssh root@10.0.0.7 "mkdir ${WEB_HTML}/web-${DATE}"
ssh root@10.0.0.7 "cd $WEB_HTML && tar -xf web-${DATE}.tar.gz -C web-${DATE} && rm -rf web-${DATE}.tar.gz "
ssh root@10.0.0.7 "cd $WEB_HTML && rm -rf html && ln -s web-${DATE} html "
chmod +x /scripts/deploy.sh
免密钥认证
5)配置jenkins的构建项目执行后使用调用脚本
6.9.3 推送代码自动构建
我们需要复制这个hash值
2)配置gitlab
6.9.4Jenkins执行结果发送给Gitlab
1)Gtilab生成token给jenkins链接使用
用户—设置—访问令牌
2)配置jenkins
系统管理—系统配置—Gitlab
3)配置Jenkins哪个项目返回给Gitlab
进入jenkins项目—配置—构建后的操作
4)立即构建测试
6.10Maven项目构建
6.10.1maven介绍
项目管理工具项目生命周期插件Maven是一个,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
插件Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。
此外,Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件,等等。
maven主要功能就是开发人员写完代码我们需要打包在发布,maven就是打包命令,然后去官网下载依赖去打包项目
6.10.2maven安装
http://maven.apache.org/downl...
清华源地址:
[root@jenkins ~]# wget https://mirrors.tuna.tsinghua...
[root@jenkins freestyle-job]# tar -xf apache-maven-3.5.4-bin.tar.gz -C /usr/local/
[root@jenkins freestyle-job]# cd /usr/local/
[root@jenkins local]# ln -s apache-maven-3.5.4/ maven
6.10.3目录解析
bin 该目录包含了mvn运行的脚本,这些脚本用来配置java命令,准备好classpath喝相关的java系统属性
mvn是基于UNIX平台shell脚本,mvn.bat是基于Windows平台的运行脚本(所有的mvn命令,实际均为执行这两条命令)
mvnDebug,mvnDebu.bat 同样,前者是unix环境shell脚本,后者为windows环境脚本
m2.conf 这是classworlds的配置文件
boot 该目录下文件是一个类加载器,相对于默认的java类加载器,它提供了更丰富的语法以方便配置,maven用该框架,加载自己的类库
conf 该目录包含一个非常重要的文件settings.xml,直接修改此文件,可以在机器上全局的定制maven行为,一般建议,复制该文件到~ /.m2/目录下,然后再修改,在用户范围定制maven行为
lib 包含了maven允许时需要的java类库,这个lib目录可以说是真正的maven
LICENSE.txt 记录了maven使用的软件许可证
NOTICE.txt 记录了maven包含的第三方软件
README.txt 包含了maven的简介,包括安装需求和如何安装的简要命令等
6.10.4maven常用命令
首先添加环境变量
export PATH=/usr/local/apache-maven-3.5.4/bin/:$PATH
mvn -v #查看版本号
mvn package # 打包
mvn site #产生site
mvn tes #运行测试
mvn compile #编译
mvn test-compile #编译测试代码
mvn archetype:generate #反向生成项目的骨架
mvn jar#生成jar包
mvn install #本地安装
mvn clean #清除编译后的项目文件
mvn eclipse:eclipse #生成eclipse项目
mvn idea:idea #生成idea项目
mvn -Dtest package #只打包不测试
mvn test -skipping compile #只测试不编译
mvn dependency:list #查看当前项目已被解析的依赖
mvn deploy #上传到私服
mvn source:jar #源码打包
mvn -e #显示详细错误信息
mvn validate #验证工程是否正确
mvn jetty:run #运行项目于jetty上
6.10.4修改maven国内打包源
[root@jenkins helloword]# vim /usr/local/maven/conf/settings.xml
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus...</url>
</mirror>
</mirrors>
6.10.5部署Maven私服nexus
https://www.sonatype.com/prod...
1配置仓库的两种选项
1)在项目中的pom.xml配置,只对当前项目生效
2)在maven配置全局所有项目生效
2)部署nexus
[root@nexus ~]# rpm -ivh jdk-8u281-linux-x64.rpm
[root@nexus ~]# tar -xf nexus-3.29.0-02-unix.tar.gz -C /usr/local/
[root@nexus local]# ln -s nexus-3.29.0-02/ nexus
3)启动nexus
[root@nexus nexus]# cd /usr/local/nexus/bin/
[root@nexus bin]# ./nexus start
4)配置文件解析
查看 nexus 的配置文件conf/nexus.properties
application-port=8081 # nexus 的访问端口配置
application-host=0.0.0.0 # nexus 主机监听配置(不用修改)
nexus-webapp=${bundleBasedir}/nexus # nexus 工程目录
nexus-webapp-context-path=/nexus # nexus 的 web 访问路径
nexus-work=${bundleBasedir}/../sonatype-work/nexus # nexus 仓库目录
runtime=${bundleBasedir}/nexus/WEB-INF # nexus 运行程序目录
5)进入网页配置代理服务器
http://IP:8081
右上角sign in 登陆
以前版本默认密码
账户admin
密码admin123
新版本密码写在/usr/local/sonatype-work/nexus3/admin.password文件中
cat /usr/local/sonatype-work/nexus3/admin.password
6)配置代理服务器
点击小齿轮—Repositories—maven-central—Remote storage修改为阿里云的
7)配置使用nexus私服
点击小齿轮—Repositories—maven-public
记录期中的url
a.在maven的setting.xml中配置
<servers>
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
<mirrors>
<mirror>
<!--该镜像的唯一标识符。id用来区分不同的mirror元素。 -->
<id>maven-public</id>
<!--镜像名称 -->
<name>maven-public</name>
<!--*指的是访问任何仓库都使用我们的私服-->
<mirrorOf>*</mirrorOf>
<!--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->
<url>http://10.0.0.102:8081/repository/maven-public/</url>
</mirror>
</mirrors>
b.配置项目的pom文件
<repositories>
<repository>
<id>maven-nexus</id>
<name>maven-nexus</name>
<url>http://10.0.0.102:8081/repository/maven-public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
二选一即可
6.10.6 Java代码自动上线
1)配置jenkins中maven路径
系统管理—全局工具配置—新增maven
2)创建一个项目
maven-job
!/bin/bash
DATE=date +%F-%H-%M-%S
MAVEN_DIR=/var/lib/jenkins/workspace/maven-job
cd $MAVEN_DIR
cp target/server-1.0-SNAPSHOT.jar /tmp/
kill -9 ps -ef | grep "java -jar target/server-1.0-SNAPSHOT.jar" | grep -v grep|awk \'{print $2}\'
rm -rf /tmp/server-1.0-SNAPSHOT.jar
nohup java -jar /tmp/server-1.0-SNAPSHOT.jar &
mkdir /mvn/maven-${DATE}
mv $MAVEN_DIR/* /mvn/maven-${DATE}
!/bin/bash
DATE=date +%F-%H-%M-%S
MAVEN_DIR=/var/lib/jenkins/workspace/maven-job
cd $MAVEN_DIR
kill -9 ps -ef | grep "java -jar target/server-1.0-SNAPSHOT.jar" | grep -v grep|awk \'{print $2}\'
mkdir /mvn/maven-${DATE}
mv $MAVEN_DIR/* /mvn/maven-${DATE}
nohup java -jar /mvn/maven-${DATE}/src/server-1.0-SNAPSHOT.jar &
6.11pipline项目
6.11.1pipline介绍
中文意为管线,意义等同于流水线。
从一个现象说起,有一家咖啡吧生意特别好,每天来的客人络绎不绝,客人A来到柜台,客人B紧随其后,客人C排在客人B后面,客人D排在客人C后面,客人E排在客人D后面,一直排到店面门外。老板和三个员工首先为客人A准备食物:员工甲拿了一个干净的盘子,然后员工乙在盘子里装上薯条,员工丙再在盘子里放上豌豆,老板最后配上一杯饮料,完成对客人A的服务,送走客人A,下一位客人B开始被服务。然后员工甲又拿了一个干净的盘子,员工乙又装薯条,员工丙又放豌豆,老板又配上了一杯饮料,送走客人B,客人C开始被服务。一直重复下去。
Jenkins 2.0的精髓是Pipeline as Code,是帮助Jenkins实现CI到CD转变的重要角色。什么是Pipeline,简单
来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个
任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy
脚本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline as Code的理念。
6.11.2pipline概念
pipeline是一个用户定义的cd流水线没事。pipeline代码定义了通常包括构建、测试和发布步骤的完整的构建过程
Node
node是一个机器,它是Jenkins环境的一部分,并且能够执行pipeline同时node代码块也是脚本式
Stage
Stage块定义了在整个Pipeline中执行的概念上不同的任务子集(例如构建,测试,和部署阶段)许多插件使用它可视化或呈现Jenkins管道状态/进度
Step
step是一项任务,从根本上讲,一个步骤告诉Jenkins在特定时间点(或过程中的步骤)要做什么.例如.使用sh step:sh ‘make’可以执行make这个shell命令
pipeline{
agent any
stages{
stage("get code"){
steps{
echo "get code from scm"
}
}
stage("package"){
steps{
echo "package code"
}
}
stage("deploy"){
steps{
echo "deploy packge to node1"
}
}
}
}
示列2:
pipeline{
agent any
stages{
stage("get code"){
steps{
echo "get code"
}
}
stage("unit test"){
steps{
echo "unit test"
} }
stage("package"){
steps{
sh \'tar zcf /opt/web‐${BUILD_ID}.tar.gz ./* --exclude=./git --exclude=./Jenkinsfile\'
} }
stage("deploy"){
steps{
sh \'ssh 10.0.0.7 "cd /code && mkdir web‐${BUILD_ID}"\'
sh \'scp /opt/web‐${BUILD_ID}.tar.gz 10.0.0.7:/code/web‐${BUILD_ID}\'
sh \'ssh 10.0.0.7 "cd /code/web‐${BUILD_ID} && tar xf web‐${BUILD_ID}.tar.gz && rm -rf web‐${BUILD_ID}.tar.gz"\'
sh \'ssh 10.0.0.7 "cd /code && rm -rf html && ln -s web‐${BUILD_ID} /code/html"\'
}
} }
}
报错演示
1)如果报错128错误,因为启动用户是Jenkins,没有添加ssh-key所以这里会报错
解决方法一:
修改主配置文件中启动用户为root
解决方法二:
userdel Jenkins
useradd Jenkins
给jenkins生成目录授权
生成key添加
实训一:千台并发
Jenkins安装插件
Publish Over SSH用于连接远程服务器
Deploy to container插件用于把打包的应用发布到远程服务器
以上是关于持续集成的主要内容,如果未能解决你的问题,请参考以下文章