关于javascript:部署03-gitlabCI

46次阅读

共计 13422 个字符,预计需要花费 34 分钟才能阅读完成。

导航

[[深刻 01] 执行上下文](https://juejin.im/post/684490…
[[深刻 02] 原型链](https://juejin.im/post/684490…
[[深刻 03] 继承](https://juejin.im/post/684490…
[[深刻 04] 事件循环](https://juejin.im/post/684490…
[[深刻 05] 柯里化 偏函数 函数记忆](https://juejin.im/post/684490…
[[深刻 06] 隐式转换 和 运算符](https://juejin.im/post/684490…
[[深刻 07] 浏览器缓存机制(http 缓存机制)](https://juejin.im/post/684490…
[[深刻 08] 前端平安](https://juejin.im/post/684490…
[[深刻 09] 深浅拷贝](https://juejin.im/post/684490…
[[深刻 10] Debounce Throttle](https://juejin.im/post/684490…
[[深刻 11] 前端路由](https://juejin.im/post/684490…
[[深刻 12] 前端模块化](https://juejin.im/post/684490…
[[深刻 13] 观察者模式 公布订阅模式 双向数据绑定](https://juejin.im/post/684490…
[[深刻 14] canvas](https://juejin.im/post/684490…
[[深刻 15] webSocket](https://juejin.im/post/684490…
[[深刻 16] webpack](https://juejin.im/post/684490…
[[深刻 17] http 和 https](https://juejin.im/post/684490…
[[深刻 18] CSS-interview](https://juejin.im/post/684490…
[[深刻 19] 手写 Promise](https://juejin.im/post/684490…
[[深刻 20] 手写函数](https://juejin.im/post/684490…

[[react] Hooks](https://juejin.im/post/684490…

[[部署 01] Nginx](https://juejin.im/post/684490…
[[部署 02] Docker 部署 vue 我的项目](https://juejin.im/post/684490…
[[部署 03] gitlab-CI](https://juejin.im/post/684490…

[[源码 -webpack01- 前置常识] AST 形象语法树](https://juejin.im/post/684490…
[[源码 -webpack02- 前置常识] Tapable](https://juejin.im/post/684490…
[[源码 -webpack03] 手写 webpack – compiler 简略编译流程](https://juejin.im/post/684490…
[[源码] Redux React-Redux01](https://juejin.im/post/684490…
[[源码] axios ](https://juejin.im/post/684490…
[[源码] vuex ](https://juejin.im/post/684490…
[[源码 -vue01] data 响应式 和 初始化渲染 ](https://juejin.im/post/684490…
[[源码 -vue02] computed 响应式 – 初始化,拜访,更新过程 ](https://juejin.im/post/684490…
[[源码 -vue03] watch 侦听属性 – 初始化和更新 ](https://juejin.im/post/684490…
[[源码 -vue04] Vue.set 和 vm.$set ](https://juejin.im/post/684490…
[[源码 -vue05] Vue.extend ](https://juejin.im/post/684490…

[[源码 -vue06] Vue.nextTick 和 vm.$nextTick ](https://juejin.im/post/684790…

前置常识

一些单词

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/

<font color=blue>Pipeline – 管道 </font>

一次 Pipeline 其实相当于一次构建工作,外面能够蕴含多个流程,如装置依赖、运行测试、编译、部署测试服务器、部署生产服务器等流程。任何提交或者 Merge Request 的合并都能够触发 Pipeline

  • <font color=red> 一次 pipeline 相当于一次 (构建工作),蕴含多个 (流程)</font>
  • <font color=red> 任何 (push 提交) 或者 (merge request 的合并) 都能够 (触发 pipeline)</font>

    +------------------+           +----------------+
    |                  |  trigger  |                |
    |   Commit / MR    +---------->+    Pipeline    |
    |                  |           |                |
    +------------------+           +----------------+

<font color=blue>Stages – 构建阶段 </font>

Stages 示意构建阶段,就是下面的流程。一次 Pipeline 中能够定义多个 Stages

  • 程序:<font color=red> 所有 Stages 会依照程序运行,即当一个 Stage 实现后,下一个 Stage 才会开始 </font>
  • 胜利:<font color=red> 只有当所有 Stages 实现后,该构建工作 (Pipeline) 才会胜利 </font>
  • 失败:<font color=red> 如果任何一个 Stage 失败,那么前面的 Stages 不会执行,该构建工作 (Pipeline) 失败 </font>
  • 总结:

    • 一个 pipeline 蕴含多个 stage
    • 程序执行,上一个 stage 执行完,能力执行下一个 stage
    • 所有 stage 胜利,pipeline 才胜利;只有有一个 stage 失败,整个 pipeline 就会失败
    +--------------------------------------------------------+
    |                                                        |
    |  Pipeline                                              |
    |                                                        |
    |  +-----------+     +------------+      +------------+  |
    |  |  Stage 1  |---->|   Stage 2  |----->|   Stage 3  |  |
    |  +-----------+     +------------+      +------------+  |
    |                                                        |
    +--------------------------------------------------------+

<font color=blue>Jobs – 构建的工作 </font>

Jobs 示意构建工作,示意某个 Stage 外面执行的工作。咱们能够在 Stages 外面定义多个 Jobs

  • 程序:<font color=red> 雷同 Stage 中的 Jobs 会 (并行) 执行 </font>
  • 胜利:<font color=red> 雷同 Stage 中的 Jobs 都执行胜利时,该 Stage 才会胜利 </font>
  • 失败:<font color=red> 如果任何一个 Job 失败,那么该 Stage 失败,即该构建工作 (Pipeline) 失败 </font>
  • 总结:

    • 一个 (Pipeline) 蕴含多个 (Stage),一个 (Stage) 蕴含多个 (Job)
    • (Stage) 中的 (Job) 是 (并行) 执行的 --------------------- job 并行
    • (Job) 都胜利,则 (Stage) 胜利
    • 一个 (Job 失) 败,则 (Stage) 失败,则 (Pipeline) 失败
    +------------------------------------------+
    |                                          |
    |  Stage 1                                 |
    |                                          |
    |  +---------+  +---------+  +---------+   |
    |  |  Job 1  |  |  Job 2  |  |  Job 3  |   |
    |  +---------+  +---------+  +---------+   |
    |                                          |
    +------------------------------------------+

<font color=blue>YAML 语言根底 </font>

  • <font color=red>yaml 是专门用来写配置文件的语言,须要留神的就是缩进 </font>
  • # 示意正文,从这个字符始终到行尾,都会被解析器疏忽。
  • 数据结构有三种:对象 数组 纯量
(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' 
   } 
}

<font color=blue>RPM 包 </font>

  • .rpm 文件
  • <font color=red> 命名规定:<name>-<version>-<release>.<arch>.rpm</font>

    • name:示意包的名称,包含主包名和分包名
    • version:示意包的版本信息
    • release:用于标识 rpm 包自身的发行号,可还蕴含适应的操作系统
    • <font color=red>arch</font>: 示意主机平台,noarch 示意此包能装置到任何平台上,和架构无关

<font color=blue>sshpass</font>

  • sshpass 是一个简略的,轻量级的命令行工具。
  • 装置:yum install -y sshpass
  • 装置:apt-get install -y sshpass
  • 罕用操作如下

  • 连贯本地主机
    sshpass -p xxxx ssh xxx@xxx
    sshpass -p {明码} ssh {用户名}@{主机 ip}
  • 连贯近程主机
    sshpass -p {明码} ssh -p {端口号} {用户名}@{主机 ip}
  • 读取文件中的明码连贯近程主机
    sshpass -f {明码文本文件} ssh {用户名}@{主机 IP}
  • 从近程主机拷贝取目录到本地!!!
    sshpass -p {明码} scp {用户名}@{主机}:{近程目录} {本地目录或者文件}
  • 从本地拷贝到近程!!!
    sshpass -p {明码} scp {本地目录} {用户名}@{主机}:{近程目录}
  • 连贯近程主机并执行命令!!!
    sshpass -p {明码} ssh -o StrictHostKeyChecking=no {用户名}@{主机 IP} 要执行的命令
    // -o StrictHostKeyChecking=no:疏忽明码提醒
    // 如 ’rm -rf /tmp/test

<font color=blue>yum(centos) 和 apt-get(ubuntu) 的区别</font>

  • 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 继续集成只须要两个步骤

  • (一) 在我的项目更目录下新建:<font color=red>.gitlab-ci.yml</font> 文件
  • (二) 装置 <font color=red>gitlab runner</font> 在服务器上
  • 留神:gitlab runner 的执行器 Executor 本文中应用的是 <font color=red>dokcer</font>

(一) .gitlab-ci.yml

  • 在代码被 push 到 gitlab 仓库后或者当 merge-requset 时,gitlab 会去解析.gitlab-cli.yml 文件,调用相应的 runner 来执行 pipeline 中 stage 中的 job
  • 验证.gitlab-ci.yml 是否有语法错误,应用 <font color=red>CI Lint</font>
  • .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 等
<font color=red>artifacts</font> 将这个 job 生成的依赖传递给下一个 job <br/> 用于在不同 stage 之间传递后果,通用的做法是将 build 阶段打包进去的文件定义为 artifacts,这样在 deploy 阶段就能够间接应用了 <br/><font color=blue> <br/> expire_in</font>:artifacets 的过期工夫,因为这些数据都是保留在 Gitlab 机器上的,过于长远的资源就能够删除掉了
<font color=blue>paths</font>:门路是绝对于我的项目目录($ CI_PROJECT_DIR)的,不能间接在其内部链接。能够应用遵循通配符模式和 filepath.Match 的通配符。
  • gitlab ci 预约义环境变量]

    • 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)

  1. 下载 gitlab runner 的 rpm 包 – 官网教程
  2. 装置 gitlab runner 装置教程
  3. 注册 gitlab runner 注册教程
  4. 留神:这里 runner 的执行器抉择的是 docker – image 是 node

    下载
    
  5. 下载 gitlab runner 的 rmp 包

    // curl -LJO https://gitlab-runner-downloa…<arch>.rpm

    curl -LJO https://gitlab-runner-downloa…

    // 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.

    • https://blog.csdn.net/ljw1412…

  • gitlab-runner is not in the sudoers file.This incident will be reported. 的解决办法

材料

名词解释 https://juejin.im/post/684490…
一个简略的 .gitlab-ci.yml 文件配置 https://segmentfault.com/a/11…
部署一个简略的 vue 我的项目 https://www.jianshu.com/p/4bb…
.rpm 文件扫盲 https://www.jianshu.com/p/27e…
gitlab runner 装置教程 https://www.jianshu.com/p/1c1…
gitlab runner 装置的具体步骤:https://juejin.im/post/684490…
curl 命令:https://www.jianshu.com/p/07c…
.gitlab-ci.yml 关键字 https://blog.didiyun.com/inde…
.gitlab-ci.yml 关键字详解 https://cloud.tencent.com/dev…

【可用的 yml 配置文】https://blog.csdn.net/BalaBal…
【可用的 yml 配置文件】https://juejin.im/post/684490…
【】https://juejin.im/post/684490…
【可用的 yml 配置文件】https://juejin.im/post/684490…
【可用的 yml 配置文件】https://segmentfault.com/a/11…
【】https://www.jqhtml.com/50142….

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

正文完
 0