纯Bash Clojure-ish CI管道

2021-01-04 20:27:54

名称:线*************************************************** ********************目标:localstart:ter 22 dez 2020 21:38:01 -03 cmd:echo hello world!你好,世界 !退出代码:0状态:真实完成:ter 22 dez 2020 21:38:04 -03 *********************************** *********

作业定义为关键字的哈希图。可用于工作的commons关键字是:

是作业所需的唯一必需关键字。它是将由模块执行的对象数组。数组的每个元素都是一个任务,该作业可以处理N个任务。如果任何任务的退出代码都不同于0,则作业将停止并引发错误。忽略错误和重试有助于处理错误。

主机目标是作业将运行的位置。如果任何目标通过,则作业将在本地主机上运行。

目标可以在单独的文件中定义,在执行期间可以将数据与作业合并并在n个主机中执行相同的作业。

可以为过滤器设置另一个关键字,例如组,直流或组织者目标需要的任何其他值。

如果某些任务失败,行将不会停止管道,仅返回当前任务失败。

最大重试次数为2,但可以在环境vars处设置LINES_JOB_MAX_ATTEMPTS来增加重试次数。

{:module" docker" :args {:image" ubuntu" :服务[{:image" nginx" :alias" nginx"}]}:应用[" apt-get update" " apt-get install curl -y" " curl http:// nginx"]}

使用nginx映像作为服务启动docker实例并将网络别名设置为nginx

服务是一个哈希表数组,可以用docker模块最多N个服务,以下关键字可用于构建服务。

; .lines / modules / git / module.clj;为git命令创建样板函数(str-use [" git"]);自定义用户功能,参数:job(接收工作定义),i(应用索引);返回字符串的函数,例如。 `git clone -v [email protected]:rosineygp / mkdkr.git mkdkr`(defn str-git-命令行[job i](git [" clone"" -v& #34;(get i:repos)(get i:dest)])); lines将调用此函数`lines-module-< module_name>`(defn lines-module-git [job](lines-task-loop job str-git-command-line));循环处理程序

;文件:node.edn [{:name" build" :应用[" npm install"]} [{:名称"单元测试" :组[" test"]:应用[&npm unit"]} {:名称" mocha测试" :组[" test"]:应用[" npm摩卡"]}}] {:名称"部署" :应用[" npm部署"]}]

管道内的作业可以并行执行,只需使用[array]组即可,然后可以使用自定义关键字以获得更好的表示法,例如:groups。

;文件:hosts.edn [{:label" vm-0" :主机" 192.168.1.4" :方法" ssh" :user" ubuntu"} {:label" vm-1" :主机" 192.168.1.5" :方法" ssh" :user" ubuntu"}]

#在所有主机行中执行管道-p node.edn -i hosts.edn#仅过滤wm-0主机行-p node.edn -i hosts.edn -l label = wm-0#过滤作业部署并托管wm-1lines- p node.edn -i hosts.edn -l label = wm-1 -j name =部署

;为找到的每个yml生成一个作业,并使用docker image yamllint(lines-pp(parallel(map(fn [x](assoc {}:name(get x:object)):module" docker": args {:image" my / yamllint"}:apply [(str" yamllint"(get x:object))]))(filter(fn [i](=& #34; yml"(get i:type)))(list-dir" src /"))))))

过滤器| pmap | println_stderr |出口! |陷阱! |未设定str-join | str-subs |范围| str-ident | mod |文件存在|文件写入取消链接|或|和哈希表列表|合并键名|打电话|可以打电话吗? |进入|甚至? |奇? |一次加载|吐

({:尝试1:args {}:module" shell":status true:apply [" echo hello world!"]:name" lines" :retries 0:target {:label":local":method"}:pipestatus((0)):完成1608684590507:vars {" BRANCH_NAME_SLUG&#34 ;" master"" master"}:ignore-error false:start 1608684587657:result(({{:exit-code 0:Finished 1608684590253 :cmd" echo hello world!":stdout" hello world!":stderr"":start 1608684590233:debug" bash -c $ '导出BRANCH_NAME_SLUG = \" master \" BRANCH_NAME = \" master \"; echo hello world!'"}))}))

可能创建函数并扩展可用性,所有扩展名都必须位于.lines / ext /,这只是具有有用功能的clojure脚本。

;文件:.lines / ext / apt-helper.clj(str-use [" apt-get"])(defn apt-update [](apt-get [" update&#34 ;]))(defn apt-args [选项软件包](apt-get(concat选项软件包)))(defn apt-install [软件包](apt-args [" install"" -y"]程序包))(defn apt-remove [程序包](apt-args [" remove"" -y"]程序包))

flk与应用了patch /的Fleck相同,而flk包含所有src /。