侧边栏壁纸
  • 累计撰写 208 篇文章
  • 累计创建 16 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

基于 Jenkins、Gitlab的持续化集成

Wake
2022-08-29 / 0 评论 / 0 点赞 / 460 阅读 / 2,085 字

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=M2HOME/bin:{M2_HOME}/bin:PATH d-3 使修改的配置立刻生效 source /etc/profile e.检查是否安装成功 mvn -v
image-1661773883540

c.在jenkins中添加mav这里只先做server 的CI ,后面的部分后面有时间会继续完善;en 的路径,使jenkins在编译代码可以使用mvn命令:
image-1661773934035
4.现在项目准备好了,接下来我们可以开始 Jenkins 的配置
image-1661773951871
然后在这里需要勾选触发远程构建的触发器,其中令牌我们可以随便写一个字符串,然后记住下面的 URL,将 JENKINS_URL 替换成 Jenkins 的地址,我们这里的地址就是:http://xxx.xxx.com/job/polling-app-server/build?token=server321
image-1661773969692
然后在下面的流水线区域我们可以选择Pipeline script然后在下面测试流水线脚本,我们这里选择Pipeline script from SCM,意思就是从代码仓库中通过Jenkinsfile文件获取Pipeline script脚本定义,然后选择 SCM 来源为Git,在出现的列表中配置上仓库地址http://xxxxx.xxxx.com/course/polling-app-server.git,由于我们是传统的方式去进行构建,所以如果使用 SSH 的方式去访问 Gitlab 代码仓库的话就需要频繁的去更新 SSH-KEY,所以我们这里采用直接使用用户名和密码的形式来方式:
image-1661773988541
在Credentials区域点击添加按钮添加我们访问 Github 的用户名和密码:
image-1661774003998
然后需要我们配置用于构建的分支,如果所有的分支我们都想要进行构建的话,只需要将Branch Specifier区域留空即可,一般情况下不同的环境对应的分支才需要构建,比如 master、develop、test 等,平时开发的 feature 或者 bugfix 的分支没必要频繁构建,我们这里就只配置 master 和 develop 两个分支用户构建:
image-1661774023294
然后前往 Github 中配置项目polling-app-server Webhook,settings -> Integrations,填写上面得到的 trigger 地址:
image-1661774038297

保存后,可以直接点击Test -> Push Event测试是否可以正常访问 Webhook 地址,这里需要注意的是我们需要配置下 Jenkins 的安全配置,否则这里的触发器没权限访问 Jenkins,系统管理 -> 全局安全配置:取消防止跨站点请求伪造,勾选上匿名用户具有可读权限:
image-1661774055374
关闭跨站请求伪造防护,让github或者gitlab的webhook可以推送到jenkins
a.开启匿名用户具有可读权限
image-1661774078218
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}'
                    }
              }
        }      
    }
}
 }

image-1661774126308

0

评论区