導航
[深入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的萬用字元。 |
- gitlab ci 預定義環境變數]
- she key
- ssh key :當您的CI / CD 的 jobs 在Docker容器中執行(意味著環境已包含在內)並且您想要在私有伺服器中部署程式碼時,您需要一種訪問它的方法。這是SSH key對派上用場的地方。
- 注意這裡是用的 docker,所以請看下面的連線
- SSH keys when using the Docker executor
- Generating a new SSH key pair
- Generating a new SSH key pair 在設定ssh key之前要生成 ssh key pair 金鑰對
# 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 )
- 下載gitlab runner的 rpm 包 - 官網教程
- 安裝 gitlab runner 安裝教程
- 註冊 gitlab runner 註冊教程
- 注意:這裡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
複製程式碼
-
當新增 deploy key 時 報錯:
-
Fingerprint has already been taken, Deploy keys projects deploy key fingerprint has already been taken
-
在build之後的部署階段報錯
-
Host key verification failed.
- gitlab-runner is not in the sudoers file.This incident will be reported.的解決方法
資料
名詞解釋 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…