Jenkins 流水线多种使用场景详解(Jenkinsfile,多环境部署,多分支部署)

这篇具有很好参考价值的文章主要介绍了Jenkins 流水线多种使用场景详解(Jenkinsfile,多环境部署,多分支部署)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Jenkins是目前大多数中小公司使用的CI、CD工具,其中Jenkins的任务又分普通任务和流水线任务,普通任务的构建和部署在我之前的一篇文章中写过使用教程# 基于 Docker 安装 Jenkins,并配置使用 Jenkins 打包 Node 前后端服务部署到远程服务器,但其中流水线任务可实现我们更复杂的需求也更自由,不过上手难度也稍微高点。

一、安装Jenkins

推荐使用 Docker 来安装Jenkins,更方便后期的迁移部署等,具体安装步骤可参考

# 基于 Docker 安装 Jenkins,并配置使用 Jenkins 打包 Node 前后端服务部署到远程服务器

二、普通流水线

这里我将演示使用流水线来部署一个前端项目,其他项目也同样是这几个步骤

Jenkins 流水线多种使用场景详解(Jenkinsfile,多环境部署,多分支部署)

首先创建一个流水线任务

Jenkins 流水线多种使用场景详解(Jenkinsfile,多环境部署,多分支部署)
在流水线配置这有两种方式,第一种是直接把流水线脚本写在配置文本框这,第二种是把脚本写在项目根目录下,用Jenkinsfile文件来写入,图下面可以看到有个流水线语法的按钮,是可以把具体操作用可视化的方式生成脚本。

我们在文本框这写入以下脚本内容:

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                nodejs('node16') {
                    sh '''
                        if hash pnpm 2>/dev/null; 
                        then
                            echo "pnpm"
                        else
                            npm i pnpm -g --registry https://registry.npmmirror.com/
                        fi

                        pnpm i
                        pnpm run build
                    '''
                }
                echo '构建完成'
            }
        }
        stage('Zip') {
            steps {
                sh '''
                    tar -zcvf ${JOB_BASE_NAME}.tgz ./dist/*
                    rm -rf ./dist/*
                    mv ${JOB_BASE_NAME}.tgz ./dist
                '''
                echo '打包完成'
            }
        }
        stage('Deploy') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'tencent', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo \'部署完成\'', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'dist', sourceFiles: 'dist/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
    }
}

Stages: 这个字段下分了几个单独的stage,会从上至下依次执行stage,如果是刚才说的第一种方式,应该还会比上面多个拉取代码的阶段。具体拉取代码的语法可以用上面的流水线语法页面可视化生成。

stage('Build'): 代码构建阶段,这里因为是前端项目,用到了node来构建,需要安装NodeJS插件,然后去全局工具配置里安装一下具体的node版本及设置下别名。

stage('Zip'): 压缩阶段,因为我们前端代码部署只需要部署dist目录,把这个目录tgz压缩一下发到目标服务器。

stage('Deploy'): 部署阶段,需要安装一个Publish Over SSH插件,然后通过上面的流水线语法去可视化配置部署到服务器的配置,最后把生成的脚本粘贴到这就行。

到这我们构建及部署代码到服务器的基本配置就完成了,大部分项目其实发版流程就是这几步,下面还有几种流水线进阶用法。

三、多环境部署流水线

有时候我们会遇到多环境部署的情况,如开发坏境,生产环境等,大概就是我们通过在流水线添加一个部署坏境的参数来控制,在每次构建前选择一下部署的坏境,具体脚本如下:

pipeline {
    agent any

    parameters {
        choice(
            description: '你需要哪个机器进行部署?',
            name: 'deploy_hostname',
            choices: ['tencent', 'dev01', 'tencent、dev01']
        )
    }

    stages {
        stage('Build') {
            steps {
                nodejs('node16') {
                    sh '''
                        if hash pnpm 2>/dev/null; 
                        then
                            echo "pnpm"
                        else
                            npm i pnpm -g --registry https://registry.npmmirror.com/
                        fi

                        pnpm i
                        pnpm run build
                    '''
                }
                echo '构建完成'
            }
        }
        stage('Zip') {
            steps {
                sh '''
                    tar -zcvf ${JOB_BASE_NAME}.tgz ./dist/*
                    rm -rf ./dist/*
                    mv ${JOB_BASE_NAME}.tgz ./dist
                '''
            }
        }
        stage('Deploy to tencent'){
            when {
                expression { deploy_hostname == 'tencent' }
            }
            steps{
                sshPublisher(publishers: [sshPublisherDesc(configName: 'tencent', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo \'部署完成\'', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'dist', sourceFiles: 'dist/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
        stage('Deploy to dev01'){
            when {
                expression { deploy_hostname == 'dev01' }
            }
            steps{
                sshPublisher(publishers: [sshPublisherDesc(configName: 'dev01', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo \'部署完成\'', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'dist', sourceFiles: 'dist/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
        stage('Deploy to tencent、dev01'){
            when {
                expression { deploy_hostname == 'tencent、dev01' }
            }
            steps{
                sshPublisher(publishers: [sshPublisherDesc(configName: 'tencent', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo \'部署完成\'', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'dist', sourceFiles: 'dist/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                sshPublisher(publishers: [sshPublisherDesc(configName: 'dev01', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo \'部署完成\'', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'dist', sourceFiles: 'dist/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
    }
}

可以看到除了我们之前配置的agentstages还多了一个parameters的参数配置,添加了一个deploy_hostname的选择参数,有三个值'tencent', 'dev01', 'tencent、dev01'

在具体的stage里面也多了when的配置,就是根据我们选择的部署环境参数来执行相应坏境的部署流程,当when里面的条件不满足时,流水线会跳过里面的steps

四、多分支流水线

还有种情况是项目多分支的情况下,每个分支可能对应的部署坏境,或者执行条件不一样,就会用到Jenkins的多分支流水线

Jenkins 流水线多种使用场景详解(Jenkinsfile,多环境部署,多分支部署)

在新建Jenkins任务时选择多分支流水线

Jenkins 流水线多种使用场景详解(Jenkinsfile,多环境部署,多分支部署)

在分支源里配置对应的git项目地址认证凭据,保存后他会自动扫描项目里面的分支,我们需要在每个分支下创建一个Jenkinsfile文件,把我们的脚本写在这个文件里

Jenkins 流水线多种使用场景详解(Jenkinsfile,多环境部署,多分支部署)

具体的构建部署脚本可参考之前的普通流水线,如果需要WebHook自动触发的可参考下面脚本

pipeline {
    agent any

    triggers {
        GenericTrigger (
            causeString: 'Triggered', 
            genericVariables: [[key: 'ref', value: '$.ref']], 
            printContributedVariables: true, 
            printPostContent: true, 
            token: 'test01'
        )
    }

    stages {
        stage('Build') {
            steps {
                nodejs('node16') {
                    sh '''
                        if hash pnpm 2>/dev/null; 
                        then
                            echo "pnpm"
                        else
                            npm i pnpm -g --registry https://registry.npmmirror.com/
                        fi

                        pnpm i
                        pnpm run build
                    '''
                }
                echo '构建完成'
            }
        }
        stage('Zip') {
            steps {
                sh '''
                    tar -zcvf ${JOB_BASE_NAME}.tgz ./dist/*
                    rm -rf ./dist/*
                    mv ${JOB_BASE_NAME}.tgz ./dist
                '''
            }
        }
        stage('Deploy to tencent'){
            when {
                branch 'master'
            }
            steps{
                sshPublisher(publishers: [sshPublisherDesc(configName: 'tencent', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo \'部署完成\'', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'dist', sourceFiles: 'dist/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
        stage('Deploy to dev01'){
            when {
                branch 'dev'
            }
            steps{
                sshPublisher(publishers: [sshPublisherDesc(configName: 'dev01', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo \'部署完成\'', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'dist', sourceFiles: 'dist/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
    }
}

可以看到上面添加了一个triggers配置,这个需要安装Generic Webhook Trigger插件,然后按上面那样配置,其中的token配置可以随意改动,就是我们最终触发hooks的url最后面的参数。

配置完成后,就可以通知http://JENKINS_URL/generic-webhook-trigger/invoke?token=test01来触发我们的hook,一般我们需要在gitlab的Webhooks进行配置触发hooks

Jenkins 流水线多种使用场景详解(Jenkinsfile,多环境部署,多分支部署)

到此Jenkins多种流水线的配置介绍就完成了,具体细节有不了解的小伙伴可在下面评论区留言。关于流水线语法每个配置的详解可参考# Jenkinsfile声明式语法详解文章来源地址https://www.toymoban.com/news/detail-470455.html

到了这里,关于Jenkins 流水线多种使用场景详解(Jenkinsfile,多环境部署,多分支部署)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Jenkins】Jenkins构建前端流水线

    1、服务器中已安装好nginx,如没有安装,可参考此博客:【Shell脚本】Linux安装Nginx以及开机自启 2、如果已有试图,则直接新建任务;如没有视图,则新建一个视图即可。 一个项目一个视图就可以 描述:XXX前端-前端XXX服务测试环境-项目构建 创建人:创建者姓名 时间:创建

    2024年02月16日
    浏览(78)
  • jenkins流水线

    1、 二、 三、 四、 五、 六、  

    2024年02月05日
    浏览(46)
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用

    本节内容我们主要介绍在Jenkins流水线中,其构建过程中的一些构建策略的配置,例如通过远程http构建、定时任务构建、轮询SCM构建、参数化构建、Git hook钩子触发构建等,可根据不同的需求完成不同构建策略的配置。 - 构建策略说明: - 测试验证 - 构建说明 - 测试验证 - 配置

    2024年02月21日
    浏览(80)
  • Jenkins流水线怎么做?

    问CHAT:Jenkins流水线怎么做? CHAT回复:Jenkins流水线是一种创建、测试和部署应用程序的方法。以下是为Jenkins创建流水线的步骤: 1. 安装Jenkins:首先你需要在你的服务器上安装Jenkins。这个过程可能会根据你的操作系统有所不同。 2. 安装必要的插件:为了使流水线工作,你需

    2024年01月24日
    浏览(42)
  • 【Jenkins】pipeline流水线

    流水线既能作为任务的本身,也能作为jenkinsfile,使用流水线可以让我们的任务从ui手动操作,转换为代码化,像docker的dockerfile一样,从shell命令到配置文件,更适合大型项目,可以让团队其他开发者同事参与进来,同时也可以编辑开发jenkinswebui不能完成的复杂的构建逻辑,作

    2024年02月09日
    浏览(56)
  • Jenkins-流水线-保姆级教程

    目录 一、Jenkins 是什么? 二、安装方式 2.1 下载并运行 Jenkins  三、什么是流水线 3.1概述 3.2声明式流水线 3.3脚本化流水线 四、声明式流水线 4.1 Sections代码区域块 4.1.1Agent指令 4.1.2agent 的配置示例 4.1.3Post代码块 4.1.4.sepes代码块 五、Jenkinsfile的使用 5.1环境变量 5.1.1静态变量

    2024年02月01日
    浏览(38)
  • Jenkins 流水线多阶段构建

    Jenkins流水线配置遇到 无法识别的。需要使用 自定义环境 项。 比如官网的在流水线中使用Docker Started by remote host 172.17.0.1 Obtained Jenkinsfile from git http://10.99.20.51:8082/root/java-devops-demo.git org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: WorkflowScript: 28: Invalid agent type “

    2024年04月22日
    浏览(28)
  • 【Jenkins】Jenkins构建后端流水线

    xxxx后端-后端cim服务测试环境-项目构建 创建人:创建者姓名 时间:创建时间 保持构建天数:2 保持最大构建个数:3 ①clean:清楚之前;package:打包 -Dmaven.test.skip=true:跳过测试;-U:强制让Maven检查所有SNAPSHOT依赖更新 这里的pom.xml文件注意: Branches to build:分支某个环境的

    2024年02月12日
    浏览(45)
  • Jenkins部署Docker与Jenkins流水线

    接上篇 1. 外挂文件的方式在docker容器中启动 2. 将构建运行放入docker容器中(不构建镜像) 修改Jenkins构建前设置 修改部署后操作 重新构建,已经成功构建在容器中 3. 将构建运行放入docker镜像中(采用dockerfile) 1.编写dockerfile,放入项目中, 注意不能和依赖的包同级 写好可

    2024年01月22日
    浏览(43)
  • jenkins流水线实现xjar加固

    xjar的定义 功能特性 xjar使用 修改项目中的pom.xml,一般都是开发改 jenkins流水线配置 查看jenkins工作目录 远端服务器配置–☞需要授权的服务器 获取授权服务器信息 执行脚本 脚本内容, 1.判断镜像是否存在 2.把xjar.go解压,需要有go环境 3.制作镜像,然后把镜像制作成tar包

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包