[部署03] gitlab-CI

woow_wu7發表於2020-03-26

導航

[深入01] 執行上下文
[深入02] 原型鏈
[深入03] 繼承
[深入04] 事件迴圈
[深入05] 柯里化 偏函式 函式記憶
[深入06] 隱式轉換 和 運算子
[深入07] 瀏覽器快取機制(http快取機制)
[深入08] 前端安全
[深入09] 深淺拷貝
[深入10] Debounce Throttle
[深入11] 前端路由
[深入12] 前端模組化
[深入13] 觀察者模式 釋出訂閱模式 雙向資料繫結
[深入14] canvas
[深入15] webSocket
[深入16] webpack
[深入17] http 和 https
[深入18] CSS-interview
[react] Hooks

[部署01] Nginx
[部署02] Docker 部署vue專案
[部署03] gitlab-CI

前置知識

一些單詞

CI - Continuous Integration 持續整合

integration:整合,結合
reference:參考
convert:轉換,轉變
consider:考慮

prior:事先,先前
familiarize:熟悉
( prior to getting started在開始之前 )
( You may want to familiarize yourself with these prior to getting started 您可能需要在開始之前熟悉這些內容 )

pipeline:管道
explain:解釋,說明
brief:簡要,短時間

indent:縮排
attention:注意
( you have to pay extra attention to indentation 您必須特別注意縮排 )

independently:獨立的 ( indent:縮排 )
instantly:立刻
necessary:必要

Specific:具體的
fundamental:基本的
( Jobs are the most fundamental element of a .gitlab-ci.yml file. job是.gitlab-ci.yml檔案的最基本元素。)

reserved:保留的
( Using reserved keywords 使用保留關鍵字 )

stuck:卡住
artifacts:工件

ssh key pair:金鑰對
recursive:遞迴
複製程式碼

Linux 一些常用命令


- which
    - which命令的作用是,在PATH變數指定的路徑中,搜尋某個系統命令的位置,並且返回第一個搜尋結果。
    - 在找到第一個符合條件的程式檔案時,就立刻停止搜尋,省略其餘未搜尋目錄。
    - 也就是說,使用which命令,就可以看到某個系統命令是否存在,以及執行的到底是哪一個位置的命令。 

- whereis name
    - 找出檔案的路徑 

- scp 
    - scp [可選引數] file_source file_target 
    - -r: 遞迴複製整個目錄 ( recursive:遞迴的意思 )
    1. 從本地複製到遠端
    scp local_file remote_ip:remote_folder
    scp local_file remote_username@remote_ip:remote_folder  指定了使用者名稱
    
- ssh-keyscan
    - 瀏覽該系統上的 ssh 共有金鑰

- ssh -T git@gitlab.com
    - 驗證gitlab上是否正確的新增了 ssh key
    
    
uname -a -------------------------------- 檢視伺服器環境
// 比如:Linux VM_0_16_centos 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux


mkdir -p -------------------------------- 遞迴建立目錄資料夾
mkdir -p a/b 建立a/b這樣關係的兩個資料夾


su 使用者名稱稱 ----------------------------- 切換使用者名稱稱
su root 切換root使用者
su gitlab-runner 切換到gitlab-root賬戶
su是 ( switch user ) 的縮寫


whoami ---------------------------------- 檢視當前登入使用者名稱
su gitlab-runner
whoami // gitlab-runner


scp ------------------------------------- 使用者複製檔案和目錄
scp 是 secure copy 的縮寫 - 安全複製
scp [可選引數] file_source file_target 
-r: 遞迴複製整個目錄 ( recursive:遞迴的意思 )
scp -r ${DIST_DIR} root@49.233.215.163:/root/d/
複製程式碼

Pipeline - 管道

一次 Pipeline 其實相當於一次構建任務,裡面可以包含多個流程,如安裝依賴、執行測試、編譯、部署測試伺服器、部署生產伺服器等流程。 任何提交或者 Merge Request 的合併都可以觸發 Pipeline

  • 一次pipeline相當於一次 ( 構建任務 ),包含多個 ( 流程 )
  • 任何 ( push提交 ) 或者 ( merge request的合併 ) 都可以 ( 觸發pipeline )
+------------------+           +----------------+
|                  |  trigger  |                |
|   Commit / MR    +---------->+    Pipeline    |
|                  |           |                |
+------------------+           +----------------+
複製程式碼

Stages - 構建階段

Stages 表示構建階段,就是上面的流程。一次 Pipeline 中可以定義多個 Stages

  • 順序:所有 Stages 會按照順序執行,即當一個 Stage 完成後,下一個 Stage 才會開始
  • 成功:只有當所有 Stages 完成後,該構建任務 (Pipeline) 才會成功
  • 失敗:如果任何一個 Stage 失敗,那麼後面的 Stages 不會執行,該構建任務 (Pipeline) 失敗
  • 總結:
    • 一個pipeline包含多個stage
    • 順序執行,上一個stage執行完,才能執行下一個stage
    • 所有stage成功,pipeline才成功;只要有一個stage失敗,整個pipeline就會失敗
+--------------------------------------------------------+
|                                                        |
|  Pipeline                                              |
|                                                        |
|  +-----------+     +------------+      +------------+  |
|  |  Stage 1  |---->|   Stage 2  |----->|   Stage 3  |  |
|  +-----------+     +------------+      +------------+  |
|                                                        |
+--------------------------------------------------------+
複製程式碼

Jobs - 構建的工作

Jobs 表示構建工作,表示某個 Stage 裡面執行的工作。 我們可以在 Stages 裡面定義多個 Jobs

  • 順序:相同 Stage 中的 Jobs 會 ( 並行 ) 執行
  • 成功:相同 Stage 中的 Jobs 都執行成功時,該 Stage 才會成功
  • 失敗:如果任何一個 Job 失敗,那麼該 Stage 失敗,即該構建任務 (Pipeline) 失敗
  • 總結:
    • 一個 ( Pipeline ) 包含多個 ( Stage ),一個 ( Stage ) 包含多個 ( Job )
    • ( Stage ) 中的 ( Job ) 是 ( 並行 ) 執行的 --------------------- job並行
    • ( Job ) 都成功,則 ( Stage ) 成功
    • 一個 ( Job失 ) 敗,則 ( Stage ) 失敗,則 ( Pipeline ) 失敗
+------------------------------------------+
|                                          |
|  Stage 1                                 |
|                                          |
|  +---------+  +---------+  +---------+   |
|  |  Job 1  |  |  Job 2  |  |  Job 3  |   |
|  +---------+  +---------+  +---------+   |
|                                          |
+------------------------------------------+
複製程式碼

YAML語言基礎

  • yaml 是專門用來寫配置檔案的語言,需要注意的就是縮排
  • # 表示註釋,從這個字元一直到行尾,都會被解析器忽略。
  • 資料結構有三種:物件陣列純量
(1) 純量 - 單個的、不可再分的值
- 字串 布林值 整數 浮點數 Null 時間 日期
- null:用~表示
    - parent: ~ 
    - 轉化為js ----------------------------- { parent: null }
- 字串
    - 如果字串之中包含 ( 空格 ) 或 ( 特殊字元 ),需要放在 ( 引號 ) 之中
    - str: '內容: 字串'
    - 轉化為js ----------------------------- { parent: null }
    - 單引號和雙引號都可以使用,雙引號不會對特殊字元轉義
    - 多行字串可以使用 ( | ) 保留換行符,也可以使用 ( > ) 摺疊換行。
    - ( + ) 表示保留文字塊末尾的換行,( - ) 表示刪除字串末尾的換行。
- 引用
    - ( & ) 錨點
    - ( * ) 別名,注意:* 是用來引用的 -------------------------------- 即*號表示&代表的內容
    - ( & ) 用來建立錨點(defaults),( << ) 表示合併到當前資料,( * ) 用來引用錨點。
defaults: &defaults --------------------------------------------------- &
  adapter:  postgres
  host:     localhost
development:
  database: myapp_development
  <<: *defaults ------------------------------------------------------- *
test:
  database: myapp_test
  <<: *defaults
等同於
defaults:
  adapter:  postgres
  host:     localhost
development:
  database: myapp_development
  adapter:  postgres ------------------------------------------------- * 表示 & 代替的內容
  host:     localhost
test:
  database: myapp_test
  adapter:  postgres
  host:     localhost
  
  
  
(2) 物件
animal: pets
轉化為js ----------------------------------- { animal: 'pets' }



(3) 陣列 - 一組連詞線開頭的行,構成一個陣列
- Cat
- Dog
- Goldfish
轉化為js ------------------------------------ [ 'Cat', 'Dog', 'Goldfish' ]
-
 - Cat
 - Dog
 - Goldfish
轉化為js ----------------------------------- [ [ 'Cat', 'Dog', 'Goldfish' ] ]



(4) 複合結構
languages:
 - Ruby
 - Perl
 - Python 
websites:
 YAML: yaml.org 
 Ruby: ruby-lang.org 
 Python: python.org 
 Perl: use.perl.org 
轉化為js
{ languages: [ 'Ruby', 'Perl', 'Python' ],
  websites: 
   { YAML: 'yaml.org',
     Ruby: 'ruby-lang.org',
     Python: 'python.org',
     Perl: 'use.perl.org' 
   } 
}
複製程式碼

RPM包

  • .rpm 檔案
  • 命名規則:<name>-<version>-<release>.<arch>.rpm
    • name:表示包的名稱,包括主包名和分包名
    • version:表示包的版本資訊
    • release:用於標識rpm包本身的發行號,可還包含適應的作業系統
    • arch: 表示主機平臺,noarch表示此包能安裝到任何平臺上,和架構無關

sshpass

  • sshpass是一個簡單的,輕量級的命令列工具。
  • 安裝:yum install -y sshpass
  • 安裝:apt-get install -y sshpass
  • 常用操作如下
1. 連線本地主機
sshpass -p xxxx ssh xxx@xxx
sshpass -p {密碼} ssh {使用者名稱}@{主機ip}

2. 連線遠端主機
sshpass -p {密碼} ssh -p {埠號} {使用者名稱}@{主機ip}

3. 讀取檔案中的密碼連線遠端主機
sshpass -f {密碼文字檔案} ssh {使用者名稱}@{主機IP} 

4. 從遠端主機拷貝取目錄到本地 !!!
sshpass -p {密碼} scp {使用者名稱}@{主機}:{遠端目錄} {本地目錄或者檔案}

5. 從本地拷貝到遠端 !!!
sshpass -p {密碼} scp {本地目錄} {使用者名稱}@{主機}:{遠端目錄}

6. 連線遠端主機並執行命令 !!!
sshpass -p {密碼} ssh -o StrictHostKeyChecking=no {使用者名稱}@{主機IP} 要執行的命令     
// -o StrictHostKeyChecking=no :忽略密碼提示
// 如'rm -rf /tmp/test
複製程式碼

yum(centos) 和 apt-get(ubuntu) 的區別

  • yum 和 apt-get 都是包管理工具,yum主要用於centos,apt-get主要用於ubuntu
Linux系統基本分為兩大類:
1、Redhat系列:Redhat、Centos、Fedora等
2、Debian系列:Debian、Ubuntu等

 
Redhat系列
1、常見的安裝包格式為:rpm包,安裝rpm包的命令是:rpm-引數
2、包的管理工具:yum
3、支援tar包

 
Debian系列
1、常見的安裝包格式為:deb包,安裝deb包的命令是:dpkg-引數
2、包的管理工具:apt-get
3、支援tar包
複製程式碼

建立ci持續整合只需要兩個步驟

  • (一) 在專案更目錄下新建:.gitlab-ci.yml 檔案
  • (二) 安裝 gitlab runner 在伺服器上
  • 注意:gitlab runner的執行器 Executor 本文中使用的是 dokcer

(一) .gitlab-ci.yml

  • 在程式碼被push到gitlab倉庫後或者當merge-requset時,gitlab會去解析.gitlab-cli.yml檔案,呼叫相應的runner來執行pipeline中stage中的job
  • 驗證.gitlab-ci.yml是否有語法錯誤,使用 CI Lint
  • .gitlab-ci.yml檔案官網文件
  • 引數關鍵字如下表格
關鍵字 描述
script 可以用runner執行的Shell指令碼,runner需要在伺服器中安裝gitlab runner
stages 定義pipeline中的stage,( 即定義構建階段 )是一個陣列 ------------------- 所有的stage
stage 一個job的流程,預設test -------------------------------------------------- 具體的stage
variables 定義一個變數
image 使用docker映像。也可用:image:name和image:entrypoint
tags 通過標籤管理或匹配runner,即該job用哪個runner去執行
cache 在後續執行之間應快取的檔案列表。也可用:cache:paths,cache:key,cache:untracked和cache:policy。
only 指定當前job適用的git refs(分支、Tag)列表 ----------- 分支,變數,change等
except 除了git的哪些分支,其他都使用該job ----------------- 分支,變數,change等
artifacts 將這個job生成的依賴傳遞給下一個job
用於在不同 stage 之間傳遞結果,通用的做法是將 build 階段打包出來的檔案定義為 artifacts,這樣在 deploy 階段就可以直接使用了

expire_in
: artifacets 的過期時間,因為這些資料都是儲存在 Gitlab 機器上的,過於久遠的資源就可以刪除掉了
paths:路徑是相對於專案目錄($ CI_PROJECT_DIR)的,不能直接在其外部連結。 可以使用遵循萬用字元模式和filepath.Match的萬用字元。
# image: docker 映象 這裡選擇node映象
image: node

# 定義變數
variables: 
  CENTOS_IP: 'root@49.233.215.163'

# 快取
cash:
  path:
    - node_modules/

# statges: 構建的所有階段,一個陣列 states
# state: 也可以在具體的每個job中使用 stage
stages:
  - echo
  - build
  - deploy

echo-statge:
  stage: echo
  tags:
    - dockernoderunner
  only:
    - master
  script:
    echo ${CI_COMMIT_SHA}
    echo ${CI_PROJECT_NAME}
    echo ${CI_PROJECT_NAMESPACE}
    echo ${CI_PROJECT_PATH}
    echo ${CI_PROJECT_URL}
    echo ${GITLAB_USER_NAME}
    echo ${GITLAB_USER_EMAIL}
    echo ${CI_PROJECT_DIR}
    echo ${CI_PIPELINE_ID}
    echo ${CI_COMMIT_REF_NAME}

# build-stage: 具體的每個job的名稱,可以隨便取,是一個物件
build-stage:
  # stage:需要和stages中的陣列中的值對應
  stage: build
  # tags:要和註冊runner時填寫的tag對應,用來針對不同的job,執行不同的runner
  tags:
    - dockernoderunner
  script:
    - npm install --registry=https://registry.npm.taobao.org
    - npm run build --registry=https://registry.npm.taobao.org
  # only:這裡表示只在master分支上 push或者merge等生效
  only:
    - master
  # artifacts:工件,表示將這個job傳遞給下一個job,這裡傳遞dist資料夾
  artifacts:
    # expire_in:過期時間
    expire_in: 1 week
    paths:
      # 可以在 setting -> CI/CD -> Variables 中設定,提高安全性
      # - ${DIST_DIR} 這樣寫也是可以的
      - $DIST_DIR

deploy-stage:
    stage: deploy
    only:
      - master
    tags:
      - dockernoderunner
    before_script:
      # 在執行script 需要設定ssh免密登陸
      # 還要建立 SSH_PRIVATE_KEY 變數
      - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
      - eval $(ssh-agent -s)
      - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
      - mkdir -p ~/.ssh
      - chmod 700 ~/.ssh
      - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
      - chmod 644 ~/.ssh/known_hosts
      ##
      ## You can optionally disable host key checking. Be aware that by adding that
      ## you are susceptible to man-in-the-middle attacks.
      ## WARNING: Use this only with the Docker executor, if you use it with shell
      ## you will overwrite your user's SSH config.
      ##
      # - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
      # - ssh -p22  root@49.233.215.163
    script:
      # - ssh -p22  root@49.233.215.163
      # - sshpase -p ${PASSWORD} ssh -p 22 root@49.233.215.163
      # - yum -y install sshpass
      - apt-get update
      - apt-get install -y sshpass
      - sshpass -p ${PASSWORD} scp -r ${DIST_DIR} root@49.233.215.163:/root/d/
      # [ssh key](https://docs.gitlab.com/ee/ci/ssh_keys/README.html)
      # - 當您的CI / CD 的 jobs 在Docker容器中執行(意味著環境已包含在內)並且您想要在私有伺服器中部署程式碼時,您需要一種訪問它的方法。這是SSH key對派上用場的地方。 
      # [Generating a new SSH key pair](https://docs.gitlab.com/ee/ssh/README.html#generating-a-new-ssh-key-pair) 在設定ssh key之前要生成 ssh key pair 金鑰對

      # 拷貝檔案到伺服器後,就可以用 nginx 容器做資料卷對映,從而啟動最新程式碼的服務

複製程式碼

(二) gitlab runner

(1) 在( CentOS Linux ) 上下載和安裝 ( gitlab runner )

  1. 下載gitlab runner的 rpm 包 - 官網教程
  2. 安裝 gitlab runner 安裝教程
  3. 註冊 gitlab runner 註冊教程
  4. 注意:這裡runner的執行器選擇的是 docker - image是node
下載


1. 下載gitlab runner的 rmp 包

// curl -LJO https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_<arch>.rpm

curl -LJO https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_amd64.rpm

  // curl:命令是一個利用URL規則在命令列下工作的檔案傳輸工具,它支援檔案的上傳和下載
  // -L/--location:跟蹤重定向
  // -J:
  // -O/--remote-name:把輸出寫到該檔案中,保留遠端檔案的檔名
  // <arch>:表示主機平臺
  // 注意:如果下載很慢,window平臺可以在本地下載好後使用xshell和xftp直接託到伺服器上
  // 注意:我這裡用的是騰訊雲伺服器

複製程式碼
安裝


2. 安裝 gitlab runner的 rmp 包
rpm -i gitlab-runner_amd64.rpm


安裝報錯:
error: Failed dependencies: git is needed by gitlab-runner-12.8.0-1.x86_64


解決辦法:加上 --nodeps --force
rpm -i gitlab-runner_amd64.rpm --nodeps --force
// 如果沒有git,請安裝
複製程式碼
註冊


註冊Runner是將Runner與GitLab例項繫結的過程


3. 在註冊gitlab runner前需要做兩件事情
(1) 安裝Doker,並啟動
- 安裝docker
- docker pull node
- docker run -id --name=node_c1 node
(2) 在gitlab專案中獲取token
- gitlab專案 -> setting -> CI/CD -> Runners



4. 註冊 Gitlab Runner
gitlab-runner register
這裡可以使用互動式,也可以使用非互動式

1. Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://gitlab.com/
2. Please enter the gitlab-ci token for this runner
_GAFfSTQcz57k-hWzowr
3. Please enter the gitlab-ci description for this runner
runner-test
4. Please enter the gitlab-ci tags for this runner (comma separated):
tag-test
5. Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
docker
6. Please enter the Docker image (eg. ruby:2.6):
node
複製程式碼

[部署03] gitlab-CI

[部署03] gitlab-CI

[部署03] gitlab-CI

[部署03] gitlab-CI

[部署03] gitlab-CI

[部署03] gitlab-CI

  • 當新增 deploy key 時 報錯:

  • Fingerprint has already been taken, Deploy keys projects deploy key fingerprint has already been taken

    [部署03] gitlab-CI

  • 在build之後的部署階段報錯

  • Host key verification failed.

[部署03] gitlab-CI

  • gitlab-runner is not in the sudoers file.This incident will be reported.的解決方法
    [部署03] gitlab-CI

資料

名詞解釋 juejin.im/post/5b4703…
一個簡單的 .gitlab-ci.yml檔案配置 segmentfault.com/a/119000001…
部署一個簡單的vue專案 www.jianshu.com/p/4bbef46a2…
.rpm檔案掃盲 www.jianshu.com/p/27ebb82d2…
gitlab runner安裝教程 www.jianshu.com/p/1c1ecd3ce…
gitlab runner安裝的具體步驟:juejin.im/post/5c227a…
curl命令:www.jianshu.com/p/07c4dddae…
.gitlab-ci.yml關鍵字 blog.didiyun.com/index.php/2…
.gitlab-ci.yml關鍵字詳解 cloud.tencent.com/developer/a…

【可用的yml配置文】blog.csdn.net/BalaBalaYi/…
【可用的yml配置檔案】juejin.im/post/5d8ae8…
【】juejin.im/post/5b0396…
【可用的yml配置檔案】juejin.im/post/5d074d…
【可用的yml配置檔案】segmentfault.com/a/119000002…
【】www.jqhtml.com/50142.html

sshpass常用命令 linux.51yip.com/search/sshp…

相關文章