计算机 · 2021年5月23日 0

gitlab笔记

Gitlab安装

按照官网的安装步骤操作结果失败了,干脆在加入gitlab官方源后直接sudo apt-get install gitlab-ee算了,什么EXTERNAL_URL都懒得设置了,但是结果仍然是安装失败,报错信息说是gitlab-ctl reconfigure失败,于是在apt-get安装失败后再运行了一遍gitlab-ctl reconfigure,居然就神奇地装好了,真是无语。
安装好之后记得再去把gitlab的监听地址改成局域网ip,不要用127.0.0.1这个地址,不然后面设置gitlab-runner选了docker作为executor时,docker是连不上gitlab的。

Gitlab持续集成

安装好gitlab之后,还要安装gitlab-runner来执行构建、测试、部署等任务。这里注意gitlab、gitlab-runner、和docker都要按照相应官网的安装教程安装官方版本,不要用ubuntu源里自带的版本,不然会坑死你,出现一些莫名奇妙的错误,比如这个,不安装官方版本的gitlab-runner,即使你按照stackoverflow上的这个回答去改了相应文件问题也不一定会修复。
Gitlab的ci脚本编辑也是挺奇怪的,在页面上显示的样子和yml文件里的raw data数据不一样,不知道是为什么,最好是用vim等编辑器自己写好了再传上去直接使用。

选择ee版本

选择enterpise版本,不必专门选择社区版本(除非有开源洁癖),没有license的enterprise版本功能和社区版是一样的。

机器重启后gitlab不能自动启动

机器重启后,发现gitlab服务没有自己起来,

gitlab-ctl restart

fail: alertmanager: runsv not running
fail: gitaly: runsv not running
fail: gitlab-monitor: runsv not running
fail: gitlab-workhorse: runsv not running
fail: grafana: runsv not running
fail: logrotate: runsv not running
fail: nginx: runsv not running
fail: node-exporter: runsv not running
fail: postgres-exporter: runsv not running
fail: postgresql: runsv not running
fail: prometheus: runsv not running
fail: redis: runsv not running
fail: redis-exporter: runsv not running
fail: sidekiq: runsv not running
fail: unicorn: runsv not running

systemctl start gitlab-runsvdir.service

Failed to start gitlab-runsvrdir.service: Unit gitlab-runsvrdir.service not found.

systemctl status gitlab-runsvdir.service

Unit gitlab-runsvrdir.service could not be found.

也是不行的,

● gitlab-runsvdir.service – GitLab Runit supervision process
Loaded: loaded (/usr/lib/systemd/system/gitlab-runsvdir.service; enabled; ven
Active: inactive (dead)

只能手动启动,

sudo /opt/gitlab/embedded/bin/runsvdir-start

稍等几分钟后,gitlab就开始正常运作了。

机器重启后gitlab-runner不能自动启动

重启后gitlab-runner也跪了,也需要手动去起起来。

sudo gitlab-runner run

或者

sudo gitlab-runner start

不知道为啥,gitlab和gitlab-runner这两个system service是不能正常启动的。

安装后报错exit status 0

FATAL: Failed to start gitlab-runner: exit status 0

解决办法和这篇exit status 5的博客一样,原因是安装了gitlab-runner后没有装gitlab-runner的服务,需要手动安装一下。

gitlab-runner install

具体的安装参数可能需要结合实际情况设置。

设置root帐号

参考
参考

在docker中运行gitlab

因为个人电脑的性能是过剩的,而为了gitlab租一个性能好一点的vps也不划算,所以不如在自己的个人电脑上跑gitlab就好了,并且使用docker做好隔离,使用内网穿透技术和反向代理来充分利用vps的网络和节约租vps的钱。

参考

安装步骤

  1. 设置一个GITLAB_HOME环境变量
    export GITLAB_HOME=xxx
  2. 安装docker版本gitlab
   sudo docker run --detach \
     --hostname gitlab.example.com \
     --publish 443:443 --publish 80:80 --publish 22:22 \
     --name gitlab \
     --restart always \
     --volume $GITLAB_HOME/config:/etc/gitlab \
     --volume $GITLAB_HOME/logs:/var/log/gitlab \
     --volume $GITLAB_HOME/data:/var/opt/gitlab \
     gitlab/gitlab-ee:latest

gitlab迁移

从服务器迁移到本机需要考虑gitlab的迁移问题。

参考

备份步骤

  1. 执行命令进行备份
   sudo gitlab-rake gitlab:backup:create

可能备份过程中会报超时错误
生成的备份文件在/var/opt/gitlab/backups/。不过gitlab会提示gitlab.rb和gitlab-secrets.json文件没有备份,需要自己手动备份,因为这些属于敏感信息。

  1. 启动新的gitlab服务
  2. 将备份文件转至新的gitlab服务备份目录下
  3. 恢复数据
   gitlab-ctl stop unicorn
   gitlab-ctl stop sidekiq
   #BACKUP路径不带_gitlab_backup.tar这些后缀
   gitlab-rake gitlab:backup:restore BACKUP=xxx
   gitlab-ctl start

迁移后无法删除项目

迁移后遇到了无法删除项目的问题,对于删除的http请求gitlab会返回500错误。参考这个issue解决了问题:

  1. 在/var/log/gitlab/gitlab-rails/production.log文件里找报错,发现也是报一个OpenSSL::Cipher::CipherError()的错;
  2. sudo gitlab-rails dbconsole,然后UPDATE projects SET runners_token = null, runners_token_encrypted = null;,就可以删除了;

由于我的gitlab是局域网内自用,因此照着issue里的方法解决了这个问题,如果gitlab是给公司提供服务的,那么还需要查清楚原因,了解这个解决方法带来的缺陷。

gitlab-runner

  gitlab-runner unregister --url http://gitlab.example.com/ --token t0k3n

By name

  gitlab-runner unregister --name test-runner

如果有多个名字相同的runner,只会注销地一个。

注销所有的runner

  gitlab-runner unregister --all-runners

CICD

设置artifacts

rspec:
  stage: test
  script:
    - bundle install
    - rspec --format RspecJunitFormatter --out rspec.xml
  artifacts:
    reports:
      junit: rspec.xml

监听文件变化时执行构建任务

build1:
  stage: build
  only:
    refs:
      - branches
    changes:
      - "my_project/**/*"
  tags:
    - runner-tag
  script:
    - cd my_project
    - make clean
    - make t=$BUILD_TYPE
  artifacts:
      paths:
        - my_project/executable_file
      expire_in: 1 day

从Gitlab12.3开始后使用rules替代only/except:

https://stackoverflow.com/questions/42986385/how-to-run-a-specific-job-in-gitlab-ci

build1:
  stage: build
  rules:
    - if: '$build_my_project == "true"'
    - changes:
        - "my_project/**/*"

yml配置文件

.gitlab.yml这个配置文件也有坑,比如里面不能随便使用冒号,即使是echo打印一个包含冒号的字符串也不可以,因为gitlab的解析器会把这个冒号当作yml文件格式的一部分!