Dry Realm

Get busy living

Category

  • DevOps
  • Javascript
  • Review
  • 一些技巧
  • 其它
  • 学习过程中的所感所想
  • 拼命学习
  • 那些年的所见所闻
  • 随笔

Tags

  • Node.js
  • MongoDB
  • linux
  • HTTP
  • es6
  • express
  • 运维
  • typescript
  • docker
  • 面试总结
  • MySQL
  • new life
  • review
  • 子网掩码
  • Git
  • 数据库连接
  • 第三方库
  • 网络
  • linux指令
  • jenkins pipeline
  • webpack
  • k8s
  • vscode
  • 大黑猫
  • 新博客框架
  • 西安
  • 3rd-lib
  • 南京
  • 文字
  • ECMA
  • 年度总结
  • Gitlab Api
  • 离别
  • 下载youtube
  • docker swarm
  • wsl2
  • 语句
  • 正则表达式
  • javascript
  • eslint
  • 负数
  • 数学
  • devcontainer
  • Css
  • 本地版博客
  • 数据库
  • ntzyz大佬
  • git

Recent replies

  • xzdry 发表于「使用ffmpeg和youtube-dl下载youtube视频」

友链

ntzyz double

我

真诚
很看重自己在乎的人
希望能越来越好
爱蛋蛋

记录一些实用的工具和库

2019 年 12 月 9 日分类:一些技巧#第三方库
提示:在继续阅读之前,请注意此文章最后更新于 2022 天前,其中的部分内容可能已经无效或过时。

win

chocolatey

win下的包管理工具,参见:chocolatey

linux

jq

jq,处理json的神器。此工具win下也可以使用,通过chocolatey包管理工具或可执行文件.exe安装。
参见:./jq

es6

2019 年 11 月 8 日分类:Javascript#javascript#es6

Symbol

Reflect

数组

Array.from和sort()方法

参见:Array.from
Array.prototype.sort()

Array.from()

此方法从一个类似数组或可迭代(iterable)对象中创建一个新的,浅拷贝的数组。

这个方法有三个参数,第一个是必须的类数组(或可迭代)对象arrayLike,剩余两个分别是mapFn(回调函数)和thisArg(执行回调mapFn时的this)

这里的第二个参数mapFn回调函数相当于Array.from(arrayLike)后在执行一次map方法,即等价于Array.from(obj).map(mapFn,thisArg),除非创建的不是可用的中间数组。

from()的length属性为1,即Array.from.length===1。 Array.from()可以通过两种方式来创建对象:

  • 伪数组对象(拥有一个length属性和若干索引属性的任意对象,如下方栗子5中第二个)
  • 可迭代对象(可以获取对象中的元素,如Map和Set等) 一些栗子:
/** 1.Array from a String */
Array.from('foo') //['f','o','o']

/** 2.Array from a Set    */
Array.from(new Set(['foo',window]))    // ['foo',window]

/** 3.Array from a Map    */
Array.from(new Map([1,2],[2,4],[4,8])) // [[1, 2], [2, 4], [4, 8]]

/** 4.Array from an Array-like object (arguments)    */
function f(){return Array.from(arguments)};
f(1,2,3);   //[1,2,3]

/** 5.在Array.from中使用箭头函数 */
Array.from([1,2,3],x=>x+x)        //  Array [2, 4, 6]
Array.from({length:5},(v,i)=>i);  //[0,1,2,3,4]

这个方法的去重的例子参见常用函数中的数组函数中的例子1。

Array.prototype.sort()

sort()对数组元素进行排序,并返回数组(数组已原地排序,并且不进行复制)。默认排序是将元素转换为字符串,然后比较它们的UFT-16代码单元值序列。 这个函数接收一个可选的函数作为参数。如果省略,元素按照转换为字符串的各个字符的Unicode位点进行排序。 栗子:

//  1. 未指明compareFunction
[1,30,100000].sort();   // [1,100000,30]   由于没有指定比较函数,所以会将number转为字符串然后比较Unicode
//  2. 指明compareFunction
[1,30,100000].sort((a,b)=>a-b);  // [1,30,100000]

对于compareFunction:

  • compareFunction(a,b),小于0,排序结果:a,b
  • compareFunction(a,b),等于0,a,b位置不变
  • compareFunction(a,b),大于0,排序结果:b,a 结果是从小到大升序排序,如果想降序把a,b交换传入 这个两个函数一起的例子参见常用函数002

in

参见:in

参数可以是一个字符串或者symbol类型的属性名或者数组索引。

  • 如果是数组索引index,会查找数组里是否有这个索引。感觉没有太多用处
  • 如果是字符串,会查找对象或者其原型链里是否包含该字符串命名的对象,比如:
const trees=new Array('bay');
0 in trees // true
'bay' in trees //false
Symbol.iterator in trees // true 数组可迭代,是其__proto__上的一个属性

const mycar={make:'Honda'};
'make' in mycar //true
'Honda' in mycar //false

in的右边必须是一个对象。比如:

const c1=new String('green');
const c2="coral";
'length' in c1; // true
'length' in c2; // false

记一次处理tag

2019 年 10 月 11 日分类:DevOps#git
提示:在继续阅读之前,请注意此文章最后更新于 2080 天前,其中的部分内容可能已经无效或过时。

前言

需求是删除一个lerna项目的tag。由于lerna的机制。lerna是通过拉取最近一次的tag对应的commit来判断哪些状态改变了。有关信息可以在另一篇关于lerna的blog里看到。所以会有很多由lerna提交的tag。但是这不是预期的,预期的是希望只有自己每次在发版的时候打的记录tag。

tag相关的操作

1.添加tag

# 轻量标签。没有打标签者、时间、附注信息等。
git tag [tagname]

# 附注标签
git tag -a [tagname] -m [附注信息]

#使用git show [tagname]来查看详细信息。轻量标签只有提交信息。

# 将本地tag推到远程仓库
git push origin [tagname]

# 推送全部本地tag到远程仓库(只会推远程仓库没有的)
git push origin --tags

区别如图:

2.删除tag

# 删除本地tag
git tag -d [tagname]

# 删除远程仓库的tag
git push origin :refs/tags/[tagname] # git push origin :[tagname]也可以。

# 更直观的删除远程标签的方式是
git push origin --delete [tagname]

3.查看tag

# 除了上面提到git show查看具体的tag(其实应该是查看提交)外,还可以
git tag # 从形式上来看等同于git tag -l(--list)

# 如果要列出对应的commit id的话,要使用下面的命令。并且上面提到的有些批量删除远程仓库的时候会有问题,这个时候就要使用这个命令配合上方面的(git push origin :refs/tags/[tagname])使用。下面会提到
git show-ref --tags

# 查看远程仓库的tag
git ls-remote --tags origin

4.xargs
参见:xargs 命令教程这篇教程已经讲的非常清楚了。这里罗列一下我觉得实用的几个参数:

  • -I 指定每一项命令行参数的替代字符串
  • -t 打印执行的命令
  • --max-procs 使用多进程。会快一些。0表示不限进程数

5.删除所有的tag
很不幸的是,git好像并没有提供这么一个命令删除所有的tag。这个时候就要用到xargs和管道符|配合使用了。

# 删除本地所有tag
git tag -l | xargs -t git tag -d 

# 如果要一条条的删除的话(会比较慢,可以配合多进程使用)
git tag -l | xargs -I {} git tag -d {}

这个比较简单,只要把所有的tag列出来作为输入传到xargs那边。就可以删除所有的tag。上面的{}只是占位符。可以换成任意的,比如'AAA'。相当于一个变量。

6.删除远程仓库所有的tag 有了上面的基础,就很简单了,只是命令换了一下

#1 这个命令比较直观,且易于处理
git tag -l | xargs -t git push origin delete

#2 或  这行命令就比较慢,好处在于不用处理在每个标签前分别加上':'
git tag -l | xargs -I {} git push origin :{}

# 如果要使用1中命令,且不使用delete命令的话,就需要使用awk给每一项加上个':'
git tag -l | awk '{print ":" $0}' | git push origin

# 上面的几种必须保证远程仓库有的tag,本地也有。因此要拉取到所有远程仓库的tag。如果想直接用远程仓库的tag来删除的话,可以用下面这种
git ls-remote --tags origin | awk '! /{}/ {print ":" $2}' | xargs -t git push origin

上面的最后一种方式,首先列出远程仓库所有的tag作为输入,但是由于列出的每一个tag都会有一个重复的带有^{}的。所以用正则筛选一下,然后打出第二例,但是这种ref/tags/[tagname]形式的,只能用:来操作,不能用delete。

实操

最终还是要应用到实际中的,最终如下:

git show-ref --tag | awk '/@[0-9].[0-9].[0-9]{0,3}/ {print ":" $2}' | xargs git push ${gitUrl}

但是最终还是有点问题。会把所有匹配到的lerna提交的tag都删除掉。无法保留最近的几个。且git tag -l查询的列表是按照字母来的。所以目前还是没有太好的思路。

参考:GIT 打标签
批量删除git 本地分支、远程分支、tag
git 如何同步本地、远程的分支和tag信息
Git批量删除远程的tag

pipeline轻量级检出的意思

2019 年 10 月 8 日分类:DevOps#运维#jenkins pipeline

经典UI里配置项轻量级检出的意思是只检查指定的脚本路径脚本的变化,而不获取整个git仓库的变化。比如我更改了readme,则workspace中不会有变化。并且也不会获得readme的提交(虽然能获取到脚本的更新但是也不会获取到对应的提交)。
如果要检出整个git仓库的变化,declarative式写法是默认检出的,如下图: 1604819006539-declearative_checkout_scm.png 在脚本式pipeline语法中,则需要加上checout scm,比如:

node {
  checkout scm
  stage('stage ex'){
    // do sth
  }
}

使用GitLab Api踩坑记录

2019 年 7 月 19 日分类:DevOps#Git#Gitlab Api

最近想要把git仓库的提交记录(commits)渲染到云设计项目的debugger信息中。考虑了两种方法,一种是本地git log然后使用webpack的插件DefinePlugin转换给web用。第二种是使用gitlab的api。虽然都有问题,但这里记录一些踩坑的过程。

Gitlab Api

gitlab关于commits的api文档参考:Commits API。比如我想获取一个月前的提交,可以这么写:

// 获取一个月前的ISO8601时间格式
const date = new Date();
date.setMonth(date.getMonth() - 1);
console.log('ISO8601', date);
let url = `${option.host}/api/v4/projects/${projectId}/repository/commits?private_token=${token}&since=${date.toISOString()}`;
const res = await axios.get(url);

然后第一个坑点就在这里,如果没有加任何限制的话,每页只显示20条记录。如图:

坑的是,这个api的文档里没有显示任何增加每页显示条数的方法。找了好久,才发现放到了Pagination。所以推测这是一个通用的api。不只是用于commit的请求返回。但是这有点太迷惑了。因此,如果我想要显示更多条数,比如1000条,可以这么写:

// url就是上面的url
url=`${url}/per_page=1000`

然后验证一下可知,它只显示100条。根据官方文档说的,每页最大只会显示100条。但是如果没有加since这个筛选条件的话,会发现不管是500还是1000都是可以显示的。所以突然想到。会不会是根据最大数量来判断的。比如我请求,查询到满足条件的有700条,那么如果我per_page限制为701。那么每页就只会返回100。经过试验,果然如此。所以如果想要返回全局满足条件的commit,可以做如下处理:

const res = await axios.get(url);
// 有多少条数据
const total = res.headers['x-total'];
let commitlog;
if (total) {
    url = `${url}&per_page=${total - 1}`;
    commitlog = await axios.get(url);
}
console.log('gitlab api commit log', commitlog);

先请求一次获取有多少条满足条件的数据。然后只要在请求一次把per_page限制在total-1就可以了。
虽然可以获取到满足条件的commits了。但是仔细想了一下发现这种通过gitlab api来获取请求的方式不符合需求,因为这个是实时获取gitlab仓库里的提交。但我要的是在项目发布那一刻的commits以确定是否有代码漏发布了。
还有一个小小的瑕疵是,我必须要把token暴露到请求里,这样随便一个人拿这个token都可以获取我仓库的代码提交信息以及根据api获取其它内容。虽然官方api提供了通过账户密码获取token的方式。但是这里的需求并不需要这样,所以就不考虑了。

本地git log的方式

这个方式是准备采用的方式。但是有两个问题,一个是提交记录如果太多,DefinePlugin会出错,报超出长度的错误。第二个是,没有办法获取到项目依赖包的提交记录。
虽然也尝试过sed的方式,但是也会报错,可能是因为有一些特殊字符的原因。这里先贴一下按照格式获取git log的方式:

const path = require('path')
const cwd = path.resolve(__dirname, '../');
const child_process = require('child_process')
const commitLog = child_process.execSync('git log --since="1 months" --pretty=format:"%h - %an,%ad - %ar,%s', { cwd, encoding: 'utf-8', maxBuffer: 2048 * 2048 })
module.exports = commitLog;

更多的可以参考git log文档

参考

GitLab API 踩坑小结

  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
Copyright © 2016-2018 ntzyz. All rights reversed.
Except where otherwise noted, content on this blog is licensed under CC-BY 2.0.