Contents

Gitlab

Gitlab

版本介绍

gitlab分社区版和企业版,与其他企业版软件不同的是,社区版和企业版都不收费,都可以免费使用

官方文档:https://docs.gitlab.com/

授权模式

GitLab基于开源核心模型 (open core model)。即以为着Gitlab有两个版本:社区版Community Edition 和 企业版Enterprise Edition

GitLab 社区版是MIT许可的open source。 GitLab 企业版基于社区版:使用了同样的内核,但是添加了额外的功能、特性。 这是在所有权授权下。

对于所有的版本:Gitlab 所有的 javascript 源码 都是 open source 的。Gtilab 开发的所有的 javascript code 都是 MIT 授权许可。

企业版虽然是免费使用,但免费但功能跟社区版一致。

一、部署

1、包部署

1)下载安装包

清华源:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce

南京大学镜像:https://mirrors.nju.edu.cn/gitlab-ce/

gitlab安装包比较大,建议先下载到本地再安装

[root@gitlab3 ~]# ls
anaconda-ks.cfg  gitlab-ce-12.9.7-ce.0.el7.x86_64.rpm
[root@gitlab3 ~]# yum -y localinstall gitlab-ce-12.9.7-ce.0.el7.x86_64.rpm

2)配置gitlab

gitlab使用chef进行安装,配置文件为/etc/gitlab/gitlab.rb

# 配置访问地址
[root@gitlab3 ~]# vim /etc/gitlab/gitlab.rb
  29 external_url 'http://gitlab.example.com'


# 配置通知邮箱
# 官方邮箱配置示例:https://docs.gitlab.com/omnibus/settings/smtp.html
[root@gitlab1 ~]# vim /etc/gitlab/gitlab.rb 
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtphz.qiye.163.com"
gitlab_rails['smtp_port'] = 994
gitlab_rails['smtp_user_name'] = "cccccc@163.com"
gitlab_rails['smtp_password'] = "xxxxxxxxxx"
gitlab_rails['smtp_domain'] = "qiye.163.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
user['git_user_email'] = "cccc@163.com"
gitlab_rails['gitlab_email_from'] = 'cccc@163.com'
gitlab_rails['gitlab_email_reply_to'] = 'cccc@163.com'

# 配置重启服务
[root@gitlab1 ~]# gitlab-ctl stop
[root@gitlab1 ~]# gitlab-ctl reconfigure
[root@gitlab1 ~]# gitlab-ctl restart 

# 测试邮件发送
[root@gitlab1 ~]# gitlab-rails console

Notify.test_email('t@local.com','gitlab','this is test').deliver_now
                                  邮箱               主题      内容

2、docker部署

使用docker部署时建议先修改ssh端口,预留22给gitlab

docker run \
    -p 443:443 -p 80:80 -p 22:22 \
    --name gitlab \
    --volume /data/gitlab/config:/etc/gitlab \
    --volume /data/gitlab/logs:/var/log/gitlab \
    --volume /data/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:13.12.9-ce.0

docker-compose

version: '3'
services:
  gitlab:
    image: gitlab/gitlab-ce:13.12.9-ce.0
    container_name: gitlab
    restart: always
    privileged: true
    environment:
      TZ: 'Asia/Shanghai'
      GITLAB_OMNIBUS_CONFIG: |
        external_url = "http://git.local.com"        
    ports:
      - '80:80'
      - '443:443'
      - '2222:22'
    volumes:
      - '/dataDisk/gitlab/config:/etc/gitlab'
      - '/dataDisk/gitlab/logs:/var/log/gitlab'
      - '/dataDisk/gitlab/data:/var/opt/gitlab'

二、配置

1、gitlab修改url

(如果是迁移或者重新配置)

1)修改gitlab的配置文件

[root@gitlab1 ~]# vim /etc/gitlab/gitlab.rb
  30 external_url 'http://192.168.100.103'   #修改为域名或者IP

2)修改git clone的路径 查看gitlab.yml软连接的路径

[root@gitlab1 ~]# cd /opt/gitlab/embedded/service/gitlab-rails/config
lrwxrwxrwx 1 root root    43 Jun 19 15:23 gitlab.yml -> /var/opt/gitlab/gitlab-rails/etc/gitlab.yml

[root@gitlab1 config]# vim /var/opt/gitlab/gitlab-rails/etc/gitlab.yml
10   ## GitLab settings
 11   gitlab:
 12     ## Web server settings (note: host is the FQDN, do not include http://)
 13     host: 192.168.100.103    #gitlab登陆后访问的路径
 14     port: 80
 15     https: false

3)邮箱配置

官方邮箱配置示例:https://docs.gitlab.com/omnibus/settings/smtp.html

停止服务

[root@gitlab1 ~]# gitlab-ctl stop

重新配置

[root@gitlab1 ~]# gitlab-ctl reconfigure

重启服务

[root@gitlab1 ~]# gitlab-ctl restart 

测试邮件发送

[root@gitlab1 ~]# gitlab-rails console

Notify.test_email('t@local.com','gitlab','this is test').deliver_now
                                  邮箱               主题      内容

三、gitlab-runner

1、包安装

1)下载和安装

[root@gitlab1 ~]# yum -y install  https://mirror.nju.edu.cn/gitlab-runner/yum/el8-x86_64/gitlab-runner-14.8.3-1.x86_64.rpm
[root@gitlab1 ~]# yum -y install git

2)注册gitlab-runner

[root@gitlab1 ~]# gitlab-runner register \ 
	--non-interactive \
	--executor "shell" \
	--url "http://192.168.23.100/" \
	--registration-token "JRzzw2j1Ji6aBjwvkxAv" \
  	--description "xxxxx-devops-runner" \
  	--tag-list "build,deploy,runner-shell,runner" \
  	--run-untagged="true" \
  	--locked="false" \
  	--access-level="not_protected"

会要求输入gitlab的url和Token. 查找过程如下: 进入仓库->settings->CI/CD,找到Runner Settings这一项,点击Expend,即可在Setup a specific Runner manually这项中找到。

注册完后查看runner状态

进入仓库->settings->CI/CD,找到Runner Settings这一项,点击Expend,即可看到Gitlab-Runenr的运行状态

2、docker安装

version: "3"
services:
  gitrunner:
    image: 'gitlab/gitlab-runner:ubuntu-v15.8.3'
    container_name: "gitlab-runner"
    restart: always
    command: "run --user=root --working-directory=/home/gitlab-runner"
    volumes:
      - '/data/gitlab-runner/config:/etc/gitlab-runner'
      - '/data/gitlab-runner/cache:/tmp/cache'
      # - '/data/gitlab-runner/ssl:/etc/gitlab-runner/certs/'
      - '/usr/bin/docker:/usr/bin/docker'
      - '/var/run/docker.sock:/var/run/docker.sock'

注册

docker exec -it gitlab-runner gitlab-runner register --non-interactive --executor "shell" --url "http://local.com"  --registration-token "XmWa6cccc-ccccccc" --description "runner" --tag-list "docker-runner,gitlab-runner-shell,runner" --run-untagged="true"  --locked="false"  --access-level="not_protected" 

runner in docker

docker exec -it gitlab-runner gitlab-runner register --non-interactive --executor "docker" --docker-image=debian:11  --url "http://local.com"  --registration-token "XmWa6cccc-ccccccc" --description "docker-runner" --tag-list "docker-runner,gitlab-runner-docker" --run-untagged="true"  --locked="false"  --access-level="not_protected" 

3、.gitlab-ci.yml 模版

default:
  image: 'centos:7'
  before_script:
    - echo Hello World
  after_script:
    - echo end
  tags: gitlab-runner-shell # 指定gitlab runner 的tag
  cache:
    paths: [vendor/]
  DEPLOY_VARIABLE: "default-deploy"

variables:
  IMAGE: name/${CI_PROJECT_NAMESPACE}-${CI_PROJECT_NAME}

workflow:
  rules:
    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
      variables:
        DEPLOY_VARIABLE: "deploy-production"  # Override globally-defined DEPLOY_VARIABLE
    - if: $CI_COMMIT_REF_NAME =~ /feature/
      variables:
        IS_A_FEATURE: "true"                  # Define a new variable.
    - when: always 
    
stages:
  - test
  - build
  - package
  - deploy
  - cleanup

test_all:
  image: "pymicro"
  pull_policy: if-not-present
  stage: test
  services:
    - name: my-postgres:11.7
      alias: db-postgres
      pull_policy: if-not-present
      entrypoint: ["/usr/local/bin/db-postgres"]
      command: ["start"]
  veriables:
    MYSQL_DATABASE: db
    MYSQL_ROOT_PASSWORD: password
  allow_failure: true  # job 允许失败
  before_script:
    - 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )'
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
	- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
  script:
    - flake8 app
    - pytest tests
  after_script:
    - execute this after my script # 执行命令

build_image:
  image: 
    name docker:17.11
    pull_policy: always # if-not-present
    #entrypoint: ["echo hellow-world"]  #覆盖 entrypoint命令
    # command: ["start"] 覆盖command命令
  stage: build
  services:
    - name: my-postgres:11.7
      alias: db-postgres
      entrypoint: ["/usr/local/bin/db-postgres"]
      command: ["start"]
  variables:
    DOCKER_HOST: tcp://dockerd:2375
  # 缓存 binaries 中以 .apk 和 .config 文件结尾的所有文件:
  cache:
    key: binaries-cache
    paths:
      - binaries/*.apk
      - .config
  only:
    - master
  tags:
    - build
  script:
    - | 
      docker build -t ${IMAGE_TAG} -f Dockerfile .
      docker push ${IMAGE_TAG}
package_app:
  stage: build
  rules:
    - if: $CI_COMMIT_MESSAGE =~ /build-app-a/
      variables:
        GITLAB_app_NAME: gitea-drone
    - if: $CI_COMMIT_MESSAGE =~ /build-app-b/
      variables:
        GITLAB_app_NAME: gitea-drone-b
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'   
      changes:
        - Dockerfile  
      when: manual
      allow_failure: true
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      changes:
        paths:
          - Dockerfile
    - exists:
        - Dockerfile    
  before_script:
    - hello
  script:
  	- echo "${GITLAB_app_NAME}"
  after_script: 
    - echo "world"
  allow_failure:
    exit_codes:
      - 137
      - 255
  # 当Gemfile.lock有变化时候,重新生成缓存
  cache:
    key:
      files:
        - Gemfile.lock
        - package.json
    paths:
      - vendor/ruby
      - node_modules

last-job:
  stage: .post
  script:
    - echo "This job runs in the .post stage, after all other stages."


deploy_production:
  stage: deploy
  variables:
    GIT_STRATEGY: none
  needs:
    - job: test-job2
      optional: true
    - job: test-job1
  # only/except
  only: # 
    - master
    - main
    - /^issue-.*$/
    - merge_requests
    - tags
    variables:
      - $RELEASE == "staging"
    refs:
      - branches
    changes:
      - Dockerfile
      - docker/scripts/  
  allow_failure: true
  when: manual
  tags:
    - deploy-production
  script:
    - kubectl set image deploy/myproject "app=${IMAGE_TAG}" --record
  cache:
    untracked: true # 来缓存 Git 仓库中所有未跟踪的文件
    paths:
      - binaries/    
cleanup_job:
  stage: cleanup
  script:
    - cleanup after jobs
  when: always

内置变量,参考地址:https://docs.gitlab.cn/jh/ci/variables/predefined_variables.html

变量 GitLab Runner 描述
CHAT_CHANNEL 10.6 all 触发 ChatOps 命令的源聊天频道。
CHAT_INPUT 10.6 all 使用 ChatOps 命令传递的附加参数。
CHAT_USER_ID 14.4 all 触发 ChatOps 命令的用户的聊天服务用户 ID。
CI all 0.4 适用于在 CI/CD 中执行的所有作业。可用时为 true
CI_API_V4_URL 11.7 all GitLab API v4 根 URL。
CI_BUILDS_DIR all 11.10 执行构建的顶级目录。
CI_COMMIT_AUTHOR 13.11 all Name <email> 格式的提交作者。
CI_COMMIT_BEFORE_SHA 11.2 all 出现在分支或标签上的上一个最新提交。在合并请求的流水线中总是 0000000000000000000000000000000000000000
CI_COMMIT_BRANCH 12.6 0.5 提交分支名称。在分支流水线中可用,包括默认分支的流水线。在合并请求流水线或标签流水线中不可用。
CI_COMMIT_DESCRIPTION 10.8 all 提交的描述。如果标题短于 100 个字符,则消息没有第一行。
CI_COMMIT_MESSAGE 10.8 all 完整的提交消息。
CI_COMMIT_REF_NAME 9.0 all 为其构建项目的分支或标签名称。
CI_COMMIT_REF_PROTECTED 11.11 all 如果作业正在运行以获取受保护的 ref 为 true
CI_COMMIT_REF_SLUG 9.0 all CI_COMMIT_REF_NAME 小写,缩短为 63 字节,除了 0-9a-z 之外的所有内容都替换为 -。没有前导/尾随-。 在 URL、主机名和域名中使用。
CI_COMMIT_SHA 9.0 all 项目为其构建的提交修订。
CI_COMMIT_SHORT_SHA 11.7 all CI_COMMIT_SHA 的前八个字符。
CI_COMMIT_TAG 9.0 0.5 提交标签名称。仅在标签流水线中可用。
CI_COMMIT_TAG_MESSAGE 15.5 all 提交标签消息。仅在标签流水线中可用。
CI_COMMIT_TIMESTAMP 13.4 all ISO 8601 格式的提交时间戳。
CI_COMMIT_TITLE 10.8 all 提交的标题。消息的完整第一行。
CI_CONCURRENT_ID all 11.10 单个 executor 中构建执行的唯一 ID。
CI_CONCURRENT_PROJECT_ID all 11.10 单个 executor 和项目中构建执行的唯一 ID。
CI_CONFIG_PATH 9.4 0.5 CI/CD 配置文件的路径。默认为.gitlab-ci.yml。在正在运行的流水线中只读。
CI_DEBUG_TRACE all 1.7 如果 debug 日志 (跟踪) 已启用为true
CI_DEBUG_SERVICES 15.7 15.7 true 如果启用了服务容器日志,值为 true
CI_DEFAULT_BRANCH 12.4 all 项目默认分支的名称。
CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX 13.7 all 通过 Dependency Proxy 拉取镜像的顶级群组镜像前缀。
CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX 14.3 all 通过 Dependency Proxy 拉取镜像的直接群组镜像前缀。
CI_DEPENDENCY_PROXY_PASSWORD 13.7 all 通过 Dependency Proxy 拉取镜像的密码。
CI_DEPENDENCY_PROXY_SERVER 13.7 all 用于登录 Dependency Proxy 的服务器。相当于 $CI_SERVER_HOST:$CI_SERVER_PORT
CI_DEPENDENCY_PROXY_USER 13.7 all 通过 Dependency Proxy 拉取镜像的用户名。
CI_DEPLOY_FREEZE 13.2 all 仅当流水线在部署冻结窗口期间运行时才可用。可用时为 true
CI_DEPLOY_PASSWORD 10.8 all GitLab Deploy Token 的认证密码,如果项目有的话。
CI_DEPLOY_USER 10.8 all GitLab Deploy Token 的认证用户名,如果项目有的话。
CI_DISPOSABLE_ENVIRONMENT all 10.1 仅当作业在一次性环境中执行时才可用(仅为该作业创建并在执行后处理/销毁 - 除 shellssh 之外的所有 executor)。可用时为 true
CI_ENVIRONMENT_NAME 8.15 all 此作业的环境名称。 如果设置了 environment:name,则可用。
CI_ENVIRONMENT_SLUG 8.15 all 环境名称的简化版本,适合包含在 DNS、URL、Kubernetes labels 等。如果设置了 environment:name,则可用。Slug 被截断为 24 个字符。
CI_ENVIRONMENT_URL 9.3 all 此作业的环境 URL。如果设置了 environment:url,则可用。
CI_ENVIRONMENT_ACTION 13.11 all 为此作业的环境指定的操作注释。如果设置了 environment:action,则可用。可以是startpreparestop
CI_ENVIRONMENT_TIER 14.0 all 此作业的环境部署级别。
CI_RELEASE_DESCRIPTION 15.5 all 发布的描述。仅在标签流水线上可用。描述长度限制为前 1024 个字符。
CI_GITLAB_FIPS_MODE 14.10 all 实例中是否启用 FIPS 模式的配置设置。
CI_HAS_OPEN_REQUIREMENTS 13.1 all 仅当流水线的项目具有打开的需求 时才可用。可用时为 true
CI_JOB_ID 9.0 all 作业的内部 ID,在 GitLab 实例中的所有作业中是唯一的。
CI_JOB_IMAGE 12.9 12.9 运行作业的 Docker 镜像的名称。
CI_JOB_JWT 12.10 all 一个 RS256 JSON Web 令牌,用于与支持 JWT 身份验证的第三方系统进行身份验证,例如 HashiCorp’s Vault
CI_JOB_JWT_V1 14.6 all CI_JOB_JWT 相同的值。
CI_JOB_MANUAL 8.12 all 如果作业是手动启动为 true
CI_JOB_NAME 9.0 0.5 作业名称
CI_JOB_NAME_SLUG 15.4 all CI_JOB_NAME_SLUG 的小写,缩短为 63 字节,除 0-9a-z 以外的所有内容都替换为 -。没有前导/尾随的 -。在路径中使用。
CI_JOB_STAGE 9.0 0.5 作业阶段名称
CI_JOB_STATUS all 13.5 执行每个 runner 阶段时的作业状态。与 after_script 一起使用。可以是 successfailedcanceled
CI_JOB_TIMEOUT 15.7 15.7 作业超时的值。
CI_JOB_TOKEN 9.0 1.2 使用某些 API 端点进行身份验证的令牌。只要作业正在运行,令牌就有效。
CI_JOB_URL 11.1 0.5 作业详细信息 URL。
CI_JOB_STARTED_AT 13.10 all 作业开始时的 UTC 日期时间,采用 ISO 8601 格式。
CI_KUBERNETES_ACTIVE 13.0 all 仅当流水线具有可用于部署的 Kubernetes 集群时才可用。可用时为 true
CI_NODE_INDEX 11.5 all 作业集中的作业 index。仅当作业使用 parallel 时可用。
CI_NODE_TOTAL 11.5 all 此作业并行运行的实例总数。如果作业不使用 parallel,则设置为 1
CI_OPEN_MERGE_REQUESTS 13.8 all 使用当前分支和项目作为合并请求源的最多四个合并请求的逗号分隔列表。如果分支具有关联的合并请求,则仅在分支和合并请求流水线中可用。例如,gitlab-org/gitlab!333,gitlab-org/gitlab-foss!11
CI_PAGES_DOMAIN 11.8 all 托管 GitLab Pages 的配置域名。
CI_PAGES_URL 11.8 all GitLab Pages 站点的 URL。始终是 CI_PAGES_DOMAIN 的子域名。
CI_PIPELINE_ID 8.10 all 当前流水线的实例级 ID。该 ID 在实例上的所有项目中都是唯一的。
CI_PIPELINE_IID 11.0 all 当前流水线的项目级 IID(内部 ID)。此 ID 仅在当前项目中是唯一的。
CI_PIPELINE_SOURCE 10.0 all 流水线是如何触发的。可以是 pushwebscheduleapiexternalchatwebidemerge_request_eventexternal_pull_request_eventparent_pipelinetriggerpipeline
CI_PIPELINE_TRIGGERED all all 如果作业是触发的为 true。
CI_PIPELINE_URL 11.1 0.5 流水线详细信息的 URL。
CI_PIPELINE_CREATED_AT 13.10 all 创建流水线时的 UTC 日期时间,采用 ISO 8601 格式。
CI_PROJECT_DIR all all 仓库克隆到的完整路径,以及作业从哪里运行。如果设置了 GitLab Runner builds_dir 参数,这个变量是相对于 builds_dir 的值设置的。
CI_PROJECT_ID all all 当前项目的 ID。该 ID 在实例上的所有项目中都是唯一的。
CI_PROJECT_NAME 8.10 0.5 项目目录的名称。例如,如果项目 URL 是 gitlab.example.com/group-name/project-1,则 CI_PROJECT_NAMEproject-1
CI_PROJECT_NAMESPACE 8.10 0.5 作业的项目命名空间(用户名或组名)。
CI_PROJECT_NAMESPACE_ID 15.7 0.5 作业的项目命名空间 ID。
CI_PROJECT_PATH_SLUG 9.3 all $CI_PROJECT_PATH 小写,不是 a-z0-9 的字符替换为 - 并缩短为 63 字节。 在 URL 和域名中使用。
CI_PROJECT_PATH 8.10 0.5 包含项目名称的项目命名空间。
CI_PROJECT_REPOSITORY_LANGUAGES 12.3 all 仓库中使用的语言的逗号分隔的小写列表。例如ruby,javascript,html,css
CI_PROJECT_ROOT_NAMESPACE 13.2 0.5 作业的根项目命名空间(用户名或组名)。例如,如果CI_PROJECT_NAMESPACEroot-group/child-group/grandchild-group,则 CI_PROJECT_ROOT_NAMESPACEroot-group
CI_PROJECT_TITLE 12.4 all Web 界面中显示的人类可读的项目名称。
CI_PROJECT_DESCRIPTION 15.1 all Web 界面中显示的项目描述。
CI_PROJECT_URL 8.10 0.5 项目的 HTTP(S) 地址。
CI_PROJECT_VISIBILITY 10.3 all 项目可见性。可以是 internalprivatepublic
CI_PROJECT_CLASSIFICATION_LABEL 14.2 all 项目外部授权分类标记。
CI_REGISTRY_IMAGE 8.10 0.5 项目的 Container Registry 的地址。仅当为项目启用了 Container Registry 时才可用。
CI_REGISTRY_PASSWORD 9.0 all 将容器推送到项目的 GitLab Container Registry 的密码。仅当为项目启用了 Container Registry 时才可用。 此密码值与 CI_JOB_TOKEN 相同,并且仅在作业运行时有效。使用 CI_DEPLOY_PASSWORD 长期访问镜像库。
CI_REGISTRY_USER 9.0 all 将容器推送到项目的 GitLab Container Registry 的用户名。仅当为项目启用了 Container Registry 时才可用。
CI_REGISTRY 8.10 0.5 GitLab Container Registry 的地址。仅当为项目启用了 Container Registry 时才可用。 如果在镜像库配置中指定了一个值,则此变量包括一个 :port 值。
CI_REPOSITORY_URL 9.0 all 克隆 Git 仓库的 URL。
CI_RUNNER_DESCRIPTION 8.10 0.5 runner 的描述。
CI_RUNNER_EXECUTABLE_ARCH all 10.6 GitLab Runner 可执行文件的操作系统/架构。可能和 executor 的环境不一样。
CI_RUNNER_ID 8.10 0.5 正在使用的 runner 的唯一 ID。
CI_RUNNER_REVISION all 10.6 运行作业的 runner 的修订版。
CI_RUNNER_SHORT_TOKEN all 12.3 runner 的唯一 ID,用于验证新的作业请求。在 14.9 及更高版本中,令牌包含前缀,并且使用前 17 个字符。在 14.9 版本之前,使用前八个字符。
CI_RUNNER_TAGS 8.10 0.5 以逗号分隔的 runner 标签列表。
CI_RUNNER_VERSION all 10.6 运行作业的 GitLab Runner 的版本。
CI_SERVER_HOST 12.1 all GitLab 实例 URL 的主机,没有协议或端口。例如gitlab.example.com
CI_SERVER_NAME all all 协调作业的 CI/CD 服务器的名称。
CI_SERVER_PORT 12.8 all GitLab 实例 URL 的端口,没有主机或协议。例如 8080
CI_SERVER_PROTOCOL 12.8 all GitLab 实例 URL 的协议,没有主机或端口。例如 https
CI_SERVER_REVISION all all 计划作业的 GitLab 修订版。
CI_SERVER_TLS_CA_FILE all all 包含 TLS CA 证书的文件,用于在 runner 设置中设置 tls-ca-file 时验证极狐GitLab 服务器。
CI_SERVER_TLS_CERT_FILE all all 包含 TLS 证书的文件,用于在 runner 设置中设置 tls-ca-file 时验证极狐GitLab 服务器。
CI_SERVER_TLS_KEY_FILE all all 包含 TLS 密钥的文件,用于在 runner 设置中设置 tls-ca-file 时验证极狐GitLab 服务器。
CI_SERVER_URL 12.7 all GitLab 实例的基本 URL,包括协议和端口。 例如https://gitlab.example.com:8080
CI_SERVER_VERSION_MAJOR 11.4 all GitLab 实例的主版本。例如,如果版本为 13.6.1,则CI_SERVER_VERSION_MAJOR13
CI_SERVER_VERSION_MINOR 11.4 all GitLab 实例的小版本。例如,如果版本为 13.6.1,则CI_SERVER_VERSION_MINOR6
CI_SERVER_VERSION_PATCH 11.4 all GitLab 实例的补丁版本。例如,如果版本为 13.6.1,则CI_SERVER_VERSION_PATCH1
CI_SERVER_VERSION all all GitLab 实例的完整版本。
CI_SERVER all all 适用于在 CI/CD 中执行的所有作业。可用时为 true
CI_SHARED_ENVIRONMENT all 10.1 仅当作业在共享环境中执行时才可用(跨 CI/CD 调用持久化的,如 shellssh executor)。可用时为 true
GITLAB_CI all all 适用于在 CI/CD 中执行的所有作业。可用时为 true
GITLAB_FEATURES 10.6 all 可用于实例和许可证的许可功能的逗号分隔列表。
GITLAB_USER_EMAIL 8.12 all 启动流水线的用户的电子邮件,除非作业是手动作业。在手动作业中,该值是启动作业的用户的电子邮件。
GITLAB_USER_ID 8.12 all 启动流水线的用户的 ID,除非作业是手动作业。在手动作业中,该值是启动作业的用户的 ID。
GITLAB_USER_LOGIN 10.0 all 启动流水线的用户的用户名,除非作业是手动作业。在手动作业中,该值是启动作业的用户的用户名。
GITLAB_USER_NAME 10.0 all 启动流水线的用户的姓名,除非作业是手动作业。在手动作业中,该值是启动作业的用户的姓名。
TRIGGER_PAYLOAD 13.9 all webhook 负载。仅当流水线使用 webhook 触发时可用。

这些变量在以下情况下可用:

变量 GitLab Runner 描述
CI_MERGE_REQUEST_APPROVED 14.1 all 合并请求的批准状态。当合并请求批准 可用并且合并请求已被批准时为 true
CI_MERGE_REQUEST_ASSIGNEES 11.9 all 合并请求的指派人用户名的逗号分隔列表。
CI_MERGE_REQUEST_ID 11.6 all 合并请求的实例级 ID。这是 GitLab 上所有项目的唯一 ID。
CI_MERGE_REQUEST_IID 11.6 all 合并请求的项目级 IID(内部 ID)。此 ID 对于当前项目是唯一的。
CI_MERGE_REQUEST_LABELS 11.9 all 合并请求的逗号分隔标签名称。
CI_MERGE_REQUEST_MILESTONE 11.9 all 合并请求的里程碑标题。
CI_MERGE_REQUEST_PROJECT_ID 11.6 all 合并请求的项目 ID。
CI_MERGE_REQUEST_PROJECT_PATH 11.6 all 合并请求的项目路径。例如 namespace/awesome-project
CI_MERGE_REQUEST_PROJECT_URL 11.6 all 合并请求的项目的 URL。例如,http://192.168.10.15:3000/namespace/awesome-project
CI_MERGE_REQUEST_REF_PATH 11.6 all 合并请求的引用路径。例如,refs/merge-requests/1/head
CI_MERGE_REQUEST_SOURCE_BRANCH_NAME 11.6 all 合并请求的源分支名称。
CI_MERGE_REQUEST_SOURCE_BRANCH_SHA 11.9 all 合并请求的源分支的 HEAD SHA。该变量在合并请求流水线中为空。SHA 仅存在于合并结果流水线中。
CI_MERGE_REQUEST_SOURCE_PROJECT_ID 11.6 all 合并请求的源项目的 ID。
CI_MERGE_REQUEST_SOURCE_PROJECT_PATH 11.6 all 合并请求的源项目路径。
CI_MERGE_REQUEST_SOURCE_PROJECT_URL 11.6 all 合并请求的源项目的 URL。
CI_MERGE_REQUEST_TARGET_BRANCH_NAME 11.6 all 合并请求的目标分支名称。
CI_MERGE_REQUEST_TARGET_BRANCH_PROTECTED 15.2 all 合并请求的目标分支的保护状态。
CI_MERGE_REQUEST_TARGET_BRANCH_SHA 11.9 all 合并请求的目标分支的 HEAD SHA。该变量在合并请求流水线中为空。SHA 仅存在于合并结果流水线中。
CI_MERGE_REQUEST_TITLE 11.9 all 合并请求的标题。
CI_MERGE_REQUEST_EVENT_TYPE 12.3 all 合并请求的事件类型。可以是 detachedmerged_resultmerge_train
CI_MERGE_REQUEST_DIFF_ID 13.7 all 合并请求差异的版本。
CI_MERGE_REQUEST_DIFF_BASE_SHA 13.7 all 合并请求差异的基本 SHA。

四、备份与恢复

1、备份

[root@gitlab1 ~]# gitlab-rake gitlab:backup:create

使用以上命令会在/var/opt/gitlab/backups目录下创建一个名称类似为1530156812_2018_06_28_10.8.4_gitlab_backup.tar的压缩包, 这个压缩包就是Gitlab整个的完整部分, 其中开头的1530156812_2018_06_28_10.8.4是备份创建的日期

2、数据恢复

[root@gitlab1 ~]# gitlab-ctl stop unicorn
[root@gitlab1 ~]# gitlab-ctl stop sidekiq

备份文件增加777权限,并且文件需要存放在/var/opt/gitlab/backups里

[root@gitlab1 ~]# gitlab-rake gitlab:backup:restore BACKUP=1530156812_2018_06_28_10.8.4    # 输入两次yes

启动服务

[root@gitlab1 ~]# gitlab-ctl restart 

五、升级

注意:由于升级不能跨越大版本号,因此只能升级到当前大版本号到最高版本,方可升级到下一个大版本号。

gitlab的跨版本升级需要升级中间多个小版本,为了方便升级,可以基于docker升级。

version: '3'
services:
  gitlab:
    image: gitlab/gitlab-ce:12.9.7-ce.0
    container_name: gitlab
    restart: always
    privileged: true
    environment:
      TZ: 'Asia/Shanghai'
      GITLAB_OMNIBUS_CONFIG: |
        external_url = "http://git.local.com"        
    ports:
      - '80:80'
      - '443:443'
      - '2222:22'
    volumes:
      - '/dataDisk/gitlab/config:/etc/gitlab'
      - '/dataDisk/gitlab/logs:/var/log/gitlab'
      - '/dataDisk/gitlab/data:/var/opt/gitlab'
    networks:
      - gitlab

networks:
  gitlab:

数据备份

# 备份产生目录 /var/opt/gitlab/backups/
gitlab-rake gitlab:backup:create  

# 容器备份
sudo docker exec -t gitlab gitlab-rake gitlab:backup:create  

迁移

### 配置文件说明 
# 原本: /etc/gitlab/gitlab.rb  
# 容器: /data/gitlab/config/gitlab.rb  

# 授权备份文件
scp 1586766848_2020_04_13_10.3.3_gitlab_backup.tar root@10.0.0.2:/var/opt/gitlab/backups/
chown 777 /var/opt/gitlab/backups/1586766848_2020_04_13_10.3.3_gitlab_backup.tar

# 加载备份路径  默认 /var/opt/gitlab/backups
vim /data/gitlab/config/gitlab.rb
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
gitlab_rails['backup_archive_permissions'] = 0644  
gitlab_rails['backup_keep_time'] = 864000

# 重载配置
docker exec -t gitlab gitlab-ctl reconfigure

# 停止数据库进程
docker exec -t gitlab gitlab-ctl status        
docker exec -t gitlab gitlab-ctl stop puma
docker exec -t gitlab gitlab-ctl stop sidekiq
docker exec -t gitlab gitlab-ctl status        

# 恢复备份文件 (输入两次yes)
docker exec -ti gitlab bash
docker exec -t gitlab gitlab-rake gitlab:backup:restore BACKUP=1586766848_2020_04_13_10.3.3

gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce

# 重启与检测
docker exec -t gitlab gitlab-ctl restart
docker exec -t gitlab gitlab-rake gitlab:check SANITIZE=true

可能出现的问题:

公钥不受信任,要么按提示需要输入yes,要么把config也进行迁移

ssh -T git@local.com

网页访问502

在重启gitlab后访问出现502 原因是nginx用户无法访问gitlab用户的socket文件。 重启gitlab需要重新授权

[root@gitlab1 ~]# chmod -R o+x /var/opt/gitlab/gitlab-rails

关闭浏览器再重新访问

五、用户密码管理

重置管理员密码

1)gitlab-rails console

2)user = User.where(@root).first

3)user.password=‘imaus’

4)user.save!

root@9e2af9b54092:/# gitlab-rails console
--------------------------------------------------------------------------------
 GitLab:       15.1.6 (f1452cd5cf4) FOSS
 GitLab Shell: 14.7.4
 PostgreSQL:   13.6
------------------------------------------------------------[ booted in 31.01s ]
Loading production environment (Rails 6.1.4.7)
irb(main):001:0> User.all
=> #<ActiveRecord::Relation [#<User id:1 @root>]>
irb(main):002:0> user=User.where(id:1).first
=> #<User id:1 @root>
irb(main):006:0> user.password='sugar123456'
=> "sugar123456"
irb(main):007:0> user.password_confirmation='sugar123456'
=> "sugar123456"
irb(main):008:0> user.save!
=> true

关闭用户注册

Admin Area —>Settings—>General—>Sign-up restrictions