基于上面三篇文章的环境准备,正式 进入实践篇
DevOps部署篇-Jenkins的安装及配置webhook自动化构建
准备工作
软件准备
备用软件下载地址:
链接:
https://pan.baidu.com/s/18_jXfd3e0vDTuf7hHbpcEg
密码:rknv
下载我们本文相关的tomcat的镜像及备用测试项目
编译tomcat镜像并上传Harbor
从我们下载地址下载到Dockerfile,和Tomcat的二进制文件 ;然后可以根据自己的情况修改,然后上传到Harbor容器中。内容比较简单就不多说了
FROM centos:7
MAINTAINER zhujohnle
ENV VERSION=8.5.43
RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \
yum clean all && \
rm -rf /var/cache/yum/*
COPY apache-tomcat-${VERSION}.tar.gz /
RUN tar zxf apache-tomcat-${VERSION}.tar.gz && \
mv apache-tomcat-${VERSION} /usr/local/tomcat && \
rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \
mkdir /usr/local/tomcat/webapps/test && \
echo "ok" > /usr/local/tomcat/webapps/test/status.html && \
sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV PATH $PATH:/usr/local/tomcat/bin
WORKDIR /usr/local/tomcat
EXPOSE 8080
CMD ["catalina.sh", "run"]
特别注意下面这段,研究发现tomcat启动慢是由于catalinah.sh 中有那么一段通过随机数来做处理,把这段替换掉来提升tomcat的启动速度
sed -i ‘1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"’ /usr/local/tomcat/bin/catalina.sh && \
执行编译并上传我们自己的Harbor环境
docker build .
docker pull 192.168.8.250/library/tomcat:v1
上传的过程中会因为我们本地未配置https,导致上传无法被信任因此需要对我们的Harbor仓库的地址加入可信任,在上传镜像的机器上
添加Harbor服务地址为可信任
由于habor未配置https,还需要在docker配置可信任。
# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
"insecure-registries": ["192.168.8.250"]
}
# systemctl restart docker
然后继续上传操作,上传Harbor成功以后我们在library中就可以看到tomcat的镜像
上传测试项目到gitlab
这里可以把我们已经下载好的tomcat-java-demo-master.zip
解压后上传到我们的gitlab中。这里需要用到mysql,后面我们在讲怎么在编译完成发布镜像后,进行部署的问题。
jenkins脚本及执行
先给大家看一下运行成功的一个样子,我们在jenkins上创建一个PipeLine的项目后,编译完成后如果没有问题,会显示我们流水线每一个步骤耗时和是否成功或者错误日志等。
言归正传,我们开始正式的jenkins的配置这个是重头戏。
新建任务
这里如果Jenkins安装插件是安装所有默认插件的话,Pipeline插件和git插件都已经安装,新建任务的时候就能看到流水线任务的选项,否则需要自己在插件管理中安装对应的插件。这里我们起名叫 ci_java_demo
参数化构建
我们可以在项目配置中添加参数化过程,定义一个Branch的参数,用作后续我们项目的git分支使用默认名称为master,这个我们在后续点击构建的时候可以动态的调整
配置流水线命令
我们把如下的命令粘贴到脚本里,这里看到配置的语法使用的Groovy语言
register
变量,用作harbor仓库地址
project
变量,对应的是harbor的工程名称
app_name
变量,对应的就是工程打包后容器的名称
image_name
变量,这里就是对应的harbor全路径,其中BUILD_NUMBER
是jenkins当前项目的编译次数;Branch
为上面我们自己定义的变量名称
docker_registry_auth
jenkins配置的Harbor的账号密码全局凭据id
git_auth
jenkins配置的gitlab的账号密码全局凭据id
def registry = "192.168.8.250"
def project = "dev"
def app_name = "ci_java_demo"
def image_name = "${registry}/${project}/${app_name}:${Branch}-${BUILD_NUMBER}"
def git_address = "http://192.168.8.250:8090/chuangqi/tomcat-java-demo-master.git"
def docker_registry_auth = "c284ac92-e9d3-4b7f-bfb5-db7c069790c1"
def git_auth = "14e0c33f-dcba-4ca0-8780-187606e7d62a"
pipeline {
agent any
stages {
stage('拉取代码'){
steps {
checkout([$class: 'GitSCM', branches: [[name: '${Branch}']], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
}
}
stage('代码编译'){
steps {
sh """
JAVA_HOME=/usr/local/jdk
PATH=$JAVA_HOME/bin:/usr/local/maven/bin:$PATH
mvn clean package -Dmaven.test.skip=true
"""
}
}
stage('构建镜像'){
steps {
withCredentials([usernamePassword(credentialsId: "${docker_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
sh """
echo '
FROM ${registry}/library/tomcat:v1
LABEL maitainer lizhenliang
RUN rm -rf /usr/local/tomcat/webapps/*
ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
' > Dockerfile
docker build -t ${image_name} .
docker login -u ${username} -p '${password}' ${registry}
docker push ${image_name}
"""
}
}
}
stage('部署到Docker'){
steps {
sh """
REPOSITORY=${image_name}
docker rm -f tomcat-java-demo |true
docker container run -d --name tomcat-java-demo --restart=always -p 88:8080 ${image_name}
"""
}
}
}
}
- 我们可以看到流水线脚本语言stage代表一个步骤
- sh “”" “”" 部分就是可以执行的sh语法,中间我们可以写任意的命令即可,但是需要jenkiens容器支持,如pwd ,ls等默认都支持的
当然我们也可以通过自动生成的形式来得到流水线脚本 方式如下图,也就是根据我们配置的属性及参数进行生成。可以先用这种尝试。
检查后编译build
当我们检查流程没问题以后,返回目录开始build,就可以进入正式的执行状态,执行结果成功或者失败,如果一次成功恭喜你就看到了我们刚开始的那个全绿色状态,但是如果是刚开始弄这块的话多少会有些问题,不过不用担心,我们可以根据提示的log针对性的去解决。
成功和失败的样式,并根据logs详情去逐步解决
安装包的项目默认会安装到本jenkins服务器上,并生产新的容器映射端口88,如果浏览器访问没问题的话就说明到这一步就算流程成功了
但是我们这里因为项目默认服务器配置是localhost:3306 ,但是我们这个跑起来的容器里并没有集成mysql镜像,因此我们需要在jenkins的宿主机重新安装mysql,并且修改数据库配置为当前主机ip 192.168.8.251:3306 并提交代码重新执行编译流水线。
为宿主机器安装mysql
这里为了方便就简单安装一下mariadb
yum install mariadb-server -y
systemctl start mariadb
mysqladmin -u root password ’123456!@#’
修改root用户为外部可以访问
- 通过授权的形式修改root用户可以从外部访问所有数据表
mysql -uroot -p
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
mysql>flush privileges;
- 添加ip端口的过滤
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
service iptables restart
基本上到这里在访问我们测试的demo地址就可以正常跑整个项目了,我们今天的ci的这套流程也就到这里结束了
总结
在做cicd这些流程的时候,一定要对每个细节把控清楚,这样出问题的时候才会很方便的找到问题原因及把控解决问题的方案。有这样的基本流程以后我们在上面做扩展就方便多了