gitlab-ci 接入 runner

工作流程

workflows

gitlab-ci中的概念

Pipelines

几个stage串联在一起就构成了一个pipelines。每次执行构建的时候会启动这个pipelinespipelines

Stages

定义在gitlab-ci.yml中。定义流程的阶段,是jobs的一个集合。每个jobs会在相应的stage中执行,并且这些jobs是并行执行的。stage可能定义build,test,deploy这种阶段。

Jobs

定义在gitlab-ci.yml中。是一串bash脚本,可以执行我们的编译,测试,部署等一切所需要的任务,就如同我们在本地终端中执行命令一样。
每一个Job都会重新拉取docker镜像,确保执行Job的系统是一个全新的环境。所以之前执行的Job所产生的文件都无法使用到。 如果想要使用之前Job的产物则需要是用artifacts的方式。

安装docker runner

本身gitlab中并不自带runner, 所以需要单独安装。两者通过gitlab内置的ci系统关联上, 项目仓库中的yaml配置了执行脚本,runner去执行yaml中的jobs内容。
runner可以在多种平台上安装,我这里选择docker service的安装方式。主要安装简单,直接用官方的docker image就可以了。安装步骤可以参考最后的参考链接。

关于硬盘空间的问题

很多时候安装docker后使用默认的安装路径,一般默认的系统盘大小有限,在执行runner期间会占用大量的硬盘空间,这个时候可能需要加盘,所以需要把docker默认的路径修改到新挂载的盘上。

默认docker存放在/var/lib/docker下,如果要改到/mymount下,需要修改配置/etc/docker/daemon.json。改配置文件,默认是不存在的,需要自己创建,docker服务会默认读取这个路径下的配置文件。在文件增加配置,然后重启docker服务:

{
    "graph": "/mymount"
}

注册runner

主要步骤参考最后的链接。这里说下文档中未提及到的注册的token是从哪儿来的。
登录gitlab管理员账号查看 setting => overview => runners registration token

激活项目的runner

注册好runner后还需要让我们的项目能够使用runner,还是需要在gitlab管理员账号页面enable一下。 enter edit enbalbe runner

使用场景

打包react-native adnroid

选择一个配置好android环境和Node.js的环境的镜像。然后在仓库根目录下添加.gitlab-ci.yml。添加其中加上如下类似的内容。

#############################################
# 说明
# job共享变量文件: .jobs
#############################################
# 镜像名称,默认从dockerhub.com上获取
image: dockerniko/gitlab-ci-react-native-android
# 每次执行Job前会执行的脚本
before_script:
  # 导出环境变量
  - export GRADLE_USER_HOME=`pwd`/android/.gradle
  - export ARTIFACTS_URL=${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/android/app/build/outputs/apk/app-release.apk
# 定义stage
stages:
  - build
  - deploy

# Job名称
android: 
  # Job属于哪个Stage
  stage: build
  script:
    - yarn install --ignore-engines
    - cd ./android && ./gradlew assembleRelease
  # 产物定义,这里的产物是可以被保存下来,不会因为任务执行完而被清空掉
  artifacts:
    # 要保存的目录,该目录下的东西都会被保存下来
    paths:
    - android/app/build/outputs/apk/app-release.apk
    # 保质期,1天后就失效删除
    expire_in: 1 day
  # 缓存,每次执行这个Job的时候会先尝试获取缓存,执行完后再把当前的内容缓存下来
  # 该缓存不能用于Job之间的共享,只能用于android这个Job下
  cache:
    # 会缓存git 没有tracked的文件
    untracked: true
    # 要缓存的文件的路径
    paths:
      - node_modules/
      - android/.gradle/wrapper
      - android/.gradle/caches
      - .yarn
      - ls -l
  # 执行改任务的分支,当以下分支发生变化(merge, commit)的时候会触发Job
  only:
    - develop
    - release
    - test

deploy_apk:
  stage: deploy
  script: 
  # export develop env deployment ftp address
    - echo deploy android
  only:
    - develop
    - release
    - test

gitlab上如何操作

发起merge,然后同意合并后出触发了构建(触发一次pipleline)
可以看到一行pipleline就是一次构建,其中有构建的状态,点击状态(绿色的passed)可以进入该Pipeline,产看详细的Jobs
pipelines
看到具体的Jobs,每个Job是可以点击进去查看执行的日志
Jobs
里面有从头开始执行的记录,可以查看失败的原因
terminal

关于缓存

默认在/srv/gitlab-runner/config/config.toml中可以设置缓存映射目录,如果不设置缓存会放在docker volume中。

[[runners]]
  name = "web runner"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "alpine:latest"
    privileged = false
    disable_cache = false
    volumes = ["/home/docker/gitlab_cache:/cache:rw"]
    shm_size = 0
  [runners.cache]

volumes = ["/home/docker/gitlab_cache:/cache:rw"] 第一个路径是host的路径(一般就是实际路径),第二个是映射的容器中的缓存路径。

默认每个人任务中设置的缓存是存放在容器中/cache目录下的,通过配置目录映射,可以把容器中的缓存放到另外的目录中:

[[runners]]
  name = "web runner"
  executor = "docker"
    [runners.docker]
        tls_verify = false
        image = "alpine:latest"
        privileged = false
        disable_entrypoint_overwrite = false
        oom_kill_disable = false
        disable_cache = true
        volumes = ["/runnercache:/cache:rw"]
        shm_size = 0

另外,建议把dockerdata-root修改到额外挂在的盘上,因为主盘一般比较小。只需要新建文件/etc/docker/daemon.json,增加配置:

{
  "data-root": "/your_mnt/docker"
}

相关链接参考

pipelines and jobs
git runner install
install in docker
register runners
set volume

更改加载盘

results matching ""

    No results matching ""