1. 程式人生 > >Gitlab 中 YAML 相關關鍵字與概念解析

Gitlab 中 YAML 相關關鍵字與概念解析

概念

  1. Job

    YAML 檔案使用一系列約束敘述定義了 Job 啟動時所要做的事情。Job 被定義為具名的頂級元素,並且至少包括一條指令碼語句。Job 被 Runner 拿到並在 Runner 的環境下執行。重要的是,每個 Job 都會與其他 Job 分離開來,獨立進行。如:

      job1:
          script: "execute-script-for-job1"
      job2:
          script: "execute-script-for-job2"
    

    上面的例子是兩個在ci中能起作用的最簡單的,分離的任務,每一個任務執行一條不同的命令。每條命令都會被Runners拿到並在Runner的環境下被執行。重要的是,每個任務將會獨立進行,與其他任務分離開來。

關鍵字

  1. 不可以被用於 Job名 的保留字

    關鍵字 是否必須 描述
    image no 使用的docker映象。詳見
    services no 使用的docker服務。詳見
    stages no 定義構建場景
    types no stages的別名(不贊成使用
    )
    before_script no 定義每個任務的指令碼啟動前所需執行的命令
    after_script no 定義每個任務的指令碼執行結束後所需執行的命令
    variables no 定義構建變數
    cache no 定義哪些檔案需要快取,讓後續執行可用
  2. Job 的保留字

    關鍵字 是否必須 描述
    script yes Runner執行的命令或指令碼。可以包含多條命令
    image no 使用的docker映象。詳見
    services no 使用的docker服務。詳見
    stage no 定義job stage(預設:test)
    type no stage的別名(已棄用)
    variables no 定義job級別的變數
    only no 定義一列git分支,併為其建立job
    except no 定義一列git分支,不建立job
    tags no 定義一列tags,用來指定選擇哪個Runner(同時Runner也要設定tags)
    allow_failure no 允許job失敗。失敗的job不影響commit狀態
    when no 定義何時開始job。可以是on_success,on_failure,always或者manual
    dependencies no 定義job依賴關係,這樣他們就可以互相傳遞artifacts
    cache no 定義應在後續執行之間快取的檔案列表
    before_script no 重寫一組在作業前執行的命令
    after_script no 重寫一組在作業後執行的命令
    environment no 定義此作業完成部署的環境名稱
    coverage no 定義給定作業的程式碼覆蓋率設定
  3. only and except 保留字

    關鍵字 描述
    branches 當一個分支被push上來
    tags 當一個打了tag的分支被push上來
    api 當一個pipline被piplines api所觸發調起,詳見piplines api
    external 當使用了GitLab以外的CI服務
    pipelines 針對多專案觸發器而言,當使用CI_JOB_TOKEN並使用gitlab所提供的api建立多個pipelines的時候
    pushes 當pipeline被使用者的git push操作所觸發的時候
    schedules 針對預定好的pipline而言(每日構建一類)
    triggers 用token建立piplines的時候
    web 在GitLab頁面上Pipelines標籤頁下,你按了run pipline的時候

重要的關鍵字解析

  1. after_script

    before_scriptscript 在一個上下文中是序列執行的,after_script 是獨立執行的。所以根據執行器(在runner註冊的時候,可以選擇執行器,docker,shell 等)的不同,工作樹之外的變化可能不可見,例如,在before_script中執行軟體的安裝。

    你可以在任務中定義 before_scriptafter_script,也可以將其定義為頂級元素,定義為頂級元素將為每一個任務都執行相應階段的指令碼或命令。

  2. stages

    stages的允許定義多個,靈活的場景階段的pipline。定義的元素的順序決定了任務執行的順序。例如:

        stages:
          - build
          - test
          - deploy
    
    1. build場景的任務將被並行執行。test、deploy 同理
    2. build 任務成功後,test 執行。test 成功後,deploy 執行
    3. 所有的都成功了,提交將會標記為成功
    4. 任何一步任務失敗了,提交標記為失敗並之後的場景,任務都不回執行。
  3. variables

    GitLab CI允許你為.gitlab-ci.yml增加變數,該變數將會被設定入任務環境。這些變數是你儲存在git倉庫裡,並且非敏感的專案配置,例如:

    variables:
        DATABASE_URL: "postgres://[email protected]/my_database"
    # 注意:整數和字串一樣,對於設定變數名和變數值來說都是合法的。但浮點數是非法的。
    

    詳見此處

  4. script
    script是一段由Runner執行的shell指令碼,例如:

    job:
        script: "bundle exec rspec"
    

    這個引數也可以使用陣列包涵好幾條命令:

    job:
        script:
            - uname -a
            - bundle exec rspec
    

    注意:有些時候,script命令需要被單引號或者雙引號所包裹。例如:當命令中包涵冒號的時候,該命令需要被引號所包裹。這樣YAML解析器才知道該命令語句不是“key: value”語法的一部分。當命令中包涵以下字元時需要注意打引號:`: { } [ ] , & * # ? | - < > = ! % @ ``

  5. only and except

    only和except兩個引數說明了job什麼時候將會被建立:

    1. only定義了job需要執行的所在分支或者標籤
    2. except定義了job不會執行的所在分支或者標籤

    以下是這兩個引數的幾條用法規則:

    1. only和except如果都存在在一個job宣告中,則所需引用將會被only和except所定義的分支過濾.
    2. only和except允許使用正則
    3. only和except允許使用指定倉庫地址,但是不forks倉庫

    例子解析:

    1. job將會只在issue-開頭的refs下執行,反之則其他所有分支被跳過:

      job:
          # use regexp
          only:
              - /^issue-.*$/
          # use special keyword
          except:
              - branches
      
    2. job只會在打了tag的分支,或者被api所觸發,或者每日構建任務上執行,

      job:
          # use special keywords
          only:
              - tags      # tag 分支 commit 之後觸發
              - triggers  # API 觸發
              - schedules # 每日構建觸發
      
    3. job將會在父倉庫gitlab-org/gitlab-ce的非master分支有提交時執行。

      job:
          only:
              - [email protected]/gitlab-ce
          except:
              - [email protected]/gitlab-ce
      
    4. 在計劃被觸發時或者master分支被push時觸發,並且先決條件是kubernetes服務是活躍的(你啟用了kubernetes服務作為執行器,相關請看gitlab ci runner的文件,ce使用者一般用求不到)

      job:
          only:
              refs:
                  - master
                  - schedules
              kubernetes: active
      
  1. artifacts

    artifacts 被用於在 job 作業成功後將制定列表裡的檔案或資料夾附加到 job 上,傳遞給下一個 job ,如果要在兩個 job 之間傳遞 artifacts,你必須設定dependencies,下面有幾個例子

    1. 傳遞所有binaries和.config:

      artifacts:
          paths:
              - binaries/
              - .config
      
    2. 傳遞所有git沒有追蹤的檔案

      artifacts:
          untracked: true
      
    3. 傳遞binaries資料夾裡所有內容和git沒有追蹤的檔案

      artifacts:
          untracked: true
          paths:
              - binaries/
      
    4. 禁止傳遞來的artifact:

      job:
          stage: build
          script: make build
          dependencies: []
      
    5. 只為打tags的行為建立artifacts。artifacts將會在job執行完畢後送到GitLab ui前臺來,你可以直接下載它(tag、details、pipeline 的下載按鈕上都會出現)。

      default-job:
          script:
              - mvn test -U
          except:
              - tags
      
      release-job:
          script:
              - mvn package -U
          artifacts:
              paths:
                  - target/*.war
              only:
                  - tags
      

    artifacts:name

    name指令允許你對artifacts壓縮包重新命名,你可以為每個artifect壓縮包都指定一個特別的名字,這樣對你在gitlab上下載artifect的壓縮包有用

    job:
        artifacts:
            name: "$CI_JOB_NAME"
    

    artifacts:when
    用於job失敗或者未失敗時使用。artifacts:when能設定以下值:

    1. on_success 這個值是預設的,當job成功時上傳artifacts
    2. on_failure 當job執行失敗時,上床artifacts
    3. always 不管失敗與否,都上傳
    job:
        artifacts:
            when: on_failure    #當失敗時上傳artifacts
    

    artifacts:expire_in
    artifacts:expire_in 用於設定 artifacts 上傳包的失效時間. 如果不設定,artifacts 的打包是永遠存在於 gitlab上 的。當指定 artifacts 過期時間的時候, 在該期間內,artifacts 包將儲存在 gitLab 上。並且你可以在 job 頁面找到一個 keep 按鈕,按了以後可以覆蓋過期時間,讓 artifacts 永遠存在。過期之後,使用者將無法訪問到 artifacts 包。時間的例子如下:

    • '3 mins 4 sec'
    • '2 hrs 20 min'
    • '2h20min'
    • '6 mos 1 day'
    • '47 yrs 6 mos and 4d'
    • '3 weeks and 2 days'
    job:
        artifacts:
            expire_in: 1 week # 一週後過期
    
  2. Triggers

    Triggers被用於重建特定分支,tag或者commit,他是api觸發的。詳見

其他關鍵字我沒有用到因此也就沒有繼續研究了。

根據自己的需求進行 build 的設定

首先,設定 triggers。

 

 

編寫 YAML,這是為 triggers 觸發:

 

使用以下程式碼觸發 build 。

curl -X POST -F token=你的token -F ref=你的Branch名稱 https://your.gitlab.address/api/v4/



轉載:https://www.jianshu.com/p/3c0cbb6c2936