- GitLab与GitLab-Runner安装
- 为代码仓库指定Runner
- 配置Runner并挂载宿主机目录
- 设置CI/CD执行脚本
操作系统:Ubuntu 18.04
GitLab是代码仓库,GitLab-Runner用于运行代码提交后的自动部署脚本,以实现CI/CD。
GitLab与GitLab-Runner安装
极狐GitLab Docker 镜像 | GitLab
使用docker-compose,挂载三个目录:config, logs和data
然后将阿里云邮箱服务的配置添加进去
GitLab-Runner需要将宿主机的/var/run/docker.sock
传入,以使用docker。Runner需要一个运行环境,用来执行构建或者其他操作,该环境可以是命令行,也可以是docker容器,传入宿主机的docker配置使其可以直接调用宿主机的docker命令。
docker-compose.yml配置文件如下:
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
| version: '3.6' services: web: image: 'registry.gitlab.cn/omnibus/gitlab-jh:latest' restart: always hostname: '' environment: GITLAB_ROOT_PASSWORD: '' GITLAB_OMNIBUS_CONFIG: | # Add any other gitlab.rb configuration here, each on its own line gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtpdm.aliyun.com" gitlab_rails['smtp_port'] = 465 gitlab_rails['smtp_user_name'] = "邮箱用户@域名.com" gitlab_rails['smtp_password'] = "smtp服务密码" gitlab_rails['smtp_domain'] = "域名.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = false gitlab_rails['smtp_tls'] = true gitlab_rails['smtp_ssl'] = false gitlab_rails['gitlab_email_from'] = '同smtp_user_name' gitlab_rails['gitlab_email_display_name'] = '邮件标识符' ports: - '880:80' - '8443:443' - '822:22' volumes: - './config:/etc/gitlab' - './logs:/var/log/gitlab' - './data:/var/opt/gitlab' shm_size: '256m' runner: image: gitlab/gitlab-runner:latest restart: always volumes: - './runner/config.toml:/etc/gitlab-runner/config.toml' - '/var/run/docker.sock:/var/run/docker.sock' depends_on: - web
|
运行docker-compose up -d
,启动多个容器并分离(detach)到后台。
为代码仓库指定Runner
打开一个代码仓库,设置,CI/CD,Runner,指定Runner。这里提供的网址和注册令牌将用来注册Runner
在宿主机执行以下命令,进入Runner
1 2
| docker container ls -a # 查看容器名称,假设为gitlab-runner-1 docker exec -it gitlab-runner-1 gitlab-runner register
|
输入网址和注册令牌
选择执行器(executor),可以是docker,也可以是shell、ssh等(建议docker,运行脚本需要用到一些额外的构建依赖,可以通过指定容器来提供,如果是shell,就需要自己再安装,不太方便)
如果执行器(executor)选择了docker,接着需要选择默认的镜像,根据构建的环境来选,不知道选什么也可以写docker:latest
,之后可以在配置文件中再指定。
注册完成后回到仓库,刷新后可以看到指定的Runner。
配置Runner并挂载宿主机目录
挂载为/etc/gitlab-runner/config.toml
的配置文件中,可以看到多了刚刚注册的Runner信息:
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
| concurrent = 1 check_interval = 0
[session_server] session_timeout = 1800
[[runners]] name = "a2a920771c6a" url = "http://域名/" token = "口令" executor = "docker" [runners.custom_build_dir] [runners.cache] [runners.cache.s3] [runners.cache.gcs] [runners.cache.azure] [runners.docker] tls_verify = false image = "docker:latest" pull_policy = "if-not-present" privileged = false disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false volumes = ["/cache", "/home/deploy:/home/build/dist"] shm_size = 0
|
需要注意这里加了一句pull_policy = "if-not-present"
,避免每次执行脚本都拉取一次镜像。
这个配置就是一个配置而已,作为一个配置记录,但很有用:
当运行gitlab-runner verify
时,检查该配置文件中的runner,是否与GitLab仓库建立关系。若将该配置文件的配置项删除,则不检查。若在仓库中解除与runner的联系,则会提示is removed
。
在GitLab仓库执行CI/CD脚本时,系统通过指定的runner,找到这个配置文件,再通过这个配置文件中的内容,创建docker容器(如果executor=”docker”)。因此可以在这个地方设置宿主机runner创建的容器之间的挂载目录,用于构建完成后将文件夹拷贝到宿主机的指定目录。
设置CI/CD执行脚本
GitLab仓库,CI/CD,编辑器,默认会打开根目录下的.gitlab-ci.yml
文件进行编辑:
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
| cache: key: ${CI_PROJECT_NAME} paths: - node_modules/
stages: - build - deploy
build-job: image: node:14-alpine stage: build only: - master script: - yarn - yarn build artifacts: expire_in: 1 week paths: - dist
deploy-job: stage: deploy only: - master script: cp -r dist/* /home/build/dist/
|
经过以上设置,每次提交到主分支master,都会执行构建脚本,通过“流水线(pipeline)”可以看到执行进度和执行过程中的输出。