断简残篇

自言自语

不随意在论坛上发布言论,容易被不知上下文的人乱七八说。

注:相比较,在技术论坛上,将自己的问题描述清楚,很多人乐意、有兴趣来帮你解决;最好把上下文给全一点,即使没有给全,一般技术人员会耐心的询问。但很多日常生活的论坛,缺乏谨慎、客观、耐心,弄不好就是一场大战。

————————–分割线—————————
由于内容不多,下面的就一并放在一个链接里,日后再new一个

ta说的

自由有各种不同的类型,而最宝贵那一种,在这个以胜利、成就和炫耀为基准的花花世界中,很少被人提及。真正重要的那种自由,意味着专注、自觉、自律、不懈努。

关乎于真正教育的真正价值,与成绩无关,与学位无关,而在于一种自觉——意识到什么是真实的,什么是必要的;这种自觉就隐藏在我们身边平淡无奇的生活之中,我们必须时时刻刻一遍又一遍地提醒自己。

注:来自 大卫·福斯特·华莱士《生命中最简单又最困难的事》。最近才知道这么一个人,他是特别爱哲思的一个人,对于生活中最显而易见的平常之事,却用不同于常人的角度思考者,提及的也是最容易被我们忽视的东西。看他的文字比较费脑子,但能感受到其真诚、朴实。 有人说哲学就是抬杠,就是钻牛角尖,就是较真儿…也没有错吧。

生活不总是一帆风顺,我们要学会提醒自己走出思维定势的泥沼。

注:来自《生命中最简单又最困难的事》导读部分

真正的体贴是让人察觉不到的,穷得开朗
注:来自《佐贺的超级阿嬷》某部分,还在看中

今天我们遇到的所有问题,都可以用一句话概括:信息不对称。如果你知道了行业信息,就不会迷茫,如果你知道了市场信息,你的产品会卖爆。如何消除信息不对称,其实你消不了。这就是二八定律。你能做的,就是多和不同的人交流沟通,取长补短,在可控范围那多去尝试,扩展视野。这么做的目的不是为了让自己爬的更高,,而是为了别让自己跌得很惨。

注:来自豆瓣某处,身处交易频繁的生活中,不管你在城市,还是乡镇,我们经常交易着。这就意味着,你要购买某一个东西或者服务,而常说买的“买的没有卖的精”便是由于信息不对称。而很多时候,人们对一笔交易在事后气氛、扯皮,也都是因为它。花很多时间收集信息,必定耗费精力,或者你也可以选择承受信息不对称的后果,但关键是信息壁垒有很多时候很严重,你都没有机会去选择,或者说你连后果的程度都无法得知。在最近几年的租房经历中感受颇深,相比于,程序的世界,开源的世界,那里似乎是一个理想国。

坐在钢筋水泥的办公室里,终日和文件、盖章、领导打交道的办公室职员,需要消费额外的心里,来不断确认自己在这个世界中的存在价值。除了薪酬,我们很难直观感受到自己的劳动成果,也不知道有谁在意自己所做的一切。有时候,在内心深处,我们甚至为自己的工作感到沮丧和心虚…

注:据说来自李松蔚老师,我又孤陋寡闻了。有些时刻,我也会怀疑工作的意义,怀疑每天上下班的意义,也可能因此消沉数日。但上述的也不是每个人经常的感受,毕竟有时候工作的内容还是有意思的。

心怀质疑,胸有主见

当你心灰意冷的時候,就去做这些事情吧

  • 去户外挥洒汗水
  • 去卧室清扫疲惫
  • 去菜市场感受人间烟火
  • 去书里领略万千风景
  • 去医院体悟人生百态

20年的武汉像一个人,像一个灰心丧气的、不停遇到各种坎坷麻烦不断的人;也像今天的天气一般,笼罩着的不是雾霾,而是你我都知道的雨汽,很少见到蓝天白云,而这几天的雨下着不停。道路依旧堵得慌,整个氛围都让人堵得慌。

老旧城区交织的一条街,几个世界。如果从0点开始观看这条街,凌晨3、4点就是一些少男少女的街道,他们刚结束他们的狂欢、工作,准备回到自己的住处;然后到了4、5点的时候,街边的早餐店慢慢开门准备着;6、7点,学生们三五成群地走向校园,纯粹而快乐,吃个好吃的早餐就可以让其开心一下;8、9点,城市的上班族,买着早餐、等着公交车,骑着电瓶车各自穿行,不宽不窄的道路也慢慢拥挤了;紧接着就是生活的人们,慢悠悠地买菜、送货,为自己的午饭准备着,有的为别人的午饭准备着,直到下午3、4点学生放学了,5、6点上班族下班,偶尔为了犒劳自己去小店大馆子搓一顿。接着,7-9点天色渐黑、华灯初上,道路上红成一条珍珠项链一般。到了夜色全部降临,另一部分人又开始出门,就是那群少男少女,打扮装饰一番去迎接他们的夜生活。

有的人多着阳光,迎上黑夜的庇护;有的人渴望那黑夜,却不得不

Vivaldi入手

0.前言

最近才在一些论坛上听说 Vivaldi 浏览器的大名(我孤陋寡闻了😅)。毕竟入手一个浏览器工具又不花钱,那Chrome挺好用的,为什么要换?

尝尝新鲜的,换着试试看,毕竟不尝试一段时间怎么知道好不好。

1.介绍

维基百科的介绍)来看,Vivaldi的来头可不小,创始人是 Opera 浏览器的前任CEO,估计中间有很多商业故事。使用 Chromium 做内核,能直接安装Chrome网上应用店的应用程序.2016年4月发布第一个版本,距今正好4年,算是比较年轻。后生可畏,轻装上阵,说不定比庞大的chrome会有一些小优势。

Vivaldi is a freeware, cross-platform web browser developed by Vivaldi Technologies, a company founded by Opera Software co-founder and former CEO Jon Stephenson von Tetzchner and Tatsuki Tomita. It was officially launched on April 6, 2016.

2.安装

直接到官网 https://vivaldi.com/ 下载安装对应系统的版本即可。我当前安装的具体版本是:Vivaldi 2.11.1811.52 (Stable channel) (64-bit)

3.使用

打开安装好的浏览器后会有一个链接 vivaldi://welcome ,引导做初始化设置

3.1 引导

Welcome to Vivaldi

没啥~

Import Bookmarks & Settings

不要要导入导出的步骤,vivaldi会要求输入电脑的密码获取权限拿其他浏览器的书签内容。

Pick a Theme

选背景主题,不多说,但是据说能够做很多自定义的设置,比如某个网站打开后指定其tab颜色。

Position Your Tabs

这里的Tabs指的是一般浏览器最上头一栏,可以切换你的网页的部分。vivaldi 支持你把这个Tabs放到 顶部、左边、右边、底部,但是一般还是习惯 顶部,暂时不换了。尝试了一下放到左边,占据的面积会大一些,因为会直接显示每个网页的缩略图,清晰的让你看到网页大致内容。

Get Going

观看指南的链接、加入社区的链接、关注多个社交账、号是否接收邮件

更多详细的功能也可以看发布计划#Releases),毕竟每次新加功能都会在发布计划里提到。

3.2 实际使用

很容易实现在多panel功能,效果如下,方便对比、或者参考:

1
2
3
4
5
6
7
8
9
+-------------+ +-------------+
| | | |
| | | |
| website 1 | | website 2 |
| | | |
| | | |
| | | |
| | | |
+-------------+ +-------------+

针对网页记笔记,右边网页,左边笔记,后期也可查找、使用。

1
2
3
4
5
6
7
8
9
+-----------------------------+
| || |
| || |
|note|| |
| || website |
| || |
+-----| |
| || |
+-----------------------------+


  • TODO 很多功能还未尝试,等用过后再来聊聊。不过听说快捷键网页笔记(保存百度文库的复制内容?)算是特色吧
  • TODO 但其实以前也没研究过chrome,firefox有没有类似功能。移动端来看,目前还只有 Android 版 Vivaldi,而且还是测试版本,估计等待不久就会出正式版。对开发人员而言,如何调试程序、定位bug,清理缓存数据?是否会有新的交互方式呢,

More Ref:

Github Actions E07上下文和表达式语法

前言

如果没有这些内容,workflow照样可以运行起来;但利用上下文获取的信息和内置的表达式功能可以大大帮助我们轻松地完成更多的事情。另外,上下文和环境变量中的部分内容的目的是一样的,在选择时,用自己习惯的之一就好。

1. 介绍

可以使用表达式程序化设置工作流程文件中的变量和访问上下文。表达式可以是文字值、上下文引用或函数的任意组合。可以使用运算符组合文字、上下文引用和函数

在if条件条件下使用表达式时,不需要使用表达式语法,因为GitHub会自动将if条件条件计算为表达式。

1
2
3
4
# if 条件的示例表达式
steps:
- uses: actions/hello-world-javascript-action@master
if: <expression>

2. 上下文

Contexts are a way to access information about workflow runs, runner environments, jobs, and steps. 上下文使用表达式语法。

上下文名称 类型 描述
github 对象 工作流程运行的相关信息。 更多信息请参阅 github 上下文。
env 对象 Contains environment variables set in a workflow, job, or step. For more information, see env context .
job 对象 当前执行的作业相关信息。 更多信息请参阅 job 上下文。
steps 对象 此作业中已经运行的步骤的相关信息。 更多信息请参阅 steps 上下文。
runner 对象 运行当前作业的运行程序相关信息。 For more information, see runner context.
secrets 对象 用于访问仓库中设置的密码。 For more information about secrets, see “Creating and using encrypted secrets.”
strategy 对象 用于访问配置的策略参数及当前作业的相关信息。 策略参数包括 fail-fast、job-index、job-total 和 max-parallel。
matrix 对象 用于访问为当前作业配置的矩阵参数。 例如,如果使用 os 和 node 版本配置矩阵构建,matrix 上下文对象将包含当前作业的 os 和 node 版本。

2.1 github context

官网中也提到 你可以在环境变量中读取到大多数的 github 上下文

作为表达式的一部分,您可以使用以下两种语法之一访问上下文信息。

索引语法:github[‘sha’]
属性解除参考语法:github.sha

注意: 在使用敏感信息时,需要更加小心。在控制台日志输出时,Github 会遮掩sercrets。但是当导出或打印上下文时应谨慎行事。

2.2 env context

env上下文包含在工作流,作业或步骤中设置的环境变量。 有关在工作流中设置环境变量的更多信息,可参见之前的文章–Github Actions E05环境变量

env上下文语法允许您在工作流文件中使用环境变量的值。 如果要在runner中使用环境变量的值,请使用runner操作系统的常规方法读取环境变量。

2.3 job context

job 上下文包含当前正在运行的作业相关信息。

2.4 steps context

steps 上下文包含当前作业中已经运行的步骤相关信息。

2.5 runner context

2.6 secrets context

2.7 strategy context

2.8 matrix context

各种上下文列表(还没看得到 strategy、matrix的使用)

属性名称 类型 描述
github object 工作流程中任何作业或步骤期间可用的顶层上下文。
github.event object 完整事件 web 挂钩有效负载。 更多信息请参阅“触发工作流程的事件”。
github.event_path string The path to the full event webhook payload on the runner.
github.workflow string 工作流程的名称。 如果工作流程文件未指定 name,此属性的值将是仓库中工作流程文件的完整路径。
github… github上下文还有很多,详情请见xx
env object 此上下文针对作业中的每个步骤而改变。 您可以从作业中的任何步骤访问此上下文。
env.<env name> string 某一个具体环境变量的值。 (完)
job object 此上下文针对工作流程运行中的每项作业而改变。 您可以从作业中的任何步骤访问此上下文。
job.status string 作业的当前状态。 可能的值包括 success、failure 或 cancelled。
job.container object 作业的容器相关信息。 有关容器的更多信息,请参阅“GitHub 操作 的工作流程语法”。
job.container.id string 容器的 id。
job… job 上下文还有很多,详情请见xx
steps object 此上下文针对作业中的每个步骤而改变。 您可以从作业中的任何步骤访问此上下文。
steps..outputs object 为步骤定义的输出集。 更多信息请参阅“GitHub 操作 的元数据语法”。
steps..outputs. string 特定输出的值。(完)

3. 文字

作为表达式的一部分,您可以使用 boolean、null、number 或 string 数据类型。 Boolean 文字不区分大小写,因此可以使用 true 或 True。

数据类型 文字值
boolean true 或 false
null null
number JSON 支持的任何数字格式。
string 必须使用单引号。 使用单引号逸出文字单引号。

4. 运算符

运算符 描述
( ) 逻辑分组
[ ] 索引
. 属性解除参考
!
< 小于
<= 小于或等于
> 大于
>= 大于或等于
== 等于
!= 不等于
&&
| |

GitHub 进行宽松的等式比较。

  • 如果类型不匹配,GitHub 强制转换类型为数字。 GitHub 使用这些转换将数据类型转换为数字:
  • 一个 NaN 与另一个 NaN 的比较不会产生 true。
  • GitHub 在比较字符串时忽略大小写。
  • 对象和数组仅在为同一实例时才视为相等。

5. 函数

GitHub 提供一组内置的函数,可用于表达式。 有些函数抛出值到字符串以进行比较。 GitHub 使用这些转换将数据类型转换为字符串。 函数有 contains、startsWith、 endsWith、 format、 join、 toJson、 hashFiles,还有一类作业状态检查函数,有 success、always、 cancelled、 failure。有些类似Jenkins中的post使用的一些判断条件,但github actions是使用于step中的。具体使用详情可见官网

6. 对象过滤器

可以使用 * 语法应用过滤条件并从集合中选择匹配的项目。

例如,考虑名为 fruits 的对象数组。

1
2
3
4
5
[
{ "name": "apple", "quantity": 1 },
{ "name": "orange", "quantity": 2 },
{ "name": "pear", "quantity": 1 }
]

过滤条件 fruits.*.name 返回数组 [ “apple”, “orange”, “pear” ]


由于项目实践还不多,等我哪天需要用到这些功能,以完成一些特殊情况的需求时,再来一一举例。

Github Actions E06产出物

前言

大多数时候,workflow的产出物都会直接传到对应的某些仓库,比如docker image会送到docker hub这种仓库存储。这种时候是不需要在workflow再额外的管理产出物,但也不能全盘否定;有时候我们没有一个方便的地方去存储某些形式的文件等,就需要我们有类似jenkins archiveArtifacts 功能。但github actions能做的会更多,请期待。

1. 关于artifacts

构件是指在工作流程运行过程中产生的文件或文件集。
GitHub 提供两项可用于上传和下载构建构件的操作。 上传到工作流程运行的文件将使用 .zip 格式存档。 更多信息请参阅 action/upload-artifactdownload-artifact 操作。

这些是您可能想要上传的一些常见构建和测试输出构件:

  • 日志文件和核心转储文件
  • 测试结果、失败和屏幕截图
  • 二进制或存档文件
  • 压力测试性能输出和代码覆盖结果

当作业完成时,运行程序将终止并删除虚拟环境的实例。

2. 上传

常见的场景: 一个java程序的产出物是一个jar包,在构建之后需要得到这个jar用于其他环境部署。

依旧用 api-test-demo 这个仓库做演示,主要分为以下个步骤:

  • 1.下载代码;
  • 2.构建jar包(存放于指定到路径build/libs/api-demo-0.0.1-SNAPSHOT.jar);
  • 3.上传jar包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
name: my workflow demo 

on:
push:
branches:
- master

jobs:
artifacts_demo_job:
name: job1
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v1
- name: Build jar
run: |
pwd && ls -l
./gradlew -x jar build
ls -l build/libs/api-demo-0.0.1-SNAPSHOT.jar
- name: Archive SNAPSHOT.jar
uses: actions/upload-artifact@v1
with:
name: api_snapshot_jar
path: build/libs/api-demo-0.0.1-SNAPSHOT.jar

github actions 工作流的产出物都放在哪里的,保留多久

3. 下载

步骤官方说明如下:

  • 1.On GitHub, navigate to the main page of the repository.
  • 2.Under your repository name, click Actions.
  • 3.In the left sidebar, click the workflow you want to see.
  • 4.Under “Workflow runs”, click the name of the run you want to see.
  • 5.To download artifacts, use the Artifacts drop-down menu, and select the artifact you want to download.
  • 6.To delete artifacts, use the Artifacts drop-down menu, and click .

注意事项:

  • 保留90天
  • 一旦删除某一个构件,无法恢复

4. 在工作流程中作业之间传递数据

https://help.github.com/cn/actions/configuring-and-managing-workflows/persisting-workflow-data-using-artifacts#passing-data-between-jobs-in-a-workflow

由于同一个workflow的多个job分别运行在不同的虚拟主机上,下面示例工作流程说明如何在相同工作流程中的任务之间传递数据。关键词 need 用来确保job按顺序运行.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
name: Share data between jobs

on: [push]

jobs:
job_1:
name: Add 3 and 7
runs-on: ubuntu-latest
steps:
- shell: bash
run: |
expr 3 + 7 > math-homework.txt
- name: Upload math result for job 1
uses: actions/upload-artifact@v1
with:
name: homework
path: math-homework.txt

job_2:
name: Multiply by 9
needs: job_1
runs-on: windows-latest
steps:
- name: Download math result for job 1
uses: actions/download-artifact@v1
with:
name: homework
- shell: bash
run: |
value=`cat homework/math-homework.txt`
expr $value \* 9 > homework/math-homework.txt
- name: Upload math result for job 2
uses: actions/upload-artifact@v1
with:
name: homework
path: homework/math-homework.txt

job_3:
name: Display results
needs: job_2
runs-on: macOS-latest
steps:
- name: Download math result for job 2
uses: actions/download-artifact@v1
with:
name: homework
- name: Print the final result
shell: bash
run: |
value=`cat homework/math-homework.txt`
echo The result is $value

More Ref:

Github Actions E05环境变量

前言

例如在使用Jenkins等其他CICD工具时那样,环境变量可以帮助我们在流水线中传递参数,然后使用这些变量方便利用,或是获取更多关于构建的信息(比如GITHUB_REPOSITORY)。 例如构建镜像时 app1:master-1app1:ffac53, 用分支名做判断等。

1. 介绍

GitHub为每个GitHub Actions工作流程运行设置默认环境变量。 您还可以在工作流文件中设置自定义环境变量。

2. 默认的环境变量

环境变量 描述
HOME 用于存储用户数据的 GitHub 主目录路径。 例如 /github/home
GITHUB_WORKFLOW 工作流程的名称。
GITHUB_RUN_ID 仓库中每次运行的唯一编号。 如果重新运行工作流运行,此数字不会更改。
GITHUB_RUN_NUMBER 存储库中特定工作流程的每次运行的唯一编号。 对于工作流程的第一次运行,此数字从1开始,并在每次新运行时递增。 如果重新运行工作流运行,则此数字不会更改。
GITHUB_ACTION 操作唯一的标识符 (id)。
GITHUB_ACTIONS 当GitHub操作正在运行工作流时,请始终为true。可以使用此变量来区分何时在本地或通过GitHub运行测试.
GITHUB_ACTOR 发起工作流程的个人或应用程序的名称。 例如 octocat。
GITHUB_REPOSITORY 所有者和仓库名称。 例如 octocat/Hello-World。
GITHUB_EVENT_NAME 触发工作流程的 web 挂钩事件的名称。
GITHUB_EVENT_PATH 具有完整 web 挂钩事件有效负载的文件路径。 例如 /github/workflow/event.json
GITHUB_WORKSPACE GitHub 工作空间目录路径。 如果工作流程使用 actions/checkout 操作,工作空间目录将包含存储仓库副本的子目录。 如果不使用 actions/checkout 操作,该目录将为空。 例如 /home/runner/work/my-repo-name/my-repo-name
GITHUB_SHA 触发工作流程的提交 SHA。例如 ffac537e6cbbf934b08745a378932722df287a53。
GITHUB_REF 触发工作流程的分支或标记参考。例如 refs/heads/feature-branch-1,如果分支或标记都不适用于事件类型,则变量不会存在。
GITHUB_HEAD_REF 仅为复刻的仓库设置。 头部仓库的分支。
GITHUB_BASE_REF 仅为复刻的仓库设置。 基础仓库的分支。

作用域: 整个workflow中

在例子env_usage1.yml中,从上到下依次输出如下(如果需要测试,可去掉后缀 .backup):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Show Default environment variables
>> In this example <<
HOME is : /home/runner
GITHUB_WORKFLOW is: my workflow demo
GITHUB_RUN_ID is : 62167662
GITHUB_RUN_NUMBER is : 3
GITHUB_ACTION is : run
GITHUB_ACTIONS is : true
GITHUB_ACTOR is : qinrui777
GITHUB_REPOSITORY is : cicd-draft/api-test-demo
GITHUB_EVENT_NAME is : push
GITHUB_EVENT_PATH is : /home/runner/work/_temp/_github_workflow/event.json
GITHUB_WORKSPACE is : /home/runner/work/api-test-demo/api-test-demo
GITHUB_SHA is : 3eb054249e103ab3d8a85e23384472433b9815a8
GITHUB_REF is : refs/heads/master
GITHUB_HEAD_REF is :
GITHUB_BASE_REF is :

可以观察到:GitHub 会保留GITHUB_环境变量前缀供GitHub内部使用。设置有 GITHUB_ 前缀的环境变量或密码将导致错误。

3. 自定义环境变量

默认的环境变量有时候,不足以满足我们的要求,这是就需要自定义一些,以便使用。最好定义在yml文件靠前的部分,一目了然。

环境变量可用于工作流程中的所有作业和步骤,还可以设置仅适用于作业或步骤的环境变量,需要注意环境变量作用域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
name: my workflow demo 

on:
push:
branches:
- master

# 用于该workflow的所有job和steps
env:
SERVER: production

jobs:
env_usage_job1:
name: job1
runs-on: ubuntu-latest
steps:
- name: My step one
run: |
echo "this is job1"
echo $SERVER
# 不能写成 echo ${{ SERVER }}
second_job:
name: job2
runs-on: macos-latest
steps:
- name: My step one
run: |
echo "this is job2"
echo $SERVER
1
2
3
4
5
6
7
8
9
10
11
12
13
14
### job 级别的
jobs:
job1:
env:
FIRST_NAME: Mona

### steps 级别的
steps:
- name: Hello world
run: echo Hello world $FIRST_NAME $middle_name $Last_Name!
env:
FIRST_NAME: Mona
middle_name: The
Last_Name: Octocat

搞不懂为什么官网示例 steps 中的 env放在 run后面?

4. context 与 environment variables 的关系

The github context contains information about the workflow run and the event that triggered the run. You can read most of the github context data in environment variables. For more information about environment variables, see “Using environment variables.”

  • Todo

More Ref:

Github Actions E04运行环境-runner

前言

一个可以直接运行的CICD环境,用起来无疑节省了搭建环境的过程。但对于一个我们陌生的运行环境,最好还是提前了解一些基础的东西,比如:机器的操作系统及版本、内存、CPU、有多少磁盘可用、当前的用户是什么、权限有没有限制,以及workspace在什么目录,不然一旦遇到问题,就无从下手,或者找错方向。

##### CICD环境的灵魂3问:

  • 我是谁 -> 操作系统,具体版本,当前用户及权限
  • 我在哪里 -> 工作目录在哪里
  • 我能做什么 —> 有什么工具已经安装了,还是要自己安装

1. GitHub-hosted runner 介绍

一个 GitHub-hosted runner 是由GitHub托管并安装了GitHub Actions运行程序应用程序的虚拟机。 GitHub为运行Linux,Windows和macOS操作系统的用户提供帮助。

个人总结:GitHub Actions runner 是一个 application

官网也提及 “The GitHub Actions runner application is open source. You can contribute and file issues in the runner repository.”

2. 硬件资源

GitHub hosts Linux and Windows runners on Standard_DS2_v2 virtual machines in Microsoft Azure.

GitHub uses MacStadium to host the macOS runners.

每个虚拟机有相同的硬件资源可使用。拿一台同配置的个人电脑,或者云上的服务器相比,GA 的服务器运行起来会快一些。

  • 2-core CPU
  • 7 GB of RAM memory
  • 14 GB of SSD disk space
Virtual environment YAML workflow label
Windows Server 2019 windows-latest or windows-2019
Ubuntu 18.04 ubuntu-latest or ubuntu-18.04
Ubuntu 16.04 ubuntu-16.04
macOS Catalina 10.15 macos-latest or macos-10.15

Inbound ICMP packets are blocked for all Azure virtual machines, so ping or traceroute commands might not work. For more information about the Standard_DS2_v2 machine resources, see “Dv2 and DSv2-series” in the Microsoft Azure documentation.

3. 运行用户的权限

可以写一个demo查看一下当前用户,例子见下面 👇

Linux和macOS虚拟机均使用无密码sudo运行。 当您需要执行命令或安装需要比当前用户更多特权的工具时,可以使用sudo而不需要提供密码。

Windows虚拟机被配置为以禁用了用户帐户控制(UAC)的管理员身份运行。

4. 文件系统(Filesystems on GitHub-hosted runners)

GitHub在虚拟机上的特定目录中执行操作和shell命令, 虚拟机上的文件路径不是静态的。

Docker container filesystem 后面讲到时再说

关于查看当前用户和工作目录的demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
name: CI

on: [push]

jobs:
linux:
runs-on: ubuntu-latest
steps:
#我是谁
- run: whoami
#我在那儿
- run: |
pwd
echo $HOME $GITHUB_WORKSPACE $GITHUB_EVENT_PATH

在我的repo中运行的输出为:

1
2
3
runner
/home/runner/work/api-test-demo/api-test-demo
/home/runner /home/runner/work/api-test-demo/api-test-demo /home/runner/work/_temp/_github_workflow/event.json

GitHub为每个工作流创建的环境变量有很多,后面会单独讲到,也可以提前看一下有哪些环境变量。这样类似的默认的环境变量就是类似于我们在jenkins上用的 BUILD_NUMBER,JOB_NAME,当然也可以自定义环境变量。

5. 软件安装

不同的操作系统上都预先安装好了常用软件,详情可见下方的链接 https://help.github.com/en/actions/reference/software-installed-on-github-hosted-runners

Ubuntu 18.04 LTS
Ubuntu 16.04 LTS
Windows Server 2019
Windows Server 2016
MacOS 10.15

如果不想看看长长的readme,可以在运行job中先检查以下软件是否安装及具体版本;如果最后发现没有安装,就添加安装的命令即可。比如

1
2
3
4
5
6
7
8
9
10
name: CI

on: [push]

jobs:
linux:
runs-on: ubuntu-latest
steps:
- run: sudo apt-get install ninja-build
- run: ninja --version

思考个问题: 自定义 runner,以及用私有的服务器运行 workflow,怎么实现?

方法肯定是有的,相信github官方可考虑了runner私有化的场景(毕竟gitlab CI runner在那里摆着),后续有时间再研究


More Ref:

Shell toolbox

1 crontab

教你怎么写定时任务的网站,并给出了很多示例,比如

1
2
3
4
#“At every 2nd minute.”
*/2 * * * *
# At 22:00 on every day-of-week from Monday through Friday
0 22 * * 1-5

不要以为会写crontab就可以了,建议有空以下内容了解下:

最后,有兴趣可以看看 Cron Job Monitoring 的工具 cronitor,不过貌似是收费的。看介绍,可用于 Cron Job, Scheduled Event(AWS),Task Scheduler, Kubernetes Cron Job, Java Cron Job, Jenkins Job多类型的监控。

2. Preventing duplicate cron job executions

原文链接,关于 Preventing duplicate cron job executions 提到了多种方法和工具。另外,中文搜索的话 flock 命令较多,比如这个

打造高效的工作环境 – SHELL 篇

3. For 循环

参考
https://linuxize.com/post/bash-for-loop/
https://www.cyberciti.biz/faq/bash-for-loop/

1
2
3
4
for i in {1..5}
do
echo "Welcome $i times"
done

或者写在一行里 for i in {1..5};do echo "Welcome $i times";done

1
2
3
4
5
for i in $(ls ./* ); 
do
echo $i;
date;
done
1
2
3
4
for s in server1 server2 server3
do
ssh vivek@${s} "uptime"
done

Loop over array elements

1
2
3
4
5
BOOKS=('In Search of Lost Time' 'Don Quixote' 'Ulysses' 'The Great Gatsby')

for book in "${BOOKS[@]}"; do
echo "Book: $book"
done

参考链接:

4. xargs

先看🌰,快速 scale down k8s deployment.

1
2
3
4
5
6
7
8
9
10
11
12
13
kubectl get deploy -n <YOUR_NAMESPACE> -o name | xargs -I % kubectl scale % --replicas=0 -n <YOUR_NAMESPACE>


# 分解
kubectl get deploy -n <YOUR_NAMESPACE> -o name

# output:
deployment.extensions/backend-filebeat
deployment.extensions/daemon-filebeat
...

# 如果一条一条的执行,如下
kubectl scale deploy/daemon-filebeat --replicas=10 -n <YOUR_NAMESPACE>

实际使用的是 xargs 实现参数传递 这一方法:
ls *.log | xargs -I {} mv {} log_backup_dir/
这里的 {} 也可以用 % 代替,毕竟可以少敲一下键盘。另外可以看看 xargs与管道的区别

更多实际用法可以参考: https://blog.csdn.net/zhangmingxingwei/article/details/8996627 , 其中的git log --format="%H %P" | xargs -L 1 git diff 用法也很不错。 另外,有一个原理篇也建议看看,戳这儿

5. pssh pscp

pssh: Execute Commands on Multiple Remote Linux Servers Using Single Terminal

使用 链接1, 链接2

pscp 类似pssh,可以帮助你从一台主机上将文件发送到多台主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
                            +--------------+
+-------->| server 1 |
| +--------------+
|
|
|
+-------------|--- +--------------+
| pssh /pscp |------------>| server 2 |
+-------------+--- +--------------+
|
|
| +--------------+
+-------->| server 3 |
+--------------+

shell系列1-来源cnblogs

Github Actions E03触发

前言

知道手机能够打电话,还得知道怎么把电话号码拨出去,这样才能实现通话的功能;而CICD的场景会更为复杂,如果一个任务在你不想让它运行的时候运行,会浪费自己资源,影响产出物。

关于触发工作流-workflow,github actions的原文如下

Events that trigger workflows

You can configure your workflows to run when specific activity on GitHub happens, at a scheduled time, or when an event outside of GitHub occurs.


根据上面描述,大致有3类事件(错了的话欢迎指正),官网文档更详细的在这里,不是在那里

最好看英文的,中文似乎没有翻译完,少了一个 Triggering new workflows using a personal access token 方法 😢

一、Github的特定事件 (Specific activity on GitHub happens)

算是最常见的一种方式,比如:当小明更新了master分支代码,推送到仓库后触发这个CICD流程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 单一事件 Trigger on push
on: push
#------------------分割线----------------
# 一个事件列表也可以,Trigger the workflow on push or pull request
on: [push, pull_request]
#------------------分割线----------------
# 不同类型的事件的组合
on:
# Trigger the workflow on push or pull request,
# but only for the master branch
push:
branches:
- master
pull_request:
branches:
- master
# Also trigger on page_build, as well as release created events
page_build:
release:
types: # This configuration does not affect the page_build event above
- created

Github 的 webhooks event有很多,每个event又包含很多类型。查看所有的event

顺带熟悉下 github webhook 的概念

官方介绍:Webhooks provide a way for notifications to be delivered to an external web server whenever certain actions occur on a repository or organization.原文点这里

通俗版:可以将 github Webhook 理解为一个勤勤恳恳的“卧底”,它被安插到github的一个仓库或某个组织中,一旦发生了之前定义好的事情,它会第一时间把以某种约定好的方式告知给 github acionts。
简单(不严谨地)而言: 当有行为触发时,Github 会发送 POST 请求至指定的 URL。

请看🌰

1
2
3
on:
issue_comment:
types: [created, deleted]

默认情况下,一个事件的所有活动类型都会触发工作流程运行。也可以使用types关键字将工作流程运行限制为特定的活动类型,精确使用。

延伸一下: github webhook -> 广义的webhooks、 github哪些events

二、定时事件(Scheduled events)

类似crontab的用法,使用POSIX cron 语法在指定的时间(UTC 时间)运行。

在workflow中用 date命令也可以看到输出的是UTC时间,如:Thu Mar 19 12:08:10 UTC 2020。使用中要根据自己的时区计算出UTC时间,然后配置上。

1
2
3
4
on:
schedule:
# * is a special character in YAML so you have to quote this string
- cron: '*/15 * * * *'

注: GitHub 操作 不支持非标准语法 @yearly、@monthly、@weekly、@daily、@hourly 和 @reboot。这样的语法,如 @midnight 在jenkins中是支持的,需要区别开来。

三、外部事件(External events)

  • 通过Github API 触发叫做 repository_dispatch 的事件,以此来触发workflow.
1
on: repository_dispatch
  • 使用个人访问令牌触发新工作流程(Triggering new workflows using a personal access token)

原文引用:
For example, if a workflow run pushes code using the repository’s GITHUB_TOKEN, a new workflow will not run even when the repository contains a workflow configured to run when push events occur.

If you would like to trigger a workflow from a workflow run, you can trigger the event using a personal access token. You’ll need to create a personal access token and store it as a secret in your repository. To minimize your GitHub Actions usage costs, ensure that you don’t create recursive or unintended workflow runs.

上面提及的2中方法,都属于用外部方法来触发 workflow。 而上一段英文也提及 workflow 触发workflow的情况,有需要可详细研究。


More Ref:

  • Copyrights © 2019-2024 John Doe
  • Visitors: | Views:

请我喝杯咖啡吧~