jyzwf / blog

在Issues里记录技术得点滴
17 stars 3 forks source link

gitlab ci 初尝试 #80

Open jyzwf opened 5 years ago

jyzwf commented 5 years ago

最近,在尝试 gitlab 的 ci,遇到了不少坑,特此记录一下

关于一些基础知识,参考 用 GitLab CI 进行持续集成

走过的坑

关于 node_modules 缓存问题

每个 job 结束之后,会把上一个 job 生成的一些文件,如果它被写入 .gitignore 中,那么下一个 job 就会使用不到上一个产生的文件,如 node_modules ,所以需要使用缓存,但也可以使用 artifacts

cache:
  key: ${CI_COMMIT_REF_SLUG}
  untracked: true
  paths:
    - node_modules/

关于注册 Runner 完之后出现 灰色的叹号

在一次注册完 Runner 之后,在 gitlab 的 Runner 上出现了 灰色的叹号,因为在执行 gitlab-runner register 时,加了一次 sudo,而 启动 Runner (gitlab-runner start) 时没有加 Sudo ,这样通过 sudo 执行的是 root 权限,生成的配置文件路径是 /etc/gitlab-runner/config.toml,用普通权限生成的配置文件路径是 ~/.gitlab-runner/config.toml,这样导致普通权限配置文件里面没有相应的配置信息,所以都加上 sudo ,就可以解决

关于注册的 Runner 删不掉问题

使用 gitlab-runner list 可以查看 Runner 的一些配置信息,主要有配置文件以及 已经注册的 Runner 列表:

image

如果我想删掉一个 Runner 可以使用 gitlab-runner unregister --url (runner 的url)--token (runner 的 token) 来删,更多删法参见 gitlab-runner unregister

但当我去删除的时候,出现了如下错误:

image

使用 gitlab-runner verify 查看这些注册的 Runner 是否可以连接到 gitlab,如果有些 runner 在gitlab 中移除了,可以使用 gitlab-runner verify --delete 在 register 列表中移除它们:

image

关于环境变量问题

当我再 linux 上安装 Runner 的时候,这时候添加了一个 gitlab-runner用户,这时候 Runner 在跑的时候,用户就是 gitlab-runner

image

而此时,我以另一个身份用户来登录,同时linux 上的 node 使用的是 n 模块来安装的,这样 node 的路径就变成了 /home/souche/n/bin/node,但此时,我的 yarn 的路径是 /usr/bin/yarn,这样 yarn 跑命令的时候就找不到 node,从而报错。这时,可以在每个 job 在跑的时候设置下环境变量即可解决,同时我也试了下在第一个 job 中设置环境变量,本以为后面的 job 能读到改变后的环境变量,但发现并不能读取,所以使用了 before_script:

before_script:
  - export PATH=/home/souche/n/bin:$PATH

此外我也试了在 /home/gitlab-runner (Runner 在跑的时候 ~ 目录对应的是 /home/gitlab-runner) 这个文件夹下的 .bashrc 直接设置环境变量:

image

image

但仍然无效,可能 Runner 跑的 并不是这里的 bash 脚本,是其自身的一套 shell

关于发布的时候 npm user 找不到问题

上面说到了 gitlab Runner 跑在 gitlab-runner 这个用户下,而此时souche 这个用户设置了 npm registry 以及 npm add user,但 Runner 在跑时,就是找不到这写注册信息。可以将 .npmrc 文件 拷到 /home/gitlab-runner下,并通过 chown 来修改文件所有者:

image

image

Host key verification failed

在发布项目文档时,使用了如下命令:

rsync --compress --verbose --checksum --archive --partial --delete-after --whole-file --exclude='.*' --human-readable ./docs/.vuepress/dist/ xxxxxx:/home/souche/projects/muji-doc",

但这样却报了如下错误:

image

然后到了 /home/gitlabe-runner 下查看 .ssh 文件,发现是空的,所以就生成一个 sshKey ,并将公钥传入到 ~/.ssh/authorized_keys 中,最后执行 cp ~/.ssh/known_hosts /home/gitlab-runner/.ssh/ 即可

最后关于使用 lerna 根据 tag 来发版问题

使用使用如下 script 来判断 lerna 发的是 latest 版还是 next 版

script:
    - yarn run build
    - if [[ $CI_COMMIT_TAG =~ "-rc." || $CI_COMMIT_TAG =~ "-beta." || $CI_COMMIT_TAG =~ "-alpha." ]]; then lerna publish from-package --dist-tag next --yes; else lerna publish from-package --yes; fi

总结

通过此次实践,学到了不少,同时也发现自己的 linux 的知识的欠缺,所以后面要加强这方面的知识。 ps:上面如有不足或者错误,欢迎沟通交流 🤣🤣😁😁😜

mehwww commented 5 years ago

image

jyzwf commented 5 years ago

@mehwww 打扰了打扰了😑😑