1.jenkins的安装,本案例采用宿主机安装的方式。系统:ubuntu 18.04
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install jenkins
2.开始部署持续化构建
本次示例项目是一个完整的基于 Spring Boot、Spring Security、JWT、React 和 Ant Design 构建的一个开源的投票应用,项目地址:https://github.com/callicoder/spring-security-react-ant-design-polls-app
2-2.服务端
首先需要更改的是服务端配置,我们需要将数据库链接的配置更改成环境变量的形式,写死了的话就没办法进行定制了,修改服务端文件src/main/resources/application.properties,将下面的数据库配置部分修改成如下形式:
spring.datasource.url= jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:polling_app}?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
spring.datasource.username= ${DB_USER:root}
spring.datasource.password= ${DB_PASSWORD:root}
由于我们要将项目部署到 Kubernetes 集群中去,所以我们需要将服务端进行容器化,所以我们在项目根目录下面添加一个Dockerfile文件进行镜像构建:
FROM openjdk:8-jdk-alpine
MAINTAINER cnych <icnych@gmail.com>
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
ENV TZ=Asia/Shanghai
RUN mkdir /app
WORKDIR /app
COPY target/polls-0.0.1-SNAPSHOT.jar /app/polls.jar
EXPOSE 8080
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar","/app/polls.jar"]
由于服务端代码是基于Spring Boot构建的,所以我们这里使用一个openjdk的基础镜像,将打包过后的jar包放入镜像之中,然后用过java -jar命令直接启动即可,这里就会存在一个问题了,我们是在 Jenkins 的 Pipeline 中去进行镜像构建的,这个时候项目中并没有打包好的jar包文件,那么我们应该如何获取打包好的jar包文件呢?这里我们可以使用两种方法:
第一种就是如果你用于镜像打包的 Docker 版本大于17.06版本的话,那么我墙裂推荐你使用 Docker 的多阶段构建功能来完成镜像的打包过程,我们只需要将上面的Dockerfile文件稍微更改下即可,将使用maven进行构建的工作放到同一个文件中:
FROM maven:3.6-alpine as BUILD
COPY src /usr/app/src
COPY pom.xml /usr/app
RUN mvn -f /usr/app/pom.xml clean package -Dmaven.test.skip=true
FROM openjdk:8-jdk-alpine
MAINTAINER cnych <icnych@gmail.com>
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
ENV TZ=Asia/Shanghai
RUN mkdir /app
WORKDIR /app
COPY --from=BUILD /usr/app/target/polls-0.0.1-SNAPSHOT.jar /app/polls.jar
EXPOSE 8080
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar","/app/polls.jar"]
第二种方式就是我们传统的方式,在 Jenkins Pipeline 中添加一个maven构建的阶段,然后在第二个 Docker 构建的阶段就可以直接获取到前面的jar包了,也可以很方便的完成镜像的构建工作,为了更加清楚的说明 Jenkins Pipeline 的用法,我们这里还是采用传统的方式,所以 Dockerfile 文件还是使用第一个就行。
3.jenkins 安装java 和maven
1-1.ubuntu 18.04安装java
sudo apt-get update
sudo apt-get install openjdk-8-jdk
java -version
1-2.ubuntu 18.04 安装maven a.下载地址:https://maven.apache.org/download.cgi# Linux系统选择.tar.gz; b.移动到自己指定的位置 sudo mv apache-maven-3.5.3-bin.tar.gz /usr/local/ c.解压 sudo tar -zxvf apache-maven-3.5.3-bin.tar.gz
sudo rm -rf apache-maven-3.5.3-bin.tar.gz
解压之后的文件夹名字为:apache-maven-3.5.3 d.修改全局配置文件 sudo vi /etc/profile d-1 添加如下配置: export M2_HOME=/usr/local/apache-maven-3.5.3 export PATH=PATH d-3 使修改的配置立刻生效 source /etc/profile e.检查是否安装成功 mvn -v
c.在jenkins中添加mav这里只先做server 的CI ,后面的部分后面有时间会继续完善;en 的路径,使jenkins在编译代码可以使用mvn命令:
4.现在项目准备好了,接下来我们可以开始 Jenkins 的配置
然后在这里需要勾选触发远程构建的触发器,其中令牌我们可以随便写一个字符串,然后记住下面的 URL,将 JENKINS_URL 替换成 Jenkins 的地址,我们这里的地址就是:http://xxx.xxx.com/job/polling-app-server/build?token=server321
然后在下面的流水线区域我们可以选择Pipeline script然后在下面测试流水线脚本,我们这里选择Pipeline script from SCM,意思就是从代码仓库中通过Jenkinsfile文件获取Pipeline script脚本定义,然后选择 SCM 来源为Git,在出现的列表中配置上仓库地址http://xxxxx.xxxx.com/course/polling-app-server.git,由于我们是传统的方式去进行构建,所以如果使用 SSH 的方式去访问 Gitlab 代码仓库的话就需要频繁的去更新 SSH-KEY,所以我们这里采用直接使用用户名和密码的形式来方式:
在Credentials区域点击添加按钮添加我们访问 Github 的用户名和密码:
然后需要我们配置用于构建的分支,如果所有的分支我们都想要进行构建的话,只需要将Branch Specifier区域留空即可,一般情况下不同的环境对应的分支才需要构建,比如 master、develop、test 等,平时开发的 feature 或者 bugfix 的分支没必要频繁构建,我们这里就只配置 master 和 develop 两个分支用户构建:
然后前往 Github 中配置项目polling-app-server Webhook,settings -> Integrations,填写上面得到的 trigger 地址:
保存后,可以直接点击Test -> Push Event测试是否可以正常访问 Webhook 地址,这里需要注意的是我们需要配置下 Jenkins 的安全配置,否则这里的触发器没权限访问 Jenkins,系统管理 -> 全局安全配置:取消防止跨站点请求伪造,勾选上匿名用户具有可读权限:
关闭跨站请求伪造防护,让github或者gitlab的webhook可以推送到jenkins
a.开启匿名用户具有可读权限
b.ubuntu 18.04 jenkins 2.2版本后无法关闭跨站请求伪造保护
ubuntu 系统通过apt安装的jenkins 配置文件在/etc/init.d/jenkins 中 需要进去添加关闭的参数,修改后的参数如下:
$SU -l $JENKINS_USER --shell=/bin/bash -c "$DAEMON $DAEMON_ARG -- $JAVA $JAVA_ARGS -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true -jar $JENKINS_WAR $JENKINS_ARGS" || return 2
修改完成,重启jenkins就可以生效了。
如果测试出现了Hook executed successfully: HTTP 201则证明 Webhook 配置成功了,否则就需要检查下 Jenkins 的安全配置是否正确了。
配置成功后我们只需要往 Gitlab 仓库推送代码就会触发 Pipeline 构建了。接下来我们直接在服务端代码仓库根目录下面添加Jenkinsfile文件,用于描述流水线构建流程。
项目中jenkinsfile
pipeline {
agent any
environment {
home_dir='/var/lib/jenkins/.jenkins/workspace/polling-app-server-build'
project_name= 'polling-app-server'
dest_image_name= "${dest_image_url}/${project_name}:${commit_short_id}"
dest_image_url= "xxxxxxxxxm/xxxxxxx"
commit_id_format = """${sh(
returnStdout: true,
script: 'echo ${gitlabAfter} |cut -c1-8'
)}"""
commit_short_id = "${commit_id_format.trim()}"
}
//Execute all the steps defined in this Pipeline within a newly created container of the given name and tag (maven:3-alpine).
stages {
stage('输出环境变量') {
steps {
sh 'env'
}
}
stage('开始编译') {
steps {
sh 'mvn -v'
sh 'cd $home_dir/$project_name && mvn -f pom.xml clean package -Dmaven.test.skip=true'
}
}
stage('构建后台服务') {
steps {
sh 'docker build -t $dest_image_name $home_dir/$project_name'
sh 'docker images'
}
}
stage('推送镜像') {
steps {
script {
withDockerRegistry(credentialsId: 'xxxxxx', url: "https://$dest_image_url") {
sh 'docker push ${dest_image_name}'
}
}
}
}
}
}
评论区