1987WEB视界-分享互联网热门产品和行业

您现在的位置是:首页 > WEB开发 > 正文

WEB开发

Jenkins共享库应用

1987web2023-10-06WEB开发179

前言

Jenkins在实际的项目使用中,遇到多个 pipeline流水线有比较多重复代码的情况下,每次新增pipeline job时候都需要重新粘贴这些代码,流水线维护变得非常麻烦,可以通过jenkins的共享库来将这些重复的代码整合封装,然后在多个pipeline中进行调用,让流水线代码易于维护和版本化。

安装jenkins

  • 首先需要准备一个jenkins,这里使用compose方式运行;
$mkdir jenkins &&cdjenkins/$sudo mkdir -p data$sudo chown 1000.1000 -R data$vim docker-compose.yml
version:3.9services:jenkins-master:image:docker.io/jenkins/jenkins:2.377-jdk17container_name:jenkinshostname:jenkinsrestart:alwaysprivileged:truenetwork_mode:hostvolumes:-/etc/localtime:/etc/localtime:ro-./data:/var/jenkins_homeenvironment:-JAVA_OPTS=-Djava.util.logging.config.file=/var/jenkins_home/log.properties-TZ=Asia/Shanghai
  • 启动成功后,安装如下插件;
Pipeline: Groovy Libraries共享库插件ListGit Branches ParameterGit扩展插件

创建共享库

  • 准备一个共享库,推送到Git上,目录结构如下;
.
├── resources存放构建流程需要用到的文件│   └── build
│       └── mvn
│           ├── Dockerfile
│           └── settings.xml
├── src封装一些常用构建方法│   └── org
│       └── devops
│           ├── GlobalVars.groovy
│           └── tools.groovy 
└── vars存放具体执行的pipeline脚本└── pipeline01
  • 定义常用的构建方法;
$ vim tools.groovy

// 导入当前包
package org.devops


// 拉取项目方法
def gitCheckout(URL, credentialsId) {
   steps.checkout(
       [$class:GitSCM, 
           branches: [[name:\$BRANCH]], 
           extensions: [], 
           userRemoteConfigs: [[credentialsId:"${credentialsId}", 
           url:"${URL}"]]
           ]
    )
}


// 获取git提交
defgitMsg() {
    shgit show --stat --format=提交日期:%ci,%n提交人:%cn,%n提交备注:%s,%n提交Hash:%H,%n提交分支:%d,%n%b%n提交修改的文件:}


// 清理workspace
defcleanWS() {
    cleanWs deleteDirs:true, notFailBuild:true}


// 创建文件
def creatFile(filename, content) {
    steps.writeFile encoding:UTF-8, file:"$filename", text:"$content"}


// 获取提交id
defcommitId() {
    String commit = steps.sh(returnStdout:true, script:git rev-parse --short HEAD).trim()returncommit
}


// 构建项目
def build(action, commitid, repourl, tag){
    sh"""
        build
       DOCKER_BUILDKIT=1 docker build --progress=auto \
                 --target=${action}\
                 --build-arg version=${commitid}\
                 -t${repourl}:${tag}.
        push
       docker push${repourl}:${tag}&& docker rmi${repourl}:${tag}"""}


// 推送镜像
def loginRepo(username, password, repourl){
   sh"""
      docker login -u$username-p$password$repourl"""}
$ vim tools.groovy

package org.devops// 全局变量参数定义classGlobalVars{// 项目仓库地址staticStringgiturl =https://example.com/example/test.gitstaticStringcertid =e6655bac-85cc-4a61-9ae3-3eeb02ff2e4c// 镜像仓库staticStringimageRepo =harbor.example.cn/publicstaticStringpushRepo =harbor.example.cn/public/teststaticStringuserRepo =rootstaticStringpassRepo =root1234}
  • 定义pipeline;
$ vim pipeline01// 说明:jenkinslibrary是后面在jenkins中定义的共享库名称// 引用共享库,注意后面的"_"不要漏掉@Library(jenkinslibrary@master) _// 导入构建库def GlobalVars =neworg.devops.GlobalVars()
def tools =neworg.devops.tools()// 引用文件def buildfile = libraryResource"build/mvn/Dockerfile"def mvnconf = libraryResource"build/mvn/settings.xml"// 流水线pipeline {

    agent any// 运行参数定义options {buildDiscarderlogRotator(artifactDaysToKeepStr:, artifactNumToKeepStr:, daysToKeepStr:5, numToKeepStr:5)// 保留历史构建数和记录disableConcurrentBuilds()// 设置job不能够同时运行disableResume()// 如果控制器重启,不允许管道恢复skipDefaultCheckout()// 跳过默认的代码检出timestamps()// 为控制台输出增加时间戳}// 步骤定义stages{
        stage("拉取代码") {
            steps {// 在script中执行script {
                    tools.gitCheckout(GlobalVars.giturl, GlobalVars.certid)
                    tools.gitMsg()
                }
            }
        }
        stage("构建镜像"){
            steps {

                script {// 获取提交iddef commitID = tools.commitId()// 获取构建iddef imagetag = currentBuild.id// 创建文件tools.creatFile("settings.xml", mvnconf)
                    tools.creatFile("Dockerfile", buildfile)// 执行构建tools.loginRepo(GlobalVars.userRepo, GlobalVars.passRepo, GlobalVars.imageRepo)
                    tools.build("release", commitID, GlobalVars.pushRepo, imagetag)

                }
            }
        }
    }
    post {
        always {
            script {// 清理构建文件tools.cleanWS()
            }
        }
    }
}
  • 定义构建文件
$vim DockerfileFROMdocker.io/library/maven:3.8-openjdk-8-slim AS buildENVTZ=Asia/ShanghaiRUNln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
    echo $TZ > /etc/timezoneWORKDIR/buildCOPYsettings.xml /root/.m2/COPY. /buildRUNmvn -Dmaven.test.skip=true packageFROMdocker.io/library/eclipse-temurin:8u332-b09-jre-focal AS releaseENVTZ=Asia/ShanghaiARGversionEXPOSE8080WORKDIR/appCOPY--from=build /build/target/test-0.0.1-SNAPSHOT.jar app.jarENTRYPOINTjava -server \
           ${JAVA_OPTS} \
           -jar /app/app.jar \
           --user.timezone=GMT+08 \
           --java.security.egd=file:/dev/./urandom ${JAVA_CLI}
$ vim settings.xml<settingsxmlns="http://maven.apache.org/SETTINGS/1.2.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd"><mirrors><mirror><id>aliyunid><mirrorOf>*mirrorOf><name>aliyun-publicname><url>https://maven.aliyun.com/repository/publicurl>mirror><mirror><id>aliyun-centerid><mirrorOf>centralmirrorOf><name>aliyun-centralname><url>https://maven.aliyun.com/repository/centralurl>mirror><mirror><id>aliyun-springid><mirrorOf>springmirrorOf><name>aliyun-springname><url>https://maven.aliyun.com/repository/springurl>mirror>mirrors>settings>

添加共享库

  • 在jenkins中添加共享库,找到 "系统设置" -> " Global Pipeline Libraries" ;

配置流水线

  • 创建一个pipeline job,配置Git分支拉取;
  • 配置构建流水线地址;
  • 构建测试job;

end ~

安装完成后,通过命令启动并验证Jenkins的状态

systemctl start jenkinssystemctl status jenkins

上面的输出显示Jenkins已启动并正在运行。

配置防火墙(可选)

阿里云、腾讯云的云主机就不需要配置了,不过需要在安全策略里打开可访问的端口。

玩转jenkins-在自己的服务器上安装jenkins

  • 下一篇持续集成整合使用篇之Jenkins设置

    持续集成整合使用篇之Jenkins设置

    关注腾飞开源,一起共同成长!