导航
[[深刻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/Linuxmkdir -p -------------------------------- 递归创立目录文件夹mkdir -p a/b 创立a/b这样关系的两个文件夹su 用户名称 ----------------------------- 切换用户名称su root 切换root用户su gitlab-runner 切换到gitlab-root账户su是 ( switch user ) 的缩写whoami ---------------------------------- 查看以后登录用户名su gitlab-runnerwhoami // gitlab-runnerscp ------------------------------------- 用户复制文件和目录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: localhostdevelopment: database: myapp_development <<: *defaults ------------------------------------------------------- *test: database: myapp_test <<: *defaults等同于defaults: adapter: postgres host: localhostdevelopment: database: myapp_development adapter: postgres ------------------------------------------------- * 示意 & 代替的内容 host: localhosttest: 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、包的管理工具:yum3、反对tar包 Debian系列1、常见的安装包格局为:deb包,装置deb包的命令是:dpkg-参数2、包的管理工具:apt-get3、反对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中应用 stagestages: - echo - build - deployecho-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_DIRdeploy-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
下载
下载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 --forcerpm -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 -> Runners4. 注册 Gitlab Runnergitlab-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-hWzowr3. Please enter the gitlab-ci description for this runnerrunner-test4. Please enter the gitlab-ci tags for this runner (comma separated):tag-test5. Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:docker6. 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...