尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Jenkins job与Pipeline简单使用

Jenkins job与Pipeline简单使用 目录一. 环境配置1.1 全局工具配置1.2 系统配置1.3 凭据配置二. 任务2.1 新建普通任务2.2 触发器2.2.1 定时构建2.2.2 轮询SCM2.2.3 触发远程构建2.3 Pipeline2.3.1 基本配置2.3.2 声明式Pipeline介绍2.3.3 声明式Pipeline示例一. 环境配置1.1 全局工具配置配置Maven与JDK1.2 系统配置1.3 凭据配置通过下面的命令生成一对密钥# 生成密钥ssh-keygen-ted25519-Cfengyehong123gmai.com# 确认生成的密钥对ls-l/home/apluser/.ssh/将公钥的文本内容添加到Github上Authentication Key认证密钥用于证明你是谁让你可以访问 GitHub。Signing Key签名密钥用于证明提交Commit确实是你创建的。将私钥的文本内容添加到Jenkins的凭据中并设置好凭据对应的ID二. 任务2.1 新建普通任务构建一个自由风格的软件项目可以在Build Steps中进行构建步骤如上图所示直接输出的话文件会被输出到JENKINS_HOME的workspace所对应的job中apluserubuntu22-1:~$ apluserubuntu22-1:~$ls-l~/jenkins_home/workspace/ drwxr-xr-x2apluser apluser4096Jul1814:37 first-job drwxr-xr-x3apluser apluser4096Jul2009:32 second-pipelinetmp drwxr-xr-x3apluser apluser4096Jul2010:26 third-pipeline2tmp drwxr-xr-x3apluser apluser4096Aug813:08 third-pipelinetmp apluserubuntu22-1:~$ apluserubuntu22-1:~$ls-l~/jenkins_home/workspace/first-job/ -rw-r--r--1apluser apluser25Jul1814:37 from-jenkins.txt apluserubuntu22-1:~$2.2 触发器Jenkins对于任务提供了不同种类的触发器2.2.1 定时构建使用corn表达式每隔一段时间触发构建2.2.2 轮询SCMSCM(Source Code Management的缩写)使用corn表达式每隔一段时间从Git仓库检查代码的变化当检测到代码发生变化之后就会自动触发构建任务。是比较常用和重要的触发器之一。2.2.3 触发远程构建通过Github或者GitLab的WebHook来触发构建当代码仓库有新的提交之后主动发送一个Http请求到Jenkins服务器的一个指定的url地址。Jenkins接收到请求之后就会触发对应的构建任务这种方式相比于轮询代码仓库, 更加的实时高效因为不需要等待下一个轮询的时间。从 Jenkins 较新的版本开始仅有Job Token通常并不足以通过认证。一般还需要用户名Username和API Token(不是登录密码)如下图所示发行一个API Token然后就可以通过类似于下面的curl命令来手动触发指定job的构建了不带请求参数的构建curl -X POST --user apluser:1166770f90a573b2f71631794ff6d5b731 http://172.22.125.148:9090/job/third-pipeline/build?tokenJob-Token-123带请求参数的构建curl -X POST --user apluser:1166770f90a573b2f71631794ff6d5b731 http://172.22.125.148:9090/job/third-pipeline/buildWithParameters?tokenJob-Token-123VERSION2.0DEBUGtrue2.3 PipelineJenkins提供的一种用于实现持续集成和持续交付的强大工具, 允许使用代码来定义整个软甲的交付过程。从代码的获取, 构建, 测试 到部署的各个环节都可以通过流水线脚本来实现自动化。流水线脚本通常使用Groovy语言编写这样就可以使用Groovy语言来实现复杂的构建逻辑。Pipeline脚本一共分为2种声明式Pipeline使用更加简洁和结构化的语法适合大多数常见的使用场景。脚本式Pipeline更加灵活适合需要实现复杂逻辑的场景。2.3.1 基本配置设置要拉取的项目的地址如果要通过参数化构建的话勾选参数化构建过程并设置要接收的参数名称使用脚本触发远程构建并设置好job对应的触发Token设置好仓库的地址分支以及构建用脚本的名称一般把构建文件存放到项目仓库中名称一般为JenKinsfile。JenKinsfile用来定义Jenkins流水线的构建, 测试和部署的过程使用Groovy语言编写可以让流水线的配置和代码放在一起这样就可以更好的进行版本控制和协作开发。2.3.2 声明式Pipeline介绍使用pipeline关键字来定义流水线中完成的各个阶段和步骤agent部分用来指定流水线运行的节点any表示可以在任何节点上运行。stages定义了流水线的各个阶段里面可以有多个stage每个stage表示流水线的一个阶段比如构建测试部署等等。每个stage里面又包含了具体的步骤→steps目前新版本的Jenkins更加推荐使用声明式Pipeline。2.3.3 声明式Pipeline示例接收到构建请求后获取url中的请求参数进行处理从Github的指定仓库中拉取代码后进行编译测试打包然后将打包之后得到的app.jar文件复制到目标服务器上运行// 定义全局变量 def config // 定义辅助函数 defloadConfig(){return[version:params.VERSION?.trim(), debug:params.DEBUG]}pipeline{agent any tools{mavenMaven-3.9.5jdkJDK-25}// url传参的参数 parameters{string(name:VERSION)booleanParam(name:DEBUG, defaultValue:false)}environment{MAVEN_OPTS-Xmx1024mAPP_NAMEspringboot3_demoAPP_VERSION0.0.1-SNAPSHOTDEPLOY_USERapluserDEPLOY_HOST172.22.125.148SSH_PORT22DEPLOY_DIR/home/apluser/projectREMOTE_SERVER_JAVA_HOME/home/apluser/JDK/jdk-21.0.2}options{// 保留最近10次的构建 buildDiscarder(logRotator(numToKeepStr:10))// 添加时间戳到控制台输出 timestamps()// 设置超时时间 timeout(time:30, unit:MINUTES)}stages{// 初期化 stage(Init){steps{script{configloadConfig()echoVERSION --${config.version}}}}stage(Checkout){steps{echoChecking out code...git(url:gitgithub.com:fengyehong123/Jenkins-Test.git, branch:main, credentialsId:Jenkins-Test)script{env.GIT_COMMIT_MSGsh(script:git log -1 --pretty%B, returnStdout:true).trim()env.GIT_COMMIT_AUTHORsh(script:git log -1 --pretty%an, returnStdout:true).trim()}echoCommit:${env.GIT_COMMIT_MSG}by${env.GIT_COMMIT_AUTHOR}}}stage(Build){steps{echoBuilding application...shchmodx mvnw ./mvnw clean package-DskipTests}post{success{echoBuild Completed Successfully!archiveArtifacts(artifacts:target/*.jar, fingerprint:true)}failure{echoBuild Failed!}}}stage(Test){steps{echoRunning tests...sh./mvnw test}post{always{junit**/target/surefire-reports/*.xml}success{echoAll tests passed!}failure{echoTests Failed!}}}stage(Deploy){steps{withCredentials([sshUserPrivateKey(credentialsId:Jenkins-Test, keyFileVariable:SSH_KEY)]){shscp-i$SSH_KEY-P${SSH_PORT}target/${APP_NAME}-${APP_VERSION}.jar${DEPLOY_USER}${DEPLOY_HOST}:${DEPLOY_DIR}/app.jarssh-i$SSH_KEY-p${SSH_PORT}${DEPLOY_USER}${DEPLOY_HOST} if [ -f ${DEPLOY_DIR}/app.pid ]; then kill \$(cat ${DEPLOY_DIR}/app.pid) 2/dev/null || true rm -f ${DEPLOY_DIR}/app.pid sleep 1 fi nohup ${REMOTE_SERVER_JAVA_HOME}/bin/java -jar ${DEPLOY_DIR}/app.jar ${DEPLOY_DIR}/app.log 21 echo \$! ${DEPLOY_DIR}/app.pid }}post{success{echoDeploy Successfully!}failure{echoDeploy Failed!}}}}post{always{echoCleaning up workspace...// deleteDir()是 Pipeline 自带的步骤, 会删除当前 Workspace 下的所有文件 deleteDir()}success{echoPipelie completed Successfully!// 发送邮件通知。。。}failure{echoPipeli Failed!}}}
返回列表