概述
1. CI/CD
CI(持續集成)指開發人員一天內進行多次合并和提交代碼操作,并通過自動化測驗,完成構建
CD(持續部署)指每次代碼更改都會自動部署到對應環境
CI/CD 結合在一起,可以加快開發團隊交付成果的效率,減少時間成本
2. Gitlab-CI/CD
gitlab-ci 是 gitlab8.0 之后自帶的一個持續集成系統,中心思想是每一次 push 到 gitlab 就會觸發一次腳本執行,腳本內容包括測驗、編譯、部署等一系列內容
gitlab-ci 的腳本需要 gitlab-runner 來執行,代碼 push 之后,webhook 檢查到代碼變化,就會觸發 gitlab-ci,分配到各個 Runner 來運行相應的腳本
gitlab-ce
1. 安裝 gitlab-ce
gitlab 有 ce 和 ee 兩個版本,ce 是社區版,開源免費,ee 是企業版,需要付費
下面以 Ubuntu18.04.6 為例,安裝 gitlab-ce
安裝依賴軟體
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates tzdata perl
添加 gitlab 軟體源鏡像
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
安裝 gitlab-ce
sudo apt-get install gitlab-ce
如果命令列能看到 Gitlab 的 Logo 列印,就說明安裝成功了
打開 gitlab 組態檔
vim /etc/gitlab/gitlab.rb
為了能在瀏覽器訪問 gitlab,還需要配置 gitlab 的訪問地址和埠
# ip:port 改成自己的,也可以用域名
external_url 'http://192.168.66.100:82'
多載配置并重啟
gitlab-ctl recofigure
gitlab-ctl restart
在瀏覽器輸入 http://192.168.66.100:82 即可訪問 gitlab,當然了,前提是你的埠要放開

初始用戶名為 root,初始密碼記錄在 /etc/gitlab/initial_root_password 檔案,密碼有效期為 24 小時,建議登錄后盡快修改密碼
登錄以后,就可以創建專案了,其余的基本的 git 操作這里就不贅述了
2. 其他問題
gitlab-ctl recofigure 程序,有可能出現卡在 ruby_block[wait for logrotate service socket] action run 的情況,解決辦法如下:
-
ctrl + c 強行結束
-
運行
systemctl restart gitlab-runsvdir -
再次運行
gitlab-ctl recofigure
安裝結束以后,訪問 web 端報 502,最可能的原因是埠被占用了,需要修改埠
vim /etc/gitlab/gitlab.rb
# 修改為沒有被使用的埠即可
puma['port'] = 9091
gitlab-runner
1. 安裝 gitlab-runner
下面以 Ubuntu18.04.6 為例,安裝 gitlab-runner
添加 gitlab 軟體源鏡像
curl https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
安裝 gitlab-runner
sudo apt-get install gitlab-runner
2. gitlab-runner 注冊
首先獲取 gitlab-ci 的 token:專案主頁->Setting->CI/CD->Runners Expand

使用命令注冊 gitlab-runner
gitlab-runner register
按照步驟輸入:
- GitLab instance URL:如上圖所示 URL
- registration token:如上圖所示 Token
- description:關于該 Runner 的描述
- tags:用于標記該 Runner,后續需要使用這個 tag 來指定 gitlab-runner
- optional maintenance note:沒搞懂有啥用,隨意寫
- Enter an executor:選擇執行器,gitlab-runner 提供了許多執行器,可用在不同場景中運行構建,這里選擇 shell
完成以后,重繪頁面,即可在 Runners Expand 看到新增了一個 Runner

3. 簡單示例
下面我們簡單測驗一下 Runner 是否能正常運行,隨意新建一個 SpringBoot 專案

在根目錄下創建一個 .gitlab-ci.yml 檔案,這里只是簡單輸出一段陳述句
stages:
- deploy
deploy-job:
tags:
- prod
stage: deploy
script:
- echo "hello world!!!"
push 到 gitlab 后,會發現腳本已經自動執行了,綠勾代表執行成功

點擊綠勾,在下方 Pipeline 點擊 deploy-job 可以查看執行程序


pipeline 語法
1. job & script
.gitlab-ci.yml 檔案中可以定義一個或多個作業(job),每個作業獨立執行,必須有唯一的名稱(不能使用關鍵字)以及包含一個 script,這里定義了三個作業 build、test、deploy,script 可以是 shell 命令
build:
script:
- echo "build"
test:
script:
- echo "test"
deploy:
script:
- echo "deploy"
- echo "finish"
2. before_script & after_script
before_script 用于定義一個命令,在每個作業運行之前運行,before_script 失敗將導致整個作業失敗,其他作業不再執行,如果在作業中定義了 before_script,則該作業不會運行全域的 before_script
after_script 用于定義一個命令,在每個作業運行之后運行,作業失敗不影響 after_script 的運行,如果在作業中定義了 after_script,則該作業不會運行全域的 after_script
before_script:
- echo "before script"
build:
before_script:
- echo "before script in buildjob"
script:
- echo "build"
after_script:
- echo "before script in buildjob"
test:
script:
- echo "test"
deploy:
script:
- echo "deploy"
- echo "finish"
after_script:
- echo "after script"
3. stages & stage
用于定義作業可以使用的階段,并且是全域定義的,同一階段的作業并行運行,不同階段按順序執行
before_script:
- echo "before script"
stages:
- build
- test
- deploy
build:
before_script:
- echo "before script in buildjob"
stage: build
script:
- echo "build"
after_script:
- echo "before script in buildjob"
test:
stage: test
script:
- echo "test"
deploy:
stage: deploy
script:
- echo "deploy"
- sleep 5
after_script:
- echo "after script"
4. .pre & .post
.pre 始終是整個 pipeline 的第一個運行階段,.post 始終是整個 pipeline 的最后一個運行階段,無法修改,用戶自定義的 stage 則在這兩者之間,如果一個 pipeline 僅包含 .pre 和 .post,則不會創建 pipeline
before_script:
- echo "before script"
stages:
- build
- test
- deploy
codescan:
stage: .pre
script:
- echo "codescan"
build:
before_script:
- echo "before script in buildjob"
stage: build
script:
- echo "build"
after_script:
- echo "before script in buildjob"
test:
stage: test
script:
- echo "test"
deploy:
stage: deploy
script:
- echo "deploy"
- sleep 5
after_script:
- echo "after script"
5. variables
定義變數,可以定義 pipeline 變數、job 變數,job 變數優先級最高
before_script:
- echo "before script"
variables:
DOMAIN: example.com
stages:
- build
- test
- deploy
codescan:
stage: .pre
script:
- echo "codescan"
build:
before_script:
- echo "before script in buildjob"
stage: build
script:
- echo "build"
- echo "$DOMAIN"
after_script:
- echo "before script in buildjob"
test:
stage: test
script:
- echo "test"
deploy:
stage: deploy
script:
- echo "deploy"
- sleep 5
after_script:
- echo "after script"
6. tags
用于指定特定的 job 在特定的 runner 運行,如果 job 不指定 tags,則默認在共享的 runner 運行
windows_job:
stages:
- build
tags:
-windows
script:
- echo "windows job"
linux_job:
stages:
- build
tags:
-linux
script:
- echo "linux job"
7. allow_failure
allow_failure 表示是否允許作業失敗,默認值 false 不允許失敗,改為 true 后,如果該作業失敗也不會被阻塞
job1:
stage: test
script:
- "..."
allow_failure: true
8. when
when 用于控制作業運行:
- on_success:前面階段的所有作業成功才執行該作業,默認 on_success
- on_failure:前面階段出現失敗時執行
- always:總是執行作業
- manual:手動執行作業
- delayed:延遲執行作業
job1:
stage: test
script:
- "..."
when: delayed # 表示延遲30s執行
start_in: "30"
9. retry
配置作業失敗后重試作業的次數
job1:
stage: test
script:
- "..."
retry: 2
也可以精確匹配到某一錯誤,即出現某一錯誤時才重試
job1:
stage: test
script:
- "..."
retry:
max: 2
when:
- script_failure # 腳本失敗時重試
10. timeout
作業級別的超時可以超過專案級別的超時,但不能超過 Runner 特定的超時
job1:
stage: test
script:
- "..."
timeout: 3h
11. parallel
配置要并行運行的作業的實體數,此值必須大于等于 2 并小于等于 50,這將創建 N 個并行運行的同一作業實體
job1:
stage: test
script:
- "..."
parallel: 5
12. rules
rules 允許按順序評估單個規則,直到匹配為止:
-
if:如果條件匹配,多條件匹配可以使用 && ||
variables: DOMAIN: example.com job1: stage: test script: - "..." rules: # DOMAIN值匹配,則手動運行,否則 - if: '$DOMAIN == "example.com"' when: manual - if: '$DOMAIN == "example2.com"' when: delayed start_in: '5' - when: on_success -
changes:指定檔案發生變化
job1: stage: test script: - "..." rules: - changes: - fimeName # 檔案名 when: manual - when: on_success -
exists:指定檔案存在
job1: stage: test script: - "..." rules: - exists: - fimeName # 檔案名 when: manual - when: on_success
13. workflow-rules
workfolw 關鍵字適用于整個管道,并確定是否創建管道
variables:
DOMAIN: example.com
workflow:
rules:
- if: '$DOMAIN == "example.com"'
when: always # 默認always,可以設定never
- when: never
14. cache
存盤編譯專案時所需的運行時依賴項,指定專案作業空間中需要在 job 之間快取的檔案或目錄
全域 cache 定義在 job 之外,針對所有 job 生效,job 中的 cache 優于全域
cache:
paths: # 在全域定義快取
- my/files
job:
script: "..."
cache:
key: job # 為快取設定唯一key,會為該job分配一個獨立的cache
paths: # 在job中定義快取,快取target目錄下的所有.jar檔案,該快取將覆寫全域快取
- target/*.jar
# policy: pull # pull:不下載快取,push不上傳快取,默認會在job執行之前下載快取,并在結束之后上傳快取
15. artifacts
用于指定作業成功或失敗時應附加到作業的檔案或目錄的串列,可在 Gitlab UI 中下載
build:
script:
- mvn package
artifacts:
name: "$ARTIFACTS_NAME" # 指定所創建的制品名稱,默認為artifacts,下載為artifacts.zip
paths:
- target/*.jar
when: always # 制品創建條件,on_success:作業成功時創造制品,on_failure:作業失敗時創建制品,always:總是創建制品
expire_in: 1 week # 制品有效期,從存盤到gitlab開始算起,默認30天
16. dependencies
獲取當前階段之前的制品
build:
stage: build
script:
- mvn package
artifacts:
name "$ARTIFACTS_NAME"
paths:
- target/*.jar
deploy:
dependencies:
- build
stage: deploy
script:
- ... # 部署制品
17. needs
可以讓作業無需按照階段順序運行,下述的例子表示:deploy-a 在 build-a 完成之后就可以執行,deploy-b 在 build-b 完成之后就可以執行
stages:
- build
- deploy
build-a:
stage: build
script:
- ...
build-b:
stage: build
script:
- ...
deploy-a:
stage: deploy
script:
- ...
needs: ["build-a"]
deploy-b:
stage: deploy
script:
- ...
needs: ["build-b"]
18. include
可以引入外部 yaml 檔案,使用合并功能可以自定義和覆寫本地定義的 CI/CD 配置
local
引入同一存盤庫的檔案,使用相對于根目錄的完整路徑進行參考,必須保證走到同一分支
假設有 ci/localci.yml 檔案
stages:
- deploy
deploy-job:
stage: deploy
script: ...
在 .gitlab-ci.yml 引入 ci/localci.yml 檔案,如果存在相同名稱的作業,它們的配置會進行合并,并且原檔案 .gitlab-ci.yml 的配置優先生效
include:
local: "ci/localci.yaml"
stages:
- build
- test
- deploy
build-job:
stage: build
script: ...
test-job:
stage: test
script: ...
file
引入其他專案的 yaml 配置
include:
project: demo/demo-java-service
ref: master
file: .gitlab-ci.yml
template
引入官方提供的模板,可以訪問 https://gitlab.com/gitlab-org/gitlab/tree/master/lib/gitlab/ci/templates 查看有哪些模板
include:
template: Auto-DevOps.gitlab-ci.yml
remote
引入遠程檔案
include:
remote: "https://gitlab.com/awesome-project/raw/master/.gitlab-ci-template.yml"
19. extends
繼承作業配置,相同配置覆寫,不同則繼承
.tests:
script: mvn test
stage: test
only:
refs:
- tags
test-job:
extends: .tests
script: mvn clean test
only:
variables:
- $RSPEC
最終得到的作業配置如下
test-job:
stage: test
script: mvn clean test
only:
variables:
- $RSPEC
refs:
- tags
20. trigger
當 gitlab 從 trigger 定義創建的作業啟動時,將創建一個下游管道,允許創建多專案管道和子管道:
-
多專案管道:跨多個專案設定流水線,以便一個專案的管道可以觸發另一個專案的管道
stagging: variables: ENVIROMENT: stagging # 該變數會傳遞給下游管道,如果上下游定義了相同名稱的變數,上游變數將優先 stage: deploy trigger: project: demo/demo-java-service # 指定下游專案的完整路徑 branch: master # 指定專案的分支名稱 strategy: depend # 將自身狀態從觸發的管道合并到源作業 -
父子管道:同一專案的管道可以觸發一組同時運行的子管道
子管道 ci/child.yml
stages: - build child-build-job: stage: build script: ...父管道
stages: - deploy stagging: stage: deploy trigger: include: ci/child.yml strategy: depend21
21. image
首先注冊一個作業型別為 docker 的 runner,只要使用該型別的 runner,所有運行操作都會在容器中運行
gitlab-runner register \
--non-interactive \
--executor "docker" \
--docker-image alpine:latest \ # 默認使用該鏡像
--url "http://192.168.1.200:30088/" \
--registration-token "JRzzw2j1Ji6aBjwvkxAv" \
--description "docker-runner" \
--tag-list "docker" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected"
默認注冊 runner 會指定一個基礎鏡像,如果全域指定 image 則所有作業使用該鏡像創建容器并運行,如果全域未指定 image,則查看 job 中是否有指定,有則按照 job 指定的鏡像創建容器并運行,否則使用默認鏡像
image: maven:3.6.3-jdk-8 # 全域定義
...
deploy-job:
stage: deploy
tags:
- docker
script: ...
image: maven:3.6.3-jdk-8 # 區域定義
22. services
作業期間運行的另一個 Docker 服務鏡像,將其 link 到 image 定義的 Docker 鏡像,這樣可以在構建期間訪問該服務鏡像
...
services:
- name: mysql:latest
alias: mysql
build-job:
stage: build
tags:
- docker
script: ...
image: maven:3.6.3-jdk-8 # 區域定義
23. environment
可用于在 gitlab ui 追蹤作業運行情況,
deploy-job:
stage: deploy
tags:
- docker
script: ...
environment:
name: production # 應用名稱
url: http://www.baidu.com # 應用地址
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/543635.html
標籤:其他
上一篇:破解練習-CRACKME001
下一篇:破解練習-CRACKME001
