前端项目发布自动化脚本

记录一下如何自己实现 jenkins 的自动化操作

# 背景

博主所在公司是一家小公司,内部项目发布是使用的 jenkins,开发人员手持 jenkins 帐号,需要发布开发环境时自己登录 web 端进行发布。

但是每次发版需要打开公司内的 jenkins 登录账号,手动选择系统、项目、分支、环境信息,就比较繁琐了,来回确认 bug 的时候懒得去打开网站。

所以借助一下脚本进行自动化操作(需安装 puppeteer)。

如果你也有类似的需求,可以参考下这篇文章。

# 使用方法

脚本内容另存为 autopub.js,执行命令 node autopub.js [项目名称] [分支名称] [环境]。 示例: node autopub.js oa-web feature/2022-01 dev

说明

  • 执行成功之后会在命令行看到执行时间从而对应到 jenkins 的任务列表
  • 将参数 headless 改为 false,可观察执行过程

# 参考代码

const puppeteer = require('puppeteer');

var date = new Date(new Date().getTime());
Y = date.getFullYear() + '-';
M =
  (date.getMonth() + 1 < 10
    ? '0' + (date.getMonth() + 1)
    : date.getMonth() + 1) + '-';
D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ';
h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
m =
  (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();

const pubTime = Y + M + D + h + m + s;

(async () => {
  let account = '登录帐号',
    password = '登录密码';
  let options = process.argv,
    projectName = options[2] || '默认项目名',
    branchName = options[3] || '默认分支',
    envName = options[4] || 'dev';
  console.log('项目:' + projectName, '分支:' + branchName, '环境:' + envName);
  const browser = await puppeteer.launch({
    headless: true,
    args: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-blink-features=AutomationControlled',
    ],
    dumpio: false,
  });
  const page = await browser.newPage();

  await page.goto('http://192.168.121.71:8080/login', {
    waitUntil: 'networkidle0',
  });

  await page.type('input[name="j_username"]', account);
  await page.type('input[name="j_password"]', password);

  console.log('登录 jenkins...');
  await page.click('.submit .submit-button');

  await page.waitForTimeout(200);

  console.log('跳转发布参数页');

  await page.goto(
    'http://192.168.121.71:8080/job/%E5%8F%91%E5%B8%83%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83/build?delay=0sec',
    {
      waitUntil: 'networkidle0',
    }
  );

  // 选择需要发布的系统
  await page.$('div[description="选择需要发布的系统"]');
  await page.click(
    'div[description="选择需要发布的系统"] select[name="value"]'
  );
  // await page.waitForTimeout(500);
  console.log('选择新平台');
  await page.select(
    'div[description="选择需要发布的系统"] select[name="value"]',
    '新平台'
  );

  //   await page.waitForTimeout(500);
  // 选择发布的服务的类型
  await page.click(
    'div[description="选择发布的服务的类型"] select[name="value"]'
  );
  await page.select(
    'div[description="选择发布的服务的类型"] select[name="value"]',
    'web'
  );

  // 选择发布的服务的类型
  await page.click('div[description="选择发布的服务"] select[name="value"]');
  await page.select(
    'div[description="选择发布的服务"] select[name="value"]',
    projectName
  );

  // 选择发布的版本(分支-分支id)
  await page.click(
    'div[description="选择发布的版本(分支-分支id)"] select[name="value"]'
  );

  const branches = await page.evaluate(() => {
    const elements = Array.from(
      document.querySelectorAll(
        'div[description="选择发布的版本(分支-分支id)"] select[name="value"] option'
      )
    );
    return elements.map((o) => {
      let name = o.innerHTML;
      return name;
    });
  });

  //   确定目标分支
  let targetBranch = branches.find((b) => b.indexOf(branchName) != -1);
  console.log('选择分支:' + targetBranch);

  //   选择分支
  await page.select(
    'div[description="选择发布的版本(分支-分支id)"] select[name="value"]',
    targetBranch
  );
  //  选发布环境
  let envs = {
    dev: '开发环境input控件的value值',
    test: '测试环境input控件的value值',
  };

  await page.click(`input[value="${envs[envName]}"]`);

  console.log('选择环境:' + envs[envName]);

  await page.evaluate(() => {
    const elements = Array.from(
      document.querySelectorAll('input[type="checkbox"]')
    );
    elements[elements.length - 1].checked = false;
  });

  await page.click('#yui-gen1-button');
  console.log('发布时间:' + pubTime);

  await browser.close();
})();

# 效果演示

加了 koa 处理请求之后,关键部分的效果

原文地址:https://cloud.tencent.com/developer/article/1939387

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340