Jenkins流水线执行失败

Jenkins流水线执行失败

一、背景

本人用JenKins+ansible搭建了一个流水线发包流程,结果发现一直卡在pipeline中的某一步发布不成功。

二、问题排查

1、打开JenKins控制台查看日志
在这里插入图片描述
发现一直卡在了 "TASK [Gathering Facts] ***********************"这一步

2、查找资料得知这是ansible用setup模块默认自动执行的一个task,作用是获取目标机(客户端)上的基本信息,如:操作系统、ipv4等。

3、首先考虑了是不是ansible连接出问题。查看了ansible中的hosts(自己新定义的),发现用户、密码、IP地址、用户组都没有问题,又看了playbook 格式、配置也都没有问题。

4、然后用ssh登录目标机、ping目标机地址都能成功,说明是可以连通的。那就只能是"Gathering Facts"这个TASK在目标机上 一直没有执行成功。

5、在ansible机子上使用ansible -i XXX XXX -m setup -a 'filter=ansible_all_ipv4_addresses’命令,一直卡住不动。登录到目标机上使用ps -ef |grep ansible查询进程,发现有AnsiballZ_setup.py的进程。

三、原因分析

根据问题排查发现是ansible中的"Gathering Facts"这task一直在获取目标机上的信息,目标机因为文件挂载系统出错的原因一直没有返回内容。

四、修改bug

在playbook中添加一个配置gather_facts: false 关闭"Gathering Facts"这个任务就能正常执行了。

PS:因为我只是Jenkins流水线用ansible重启服务,用不到目标机上的信息,所以没有找目标机上的具体原因直接关掉了那个任务。可以用strace -p 命令追踪AnsiballZ_setup.py这个进程的具体报错原因,并进行更改。
### Jenkins Pipeline 的常用结构及语法 Jenkins Pipeline 是一种用于定义持续集成/持续交付 (CI/CD) 流程的方式,其核心在于通过 `Jenkinsfile` 文件描述整个流程。以下是 Jenkins Pipeline 的常见结构及其语法示例。 #### 1. **Pipeline 结构** Pipeline 可分为两种主要形式:**声明式 (Declarative)** 和 **脚本式 (Scripted)**。 ##### 声明式 Pipeline 声明式 Pipeline 提供了一种更直观的方式来定义 CI/CD 流水线,适合初学者使用。它具有固定的结构和语法规则[^3]。 ```groovy pipeline { agent any // 定义执行环境,默认为任意可用节点 stages { // 定义多个阶段 stage('Build') { // 构建阶段 steps { // 步骤列表 echo 'Building the project...' } } stage('Test') { // 测试阶段 steps { echo 'Testing the project...' } } stage('Deploy') { // 部署阶段 steps { echo 'Deploying the application...' } } } } ``` ##### 脚本式 Pipeline 脚本式 Pipeline 使用 Groovy 编写,提供了更大的灵活性,适用于复杂场景下的自定义逻辑。 ```groovy node { stage('Build') { echo 'Building the project...' } stage('Test') { echo 'Testing the project...' } stage('Deploy') { echo 'Deploying the application...' } } ``` --- #### 2. **Agent 定义** `agent` 关键字指定流水线或某个特定阶段的执行位置。可以设置为单个节点 (`any`) 或者分布式节点组。 - 执行在任何可用节点上: ```groovy agent any ``` - 指定具体标签的节点: ```groovy agent { label 'linux' } ``` - 不同阶段分配到不同节点: ```groovy pipeline { stages { stage('Example Build') { agent { label 'docker' } steps { echo 'Building on Docker node' } } stage('Example Test') { agent { label 'windows' } steps { echo 'Testing on Windows node' } } } } ``` --- #### 3. **Stages 和 Steps** `stages` 表示流水线的不同阶段,而每个阶段由一系列 `steps` 组成。这些步骤通常是一些命令或操作。 - 多阶段示例: ```groovy pipeline { agent any stages { stage('Checkout') { steps { git url: 'https://github.com/example/repo.git', branch: 'main' } } stage('Compile') { steps { sh './gradlew build' } } stage('Package') { steps { archiveArtifacts artifacts: '**/*.jar', fingerprint: true } } } } ``` --- #### 4. **Post Actions** `post` 块允许在流水线结束时执行某些动作,无论成功还是失败都可以处理相应的情况。 ```groovy pipeline { agent any stages { stage('Example') { steps { echo 'Hello, World!' } } } post { success { echo 'The job succeeded!' } failure { echo 'The job failed!' } always { echo 'This will run no matter what.' } } } ``` --- #### 5. **Parameters** 可以通过参数化构建功能让用户输入动态变量[^4]。 ```groovy pipeline { agent any parameters { string(name: 'BRANCH_NAME', defaultValue: 'master', description: 'Which branch to checkout?') } stages { stage('Parameterized Checkout') { steps { echo "Branch Name is ${params.BRANCH_NAME}" git url: 'https://github.com/example/repo.git', branch: "${params.BRANCH_NAME}" } } } } ``` --- #### 6. **Environment Variables** 可以在流水线中定义全局或局部环境变量。 ```groovy pipeline { environment { APP_VERSION = 'v1.0.0' } agent any stages { stage('Print Environment Variable') { steps { echo "Application Version: ${env.APP_VERSION}" } } } } ``` --- #### 7. **Script Blocks** 如果需要嵌入复杂的逻辑,则可使用 `script` 块[^5]。 ```groovy pipeline { agent any stages { stage('Script Example') { steps { echo "Before Script Block" script { def name = 'Alice' def greeting = "Hello ${name}" println(greeting) } echo "After Script Block" } } } } ``` --- ### 总结 上述内容涵盖了 Jenkins Pipeline 中常见的结构与语法实例,包括但不限于声明式与脚本式的区别、多阶段配置、条件判断以及参数化的应用等。每部分均基于实际需求进行了说明,并附有相应的代码片段作为参考[^1][^2][^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栗然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值