UzumakiItachi
首页
  • JavaSript
  • Vue

    • Vue2
    • Vue3
  • React

    • React_18
  • WebPack
  • 浏览器相关
  • 工程化相关
  • 工作中遇到的问题以及解决方案
  • Git
  • 面试
  • 学习
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 个人产出
  • 实用工具
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

UzumakiItachi

起风了,唯有努力生存。
首页
  • JavaSript
  • Vue

    • Vue2
    • Vue3
  • React

    • React_18
  • WebPack
  • 浏览器相关
  • 工程化相关
  • 工作中遇到的问题以及解决方案
  • Git
  • 面试
  • 学习
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 个人产出
  • 实用工具
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • WebPack

  • 浏览器相关

  • 工程化相关

    • 执行npm run dev的时候发生了什么
    • 仓库版本管理-standard-version
    • git版本管理以及生成changelog
    • 发布一个npm包
    • gitlab runner 免密码登录服务器
      • 前言
      • 什么是ci/cd
      • gitlab runner
        • Gitlab-Runner配置
      • 在ci过程中遇到的问题
      • 结语
    • 实现一个小程序持续集成工具
    • 使用changeset管理monorepo项目
    • pnpm+trubo打造一个极致丝滑的monorepo工程
    • 编写一个生成git提交信息的vite插件
    • 关于构建SPA项目的一些优化
    • 实现一个简易的脚手架
    • vite搭建多页面项目
    • 实现一个可自定义模板内容的脚手架
  • 工作中遇到的问题以及解决方案

  • Git

  • Vite

  • 一些小工具

  • 算法

  • 服务器

  • HTTP

  • 技术
  • 工程化相关
hanhanbuku
2023-05-04
目录

gitlab runner 免密码登录服务器

# 前言

在日常开发过程中,ci(持续集成)/cd(持续交付)是一个不可或缺的好帮手,有了他,开发者可以只专注于开发,把开发好后的构建部署一些列操作都交给ci机器人去做,大大的节省了人力成本。

# 什么是ci/cd

先回想一下我们在每次开发完成之后部署站点都会经历哪几个过程

  • 1.执行构建命令
  • 2.将构建产物复制到服务器对应目录下

这几个步骤其实都是重复的,而ci/cd就是通过一系列的脚本去机械化的完成这些操作,节省人力的同时还更不容易出错 下面就以gitlab ci举个简单的例子

# gitlab runner

gitlab中使用ci需要借助到runner

  • 安装runner
sudo apt-get install gitlab-runner
1

runner文档 (opens new window)

-注册runner

sudo gitlab-runner register
1

之后是QA式操作,按照提示语输入信息即可,可参考官网操作,需要注意: ①. gitlab host和token在你的gitlab项目上找,页面路径是:Settings >> CI/CD >> Runners

②. runner执行器选择 docker,image(镜像)输入 node:8.11.2-stretch

注册成功后,我们就能在:Settings >> CI/CD >> Runners下看到我们注册的runner

# Gitlab-Runner配置

在项目根目录下新建 .gitlab.yml文件,加入如下内容:

stages:
  - package
  - upload
  - build
  - deploy
  - notify

variables:
  REGISTRY_NAME: "registry-vpc.cn-hangzhou.aliyuncs.com/odbpo/"
  IMAGE_NAME: ${REGISTRY_NAME}${CI_COMMIT_BRANCH}_${CI_PROJECT_NAME}
  PORT: "80"
  LIMIT_CPU: "2"
  LIMIT_MEMORY: "200m"
  DEFAULT_ROUTER: "Host(`h5.dev.hunshehui.cn`)&&PathPrefix(`/cms`)"
  HEALTH_URL: "/index.html"
  CONTAINERS_NUM: 2


cache: &global_cache
  # `key`=`prefix`+`-`+`SHA(files)`
  key:
    # 判定缓存是否需要更新的文件,最多两个
    files:
      - package.json
    # 生成目录的前缀,可以不定义
    prefix: ${CI_COMMIT_BRANCH}
  paths:
    - node_modules
    - "dist/"


node-build:
  image: node:14.17.0
  stage: package
  before_script:
    - 'which ssh-agent || ( yum update -y && yum install openssh-client git -y ) '
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY_BELIFE" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - ssh-keyscan $IP_KEY_TEST_BELIFE >> ~/.ssh/known_hosts
    - chmod 644 ~/.ssh/known_hosts
  script:
    # 将镜像源设置成淘宝镜像
    - yarn config set registry https://registry.npmmirror.com
    - yarn
    - yarn run build:${CI_COMMIT_BRANCH}
    - yarn run upload:${CI_COMMIT_BRANCH}
#    - ossutil64 config -e $OSS_END_POINT -i $OSS_ACCESS_KEY_ID -k $OSS_ACCESS_KEY_SECRET
#    - ossutil64 cp -r -f dist/ oss://$OSS_BUCKET_NAME
#    - ssh-keygen
#    - ssh-copy-id -i .ssh/id_rsa.pub  root@8.222.250.20
    - scp -r ./dist/index.html root@$IP_KEY_TEST_BELIFE:/mnt/belife-work/h5/
#    - sshpass -p ZVd+KPxFMsANQp$T scp -r ./dist/index.html root@8.222.250.20:/mnt/belife-h5-app
  cache:
    <<: *global_cache
  artifacts:
    name: "$CI_COMMIT_BRANCH-$CI_COMMIT_SHORT_SHA"
    paths:
      - dist/index.html
  only:
    - dev
    - test
    - pre
    - main
  tags:
    - runner-vue-dev

notifySuccess:
  image: appropriate/curl:latest
  stage: notify
  when: on_success
  cache: {}
  script:
    - curl 'https://oapi.dingtalk.com/robot/send?access_token=80279843cd3236168a05e8f1cab5efb0df8a7a71f37cb4c61bc735bfe7c3bd47' -H 'Content-Type:application/json' -d "{\"msgtype\":\"markdown\",\"markdown\":{\"title\":\"构建通知\",\"text\":\"# [${CI_COMMIT_BRANCH}_${CI_PROJECT_NAME}](${CI_PROJECT_URL})\n---\n- 流水线:[#${CI_PIPELINE_ID}](${CI_PROJECT_URL}/-/pipelines/${CI_PIPELINE_ID})\n- 状态:<font color=#52c41a>成功</font>\n- 执行人:${GITLAB_USER_EMAIL}\"}}"
  tags:
    - runner-vue-dev
  only:
    - dev
    - test
    - main

notifyFailed:
  image: appropriate/curl:latest
  stage: notify
  when: on_failure
  cache: {}
  script:
    - curl 'https://oapi.dingtalk.com/robot/send?access_token=80279843cd3236168a05e8f1cab5efb0df8a7a71f37cb4c61bc735bfe7c3bd47' -H 'Content-Type:application/json' -d "{\"msgtype\":\"markdown\",\"markdown\":{\"title\":\"构建通知\",\"text\":\"# [${CI_COMMIT_BRANCH}_${CI_PROJECT_NAME}](${CI_PROJECT_URL})\n---\n- 流水线:[#${CI_PIPELINE_ID}](${CI_PROJECT_URL}/-/pipelines/${CI_PIPELINE_ID})\n- 状态:<font color=#f5222d>失败</font>\n- 执行人:${GITLAB_USER_EMAIL}\"}}"
  tags:
    - runner-vue-dev
  only:
    - dev
    - test
    - main

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96

这里大致介绍一下里面的一些key都是什么意思

  • stages:定义任务,可配置多个
  • variables: 定义一些变量,可在下文中使用
  • 每个job都可以指定stage,执行对应的stage时就回去执行对应的job,如上文示例中node-build指定了stage为package,那执行package这个stage的时候就回去执行node-build这个job。
  • 剩下几个关键点可以自行百度一下。相信大概看一下也能猜到是做什么的了

铺垫了这么多,下面终于可以开始进入正文了

# 在ci过程中遇到的问题

我们都知道部署是需要把最终的构建产物放到服务器上去的,那这里就不可避免的出现一个登录服务器的操作。而在ci脚本中是无法进行交互的,也就是说我们没办法去输入密码登录。那就只有想办法免密登录 在ssh协议里有一个非常经典的操作,那就是公钥密钥验证,免密登录。而本文也正式采用这个方式。其实用过gitlab的应该都知道,gitlab里有一个操作就是本机生成ssh_key,然后将他添加到gitlab中既可以免密码拉代码。我们免密登录服务器就和这个差不多

如果你的runner是不变的,那只需要在runner里生成一个ssh_key然后将这个key放到服务器的/.ssh/authorized_keys文件里即可免密登录,而我们公司的runner是从镜像里拉出来的,也就是每次都不一样,所以无法采用刚刚说的那种办法。那另外一种办法就是,在某个机器生成一个ssh_key,将他放到服务器上,然后在ci里将这个key也放到runner里,相当于runner里的key现在是已经通过验证的了。这样就可以验证通过了。

 before_script:
    - 'which ssh-agent || ( yum update -y && yum install openssh-client git -y ) '
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY_BELIFE" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - ssh-keyscan $IP_KEY_TEST_BELIFE >> ~/.ssh/known_hosts
    - chmod 644 ~/.ssh/known_hosts
 script:
    # 将镜像源设置成淘宝镜像
    - yarn config set registry https://registry.npmmirror.com
    - yarn
    - yarn run build:${CI_COMMIT_BRANCH}
    - yarn run upload:${CI_COMMIT_BRANCH}
    - scp -r ./dist/index.html root@$IP_KEY_TEST_BELIFE:/mnt/belife-work/h5/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

$SSH_PRIVATE_KEY_BELIFE就是你本机生成的ssh_key,这里将他配置到了gitlab的变量里,$IP_KEY_TEST_BELIFE是你服务器的地址,也就是ip

# 结语

以上就是本文的全部内容,文中很多概念描述的比较笼统,主旨是为了解决如何免密登录服务器这个问题,至于ci脚本的编写,以及gitlab runner的安装啥的可自行搜索一下教程。ci/cd是工程化中重要的一环,身为一个合格的前端也应该去掌握。加油!

文章参考: 使用gitlab runner ci 通过ssh部署项目到远程服务器 (opens new window);

使用gitlab runner部署项目 (opens new window);

gitlab配置ssh keys认证失败_用GitLab-Runner打造锋利的CI/CD (opens new window)

编辑 (opens new window)
上次更新: 2023/05/08, 15:54:48
发布一个npm包
实现一个小程序持续集成工具

← 发布一个npm包 实现一个小程序持续集成工具→

最近更新
01
React如何获取最新状态
12-03
02
react路由切换过度效果
11-08
03
小程序实现全局状态管理
07-09
更多文章>
Theme by Vdoing | Copyright © 2023-2025 UzumakiItachi | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式