近几年一直很流行CI/CD自动化构建发布平台,各大公司也都在搞比较适合自己业务的CI/CD平台,他不仅能够节省时间提升发布效率,同时也能够降低发布风险,因为以前都是会有人工介入为发布增加了很多不确定性,有了CI/CD平台能够更好的管控发布规范。
今天我们来简单的介绍下比较基础班的CI/CD平台的搭建,前期准备:
// 移出旧版本JDK
yum remove -y `yum list installed | grep java | awk '{print $1}'`
yum remove -y `yum list installed | grep jdk | awk '{print $1}'`
// 安装JDK1.8,JDK默认安装路径/usr/lib/jvm
yum install -y java-1.8.0-openjdk*
// 如果/etc/profile未设置JAVA_HOME,则追加JAVA环境变量
[[ -z `cat /etc/profile | grep JAVA_HOME` ]] && tee -a /etc/profile <<-EOF
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64
export PATH=\$PATH:\$JAVA_HOME/bin
export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar
EOF
// 使环境变量生效
source /etc/profile
// 下载jenkins,这个版本使目前最新的版本
wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.249.2-1.1.noarch.rpm
// 安装
rpm -ivh jenkins-2.249.2-1.1.noarch.rpm
// 安装完成后,可以配置jenkis的端口,找到JENKINS_PORT="8080",默认是8080,可以修改
vi /etc/sysconfig/jenkins
// 执行脚本,停止使用stop,重启用restart
service jenkins start
// 安装成功后Jenkins将作为一个守护进程随系统启动
// 系统会创建一个“jenkins”用户来允许这个服务,如果改变服务所有者,同时需要修改/var/log/jenkins, /var/lib/jenkins, 和/var/cache/jenkins的所有者
// 启动的时候将从/etc/sysconfig/jenkins获取配置参数
// 默认情况下,Jenkins运行在8080端口,在浏览器中直接访问该端进行服务配置
// 此时就可以打开浏览器输入IP+你配置的端口不配默认是8080来访问jenkins了
// 注意:第一次访问时,出现的页面会给你一个文件路径,需要你连上机器,打开这个文件,其中有一个默认的初始密码,用这个初始密码按照也上的提示去登陆,后续设置新的账号密码等,然后可以选择安装一些插件。都初始化完成之后就可以正式使用jenkins拉。
jenkins的进程已经在跑拉
下面是浏览器访问,可以安装一些插件,建议刚开始初始化的时候就默认安装一波,不够的后面在这里继续补充安装。
这些是我已经安装的插件列表,包括git,maven等。
Ant Plugin 1.11
Apache HttpComponents Client 4.x API Plugin 4.5.10-2.0
Authentication Tokens API Plugin 1.4
Bootstrap 4 API Plugin 4.5.3-1
bouncycastle API Plugin 2.18
Branch API Plugin 2.6.0
Build Timeout 1.20
Checks API plugin 1.0.3
Command Agent Launcher Plugin 1.4
Credentials Binding Plugin 1.24
Credentials Plugin 2.3.13
Display URL API 2.3.3
Docker Commons Plugin 1.17
Docker Pipeline 1.24
Durable Task Plugin 1.35
ECharts API Plugin 4.9.0-2
Email Extension Plugin 2.77
Folders Plugin 6.14
Font Awesome API Plugin 5.15.1-1
Git client plugin 3.5.1
Git Parameter Plug-In 0.9.13
Git plugin 4.4.4
GIT server Plugin 1.9
GitHub API Plugin 1.116
GitHub Branch Source Plugin 2.9.1
GitHub Organization Folder Plugin 1.6
GitHub plugin 1.31.0
GitLab Plugin 1.5.13
Gradle Plugin 1.36
Jackson 2 API Plugin 2.11.3
Javadoc Plugin 1.6
JavaScript GUI Lib: ACE Editor bundle plugin 1.1
JavaScript GUI Lib: Handlebars bundle plugin 1.1.1
JavaScript GUI Lib: jQuery bundles (jQuery and jQuery UI) plugin 1.2.1
JavaScript GUI Lib: Moment.js bundle plugin 1.1.1
jQuery plugin 1.12.4-1
JQuery3 API Plugin 3.5.1-2
JSch dependency plugin 0.1.55.2
JUnit Plugin 1.41
LDAP Plugin 1.26
Localization Support Plugin 1.1
Localization: Chinese (Simplified) 1.0.20
Lockable Resources plugin 2.10
Mailer Plugin 1.32.1
MapDB API Plugin 1.0.9.0
Matrix Authorization Strategy Plugin 2.6.3
Matrix Project Plugin 1.18
Maven Integration plugin 3.8
OkHttp Plugin 3.14.9
Oracle Java SE Development Kit Installer Plugin 1.4
OWASP Markup Formatter Plugin 2.1
PAM Authentication plugin 1.6
Pipeline 2.6
Pipeline Graph Analysis Plugin 1.10
Pipeline: API 2.40
Pipeline: Basic Steps 2.22
Pipeline: Build Step 2.13
Pipeline: Declarative 1.7.2
Pipeline: Declarative Agent API 1.1.1
Pipeline: Declarative Extension Points API 1.7.2
Pipeline: GitHub Groovy Libraries 1.0
Pipeline: Groovy 2.83
Pipeline: Input Step 2.12
Pipeline: Job 2.40
Pipeline: Milestone Step 1.3.1
Pipeline: Model API 1.7.2
Pipeline: Multibranch 2.22
Pipeline: Nodes and Processes 2.36
Pipeline: REST API Plugin 2.17
Pipeline: SCM Step 2.11
Pipeline: Shared Groovy Libraries 2.17
Pipeline: Stage Step 2.5
Pipeline: Stage Tags Metadata 1.7.2
Pipeline: Stage View Plugin 2.17
Pipeline: Step API 2.23
Pipeline: Supporting APIs 3.5
Plain Credentials Plugin 1.7
Plugin Utilities API Plugin 1.4.0
Popper.js API Plugin 1.16.0-7
Resource Disposer Plugin 0.14
SCM API Plugin 2.6.4
Script Security Plugin 1.75
Snakeyaml API Plugin 1.27.0
SSH Build Agents plugin 1.31.2
SSH Credentials Plugin 1.18.1
Structs Plugin 1.20
Subversion Plug-in 2.13.1
Timestamper 1.11.7
Token Macro Plugin 2.12
Trilead API Plugin 1.0.11
Workspace Cleanup Plugin 0.38
// 安装git
yum -y install git
// 安装完成后查看安装目录
whereis git
git: /usr/bin/git /usr/share/man/man1/git.1.gz
// 那么/usr/bin/git就是git的目录
配置jenkins全局工具配置
这里只配置了Git其他的都采用默认方式,这里的git地址就是上面安装git的目录
输入构建项目的名字,和构建的模式这里选择的是maven项目模式
这里是我的项目结构父项目包含多个子项目,每个子项目都有一个自己pom.xml,下面就演示怎么配置一个eureka项目的构建发布任务。
下面是这个任务的配置,包括git地址,git账号,分支,以及拉下来代码后药构建的pom.xml位置等
OK,以上保存应用后,一个任务就建成了,下面来看下效果,这边已经开始构建拉
这里可以看到构建日志,并且能够看到代码构建目录,代码就是拉在这个目录下的
以上如果报错的话可以看下相关的构建环境是不是有问题,一个是jdk是不是装好了,javahome是不是配好了,第二个是git是不是装好了,第三个是maven有没有问题,其他的异常问题一般可以通过百度解决的,好,打包完成了下面我们去这个目录下看看打包出来的jar是不是已经有了。
OK,到这里jenkins拉取代码打包已经完成了,然后我们想达到的想过是构建完成后,把jar包打包到docker容器中,并自动启动,那么怎么做呢,肯定是jenkins打包之后再执行一些脚本,那么我们开始我们的docker篇吧。
// 使用官方的安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
// 也可以使用国内 daocloud 一键安装命令
curl -sSL https://get.daocloud.io/docker | sh
这里稍微提一下Docker的两个命令,容易被混淆的东西。
docker images :这个是查询本机所有的docker映像,什么是映像呢?你可以把它理解成一个系统克隆的备份,也就是一个系统,这个系统里面可能预装了一些东西。
docker ps:这个时查询当前运行着的容器,加-a可以查所有可以运行的容器,容器是个什么概念,就相当于一台电脑,他里面运行着一个系统,这个系统来自于docker images中的某个映像
OK,解释了上面两个概念之后,到这里我们应该知道下一步要干什么了吧?没错就是下载一个映像,因为想要再一台电脑中运行程序,必然要先给这台电脑安装一个系统吧!
// 这里下载centos7作为我们的基础映像
docker pull centos:centos7
下载完成后可以执行命令就可以看到如下映像了
解下来我们就可以把我们的springboot项目运行在这个映像里了吗?并不是,我们都知道java项目的要运行在一个系统中,首先这个系统需要安装了jdk环境才可以执行java命令来运行项目,那么我们下载的这个centos7中肯定是没有安装过jdk的,所以我么要自己动手来装一下,其实docker仓库是有很多已经按照好了的jdk或者其他中间件的映像的,但是还是带大家来一起自己手动装一下,这样以后要自己装也容易一些。
// 我们新建一个Dockerfile文件
vim Dockerfile
// 输入文件内容
FROM centos:centos7
RUN yum install -y java-1.8.0-openjdk*
// 大家了解一些docker的语法应该就能读懂了,以上内容的意思就是,以centos:centos7映像作为基础,RUN就是执行命令,这里就是安装jdk。
// 以上文件保存后,执行构建命令,创建新的带有jdk的映像,切记文件名不要错了哦,否则不能用的
docker build -t webos:v1 .
// 以上命令一定要在Dockerfile跟目录执行哦,webos:v1就是我新生成的映像的名字和tag
这样一个具备java环境的映像就创建好了
下一步就是基于这个映像创建一个容器,也就是把这个映像安装到一个容器中让他跑起来。
// 将映像放到一个容器中启动,webos就是我给这个容器起的名字,webos:v1这个就是容器所基于的映像和版本
docker run -itd --name webos webos:v1
// 上面这个命令是类似于安装系统的意思,并不能重复执行,就好像你不会一直通过安装系统来启动电脑一样
// 启动这台电脑的系统可以通过如下命令
docker start webos
// 停止可以通过如下
docker stop webos
OK,到这里我们就成功的启动了一个容器,我们可以通过 docker attach webos命令来进入这个容器的系统中,验证我们的java有没有安装成功,下图提示我们已经安装成功了。
到这里我们的docker环境已经准备就绪了,下面就是把我们的程序也像安装jdk一样安装到映像中然后来运行,当然也可以通过其他方式比如宿主机和容器共享一个目录,可以把jar放到这个目录中让容器来使用,但是这样的话就不利于版本的管控,所以我们一般还是通过映像的方式来管控应用。
// 以下是就是将eureka这个项目程序打包到系统中并且运行起来的dockerfile
FROM webos:v1
VOLUME /tmp
ADD /target/eureka-server-0.0.1-SNAPSHOT.jar /workspace/eureka-server-0.0.1-SNAPSHOT.jar
EXPOSE 8071
ENTRYPOINT ["java","-jar","/workspace/eureka-server-0.0.1-SNAPSHOT.jar","&"]
// 执行脚本打映像
docker build -t eureka-webos:v1 .
// 安装映像到容器中并运行,这里跟上面的有一点区别注意看,这里就是把当前宿主机的8071端口和容器的8071端口映射到一起了,并宿主机和容器的目录做了以下映射
docker run -p 8071:8071 -d -v /tmp:/tmp --name eureka-webos eureka-webos:v1
以上文件内容,详细的就不解释了哈大家自己去学习docker的相关语法,总之这里就是把jenkins构建好的jar打到映像中,并且启动项目项目,容器对外暴露8071端口,于宿主机共享目录/tmp。
这样项目就启动起来了,我们用宿主机的ip+8071访问浏览器看下效果
OK,到这里我们只是手动的在docker中把jenkins构建出来的项目给启动起来了,并没有达到我们的纯自动化的目的,其实很简单到这里大家应该可以想到,无非就是把上面执行的脚本拿到jenkins构建之后去执行一下,没错,说动手就动手。
这里脚本的意思就是到指定目录,然后获取一个版本id,因为每次生成的映像版本不一样,构建映像,然后停掉之前的名字叫做eureka-webos的容器,并且删除这个容器,然后新建一个同名的容器基于新的映像,为什么这么做是因为,相同的容器名称不能重复存在。
另外我为什么要cd到这个目录呢?因为这个就是我前面配置jenkins自动拉取代码的位置,那么为什么是这个目录呢?大家看下面这张图,这个目录下也就是我的项目目录中有一个Dockerfile文件,还记不记得上面我说过,执行docker builder -t 这个命令去构建映像的时候一定要在Dockerfile的跟目录!
那么这个Dockerfile中的内容是什么呢?跟前面第四步那个Dockerfile是一样的,就是使用webos:v1这个映像,共享目录/tmp,将jar包放到新映像的某个目录,执行脚本,对外提供8071端口。
OK我们执行看一把。
发现这里报错了,因为之前没有加sudo提示没有权限执行docker,后来加了又提示这个,这是因为jenkins用户没有执行docker命令的权限,我们加一下权限就好了,如下代码,加上权限后重启jenkins。
sudo gpasswd -a jenkins docker
sudo service jenkins restart
再来!!!
日志提示完美执行成功,去服务器上看看!
如图,映像已经打成功了,容器也已经运行了最新的映像,并且旧的容器也被删掉了,此时在看浏览器也是可以正常访问。
至此Jenkins+Docker,微服务自动化有了一个里程碑试的成果,这次只是实验了一个docker容器其中跑了一个应用节点,后续会继续部署整套的微服务自动化平台。