Centos7-安装GITLAB并配置

网络配置

  • 安装虚拟机时选择NAT 网络,安装不开启本地网络(物理环境使用路由器选择桥接模式,单机或拨号上网选择NAT模式,不想用虚拟机上网则选主机模式)

  • 安装完毕后修改

    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
    cd /etc/sysconfig/network-scrips/
    ls
    # 每个人的名称不一样 前缀应该一样
    vim ifcfg-ens33
    # 自动获取IP
    dhclinet
    # 查看 IP 可以设置 ens 显示的 IP
    ip addr

    ########################### 标注修改、添加部分改动,其余全部默认 ###############

    TYPE=Ethernet
    PROXY_METHOD=none
    BROWSER_ONLY=no
    BOOTPROTO=static # 修改
    DEFROUTE=yes
    IPV4_FAILURE_FATAL=no
    IPV6INIT=yes
    IPV6_AUTOCONF=yes
    IPV6_DEFROUTE=yes
    IPV6_FAILURE_FATAL=no
    IPV6_ADDR_GEN_MODE=stable-privacy
    NAME=ens33
    UUID=ab405b3a-ac93-4f32-8f98-1c2b6f89ec9f
    DEVICE=ens33
    ONBOOT=yes # 修改
    # 添加
    IPADDR=192.168.133.128 # NAT 网关同一网段 IP 都可以进行通信
    NETMASK=255.255.255.0
    GATEWAY=192.168.133.2
    DNS1=192.168.133.2
    DNS2=144.144.144.144
    DNS3=8.8.8.8
    ####################################################################

    # 重启网络
    service network restart

    • 配置原因

      IPADDR
  • SSH 连接

    1
    2
    # 检测 SSHD 服务
    systemctl status sshd
    可运行 => 该SSHD 服务正常
    可运行
    • error

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      # 可能需要安装 
      yum install openssh-server
      # 端口占用修改
      vim /etc/sshd/sshd_config
      # 将文件中的监听端口,监听地址、开启远程登陆和密码登陆 前的 # 号去掉
      systemctl status sshd
      systemctl start sshd
      # 检测是否启动
      ps -e | grep sshd | netstat -an | grep 22
      # 防火墙问题 => 关闭 active
      systemctl status firewalld
      # 关闭防火墙
      systemctl stop firewalld
      # 关闭开机自动开启
      systemctl disable firewalld
      init 6
    • 连接

      1
      2
      3
      4
      5
      # 获取 ip
      ip addr | ipconfig(最小化安装没有该命令)
      # xproperties.. 其他工具连接方式 => 输入 root 用户即密码(安装时设定的)
      ssh root@ip:port

    • 脚本(创建一个 properties文件运行)

      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
      # 创建一个 aliyunYum.sh
      # 赋予权限 chmod 777 aliyunYum.sh
      # 添加如下能容
      #!/bin/sh
      # yum
      yum install -y wget
      mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bk
      cd /etc/yum.repos.d
      wget -nc http://mirrors.aliyun.com/repo/Centos-7.repo
      mv Centos-7.repo CentOS-Base.repo
      yum clean all
      yum list
      yum makecache
      yum update -y


      # docker
      yum list installed | grep docker
      sudo yum -y remove *.x86_64
      sudo yum install -y yum-utils
      sudo yum-config-manager \
      --add-repo \
      http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      sudo yum install -y docker-ce docker-ce-cli containerd.io

      • 验证

        验证是否被篡改
        验证

Yum源更换

  • 更换Yum

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 注意权限问题
    yum install -y wget
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bk
    cd /etc/yum.repos.d
    wget -nc http://mirrors.aliyun.com/repo/Centos-7.repo
    mv Centos-7.repo CentOS-Base.repo
    # 全部清除
    yum clean all
    # 更新列表
    yum list
    # 缓存yum包信息到本机,提高搜索速度
    yum makecache
    # 更新 yum
    yum update -y

Docker 安装

  • 删除之前版本

    1
    2
    yum list installed | grep docker
    sudo yum -y remove *.x86_64
  • 安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 安装 yum-utils
    sudo yum install -y yum-utils
    # 设置 yum 源为阿里云方便下载 Docker Engine
    sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    # 安装最新版本的 Docker Engine 和 容器
    sudo yum -y install docker-ce docker-ce-cli containerd.io

  • Docker 启动与停止

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 启动 docker
    sudo systemctl start docker
    # 停止 docker
    sudo systemctl stop docker
    # 重启 docker
    sudo systemctl restart docker
    # 设置开机启动
    sudo systemctl enable docker
    # 查看 docker 状态
    sudo systemctl status docker
    # 查看 docker 内容器运行的状态
    sudo docker stats
    # 查看 docker 概要信息
    sudo docker info
    # 查看 docker 帮助文档
  • 配置镜像加速

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 修改如下文件
    vim /etc/docker/daemon.json
    # 添加此 json
    {
    "registry-mirrors":["https://hub-mirror.c.163.com/","https://ustc-edu-cn.mirror.aliyuncs.com/"]
    }

    # 重新加载
    sudo systemctl daemon-reload
    # 重启 docker
    sudo systemctl restart docker
  • 数据卷

    1
    2
    3
    4
    # 查看该数据卷对应宿主机的目录地址
    docker volume inspect 数据卷名称
    # 数据卷挂载信息查看 Munts
    docker inspect 容器id或名称

安装GITLAB

  • 切换sshd 端口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    vim /etc/ssh/sshd_config
    # 修改 Port 22

    # 关闭 selinux
    vim /etc/selinux/config
    # 修改如下
    SELINUX=enforcing 改为 SELINUX=disable
    # 重启
    init 6
    # 检测 sshd状态
    systemctl status sshd
    # 如果sshd是关闭状态,则关闭防火墙
    systemctl stop firewalld
    # 开机禁用
    systemctl disable firewalld
    # 重启 sshd
    systemctl restart sshd

    # 修改xproperties 连接端口
    ssh root@ip:port
  • 安装docker-compose

  • gitlab

    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
    # 创建本地gitlab 存储配置文件、日志、数据等的路径
    mkdir -p ~/data/gitlab ~/data/gitlab/logs ~/data/gitlab/data
    # 拉取 gitlab
    docker pull gitlab/gitlab-ce:12.9.0-ce.0

    # 运行 gitlab
    docker run -d -p 443:443 -p 80:80 -p 22:22 --name gitlab --restart always --privileged=true -v ~/data/gitlab:/etc/gitlab/ -v ~/data/gitlab/logs:/var/log/gitlab -v ~/data/gitlab:/var/opt/gitlab gitlab/gitlab-ce:12.9.0-ce.0

    # -privileged=true 使用该参数,container内的root拥有真正的root权限。
    # docker help run

    # 进入容器内部
    docker exec -it gitlab properties
    vim /etc/gitlab/gitlab.rb
    # 编辑站点地址
    #可以访问GitLabURL。
    external_url 'http://47.104.232.247'
    # 刷新配置
    gitlab-ctl reconfigure
    # 重启服务
    # gitlab-ctl restart
    # 退出容器
    exit
    # docker 重启
    # docker restart gitlab


    #服务控制
    docker start gitlab
    docker stop gitlab
    docker rm gitlab

    # 获取运行容器名称
    docker ps -qa --format "{{.Names}}"
  • 通过绑定的ip 访问,Eg:192.168.0.128:80(默认80 注意是否被端口占用)

  • 修改密码, 登录服务器

    修改root 密码
    修改root密码
    第一次是修改root 密码,下图是修改后的
    第一次是修改root密码
  • 安装、注册runner

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # docker 安装
    docker pull gitlab/gitlab-runner:v12.9.0
    # 创建映射路径
    mkdir -p ~/data/gitlab-runner/config

    # 启动容器交互式 指定名称后期需要使用 gitlab-runner 名称
    docker run -d --name gitlab-runner --privileged=true --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v ~/data/gitlab-runner/config:/etc/gitlab-runner/config \
    -v /usr/bin/docker:/usr/bin/docker \
    -v /usr/local/maven/apache-maven-3.6.3:/usr/local/maven/apache-maven-3.6.3 \
    -v /usr/local/java/jdk1.8.0_231:/usr/local/java/jdk1.8.0_231 \
    -v /usr/local/docker-compose:/usr/local/docker-compose \
    gitlab/gitlab-runner:v12.9.0

    sudo chown root:root /var/run/docker.socks

    # 检查
    docker ps | grep gitlab-runner
    # 进入容器内部
    docker exec -it 容器id properties
    # 测试
    gitlab-runner -h
    测试环境v12.9.0 配置容器内环境变量
    测试环境 容器内环境测试
    • 认识runner 类型入口位置

      注册Runner => share
      注册Runner
      特定Runner
      特定Runner 特定
      IP(192.168.0.128:[port])/dashboard/groups => 1.创建组 2. 创建Runner
      Groups-Runner
  • GitlabRunner 类型

    1. share: 运行整个平台项目的作业(gitlab)
    2. group: 运行特定group 下的所有项目的作业(group)
    3. specific: 运行指定的项目作业()project)
    4. locked: 无法运行项目作业
    5. paused :不会运行作业
  • 交互式注册Runner

    1
    2
    # 推荐 => 执行成功了
    docker exec -it gitlab-runner gitlab-runner register
    交互式注册
    输入指定信息
  • 注册后

    share 注意勾选
    share 注意勾选
  • 非交互式注册Runner

    • Docker

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      docker run --rm -v ~/data/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:v12.9.0 register \
      --non-interactive \
      --executor "docker" \
      --docker-image alpine:latest \
      --url "http://192.168.0.128/" \
      --registration-token "sxVUoFYsF6q-JnZpKCnV" \
      --description "docker-runner" \
      --tag-list "docker,aws" \
      --run-untagged="true" \
      --locked="false" \
      --access-level="not_protected"
    • properties

      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
        # 后续测试 
      docker run -itd --rm -v ~/data/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:v12.9.0 register \
      --non-interactive \
      --executor "properties" \
      --url "http://192.168.0.129/" \
      --registration-token "1bnZNUEweD2ijpXMnCPP" \
      --description "devops-runner" \
      --tag-list "build,deploy" \
      --run-untagged="true" \
      --locked="false" \
      --access-level="not_protected"

      + 相关命令

      ```properties
      gitlab-runner list # 此命令检查注册在配置文件中的所有运行程序
      gitlab-runner verify # 此命令检查注册的 runner 是否是可以连接的,但不验证 Gitlab 服务器是否是正在使用 runner
      gitlab-runner --delete # 删除
      gitlab-runner unregister # 该命令使用 Gitlab 取消已经注册的 runner

      # 使用令牌注销
      gitlab-runner unregister --url http://192.168.0.128/ --tocken xxx

      # 使用名称注销(同名删除第一个)
      gitlab-runner unregister --name xxx
      # 注销所有
      gitlab-runner unregister --all-runners
  • 关联远程仓库

    登录页面的用户名和密码而不是Admin..
    注意用户名信息

流水线任务

  • 项目根目录下创建.gitlab-ci.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    stages:
    - test

    test:
    stage: test
    script:
    - echo first build ci
    - /usr/local/maven_home/apache-maven-3.6.3/bin/mvn package
    - cp target/gitlab-ci-1.0-SNAPSHOT.war docker/coder-itl.war
    - docker-compose down
    - docker-compose up -d --build

  • 流水线语法检测

    流水线语法检测
    流水线语法检测

GitlabRunner 使用Maven

  • 错误

    解决前 解决后
    解决前,未在容器内配置环境变量生效 解决后
  • 解决方案

    1. 检测宿主机 maven,java 等的环境变量是否生效
    检测所需环境
    检测所需环境
    1. 获取环境变量所在路径

      获取路径
      获取路径
    2. 重新启动容器并添加对应文件数据卷路径

      1. 或者重新启动gitlab-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
        27
        28
        29
        30
        31
        32
        # 查看正在运行的容器
        docker ps
        # 停止容器
        docker stop 上述获取的容器id
        # 删除容器
        docker rm 上述获取的容器id

        # 参数解释 gitlab-runner => properties 权限比较低
        # 将宿主机的 maven、java 环境映射到 docker 内 前面是系统(宿主机)相关环境变量位置:后面是docker内映射路径
        # 添加 maven 环境
        -v /usr/local/maven/apache-maven-3.6.3:/usr/local/maven/apache-maven-3.6.3
        # 添加Jdk环境
        -v /usr/local/java/jdk1.8.0_231:/usr/local/java/jdk1.8.0_231 \
        # 添加 docker-compose的环境变量路径
        -v /usr/local/docker-compoe:/usr/local/docker-compoe


        # 启动容器交互式 指定名称后期需要使用 gitlab-runner 名称 数据卷问题困扰,可以将文件放在默认数据卷路径下
        # TODO: 数据卷如何进行附加添加文件路径 Eg:对已经创建运行的容器单独添加数据卷路径指定操作
        docker run -d --name gitlab-runner --privileged=true --restart always \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -v /etc/gitlab-runner \
        -v /usr/local/maven/apache-maven-3.6.3:/usr/local/maven/apache-maven-3.6.3 \
        -v /usr/local/java/jdk1.8.0_231:/usr/local/java/jdk1.8.0_231 \
        -v /usr/local/docker-compoe:/usr/local/docker-compoe \
        gitlab/gitlab-runner:v12.9.0

        # gitlab-runner:v12.9.0 容器名称 和 版本号

        # 交互式注册
        docker exec -it gitlab-runner gitlab-runner register

      2. 配置所需环境变量

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      # 进入容器内
      docker exec -it 容器id properties
      # 配置容器内 maven,java 环境变量
      vim /etc/profile
      # 填写下面内容 系统内和docker都配置
      JAVA_HOME=/usr/local/java/jdk1.8.0_231
      JRE_HOME=/usr/local/java/jdk1.8.0_231/jre
      MAVEN_HOME=/usr/local/maven/apache-maven-3.6.3
      export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin:$PATH
      export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      # 使其生效
      source /etc/profile
      # 容器内检测环境是否生效
      mvn -version

      1. 测试一个maven 项目

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        stages:
        - test

        test:
        stage: test
        script:
        - echo first build ci
        - /usr/local/maven/apache-maven-3.6.3/bin/mvn package # 注意环境变量位置
        - cp target/gitlab-ci-1.0-SNAPSHOT.war docker/coderitl.war
        - docker-compose down
        - docker-compose up -d --build
        - docker rmi $(docker images -qf dangling=true)

        mvn 项目 mvn 项目运行结果
        mvn项目 mvn项目运行结果
      2. 配置容器内的maven镜像本地存储库

      3. 测试Maven=>JavaWeb 项目

        完整流程

Docker in Docker

  • 错误信息

    Docker not Found

  • 启动gitlab-runner 时,添加参数

    1
    --privileged=true 
  • 成功运行JavaWeb 项目构建

    JavaWeb 项目构建
    JavaWeb项目构建

资源访问

  • Tomcat 端口需要了解

  • IP:8080/Dockerfile中复制的xx.war 就是项目访问路径

    项目访问 输出
    项目访问 解决之前虽然运行,但是存在错误

job、script、stages

  • job

    在每个项目中,使用名为.gitlab-ci.yml YAML 文件配置Gitlab CI / CD 管道,在文件中可以定义多个或一个作业job,每个作业必须具有唯一的名称(不能使用关键字),每个作业是独立的,作业定义了在约束条件下进行相关操作,每个作业至少要包含一个script

  • script

    1
    2
    3
    4
    5
    6
    7
    8
    job:
    script:
    - command x
    - connmand
    - ...

    正则字符需要使用单|双引号 包裹

  • before_script

    用于定义一个命令,该命令在每个作业之前运行,必须是一个数组。指定的script 与主脚本中指定的任何脚本串联在一起,,并在单个properties 中一起执行

    before_script 失败导致整个作业失败,其他作业将不在执行.作业失败不会影响after_script 运行

  • after_script

    用于定义将在每个作业(包括失败的作业)之后运行的命令

    必须是一个数组

  • stages

    用于定义可以使用的阶段,并且是全局定义的

    同一阶段的作业并行运行,不同节点按顺序执行

    1
    2
    3
    4
    5
    stages:
    - build
    - test
    - codescan
    - deploy
  • .pre & .post

    1
    2
    3
    4
    5
    6
    7
    .pre 始终是整个管道的第一个运行阶段
    .post始终是整个管道的最后一个运行阶段
    用户定义的阶段都在两者之间运行

    .pre .post 的顺序无法更改
    如果管道仅包含 .pre .post 阶段的作业,则不会创建管道

  • 测试

    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
    40
    41
    42
    43
    44
    45
    46
    before_script:
    - echo "before-script"
    # 定义全局变量
    variables:
    DOMAIN: example.com
    # 阶段(顺序执行)
    stages:
    - build # 构建阶段
    - test # 测试阶段
    - codescan
    - deploy

    # 独立阶段任务: 构建
    build:
    before_script:
    - echo "before_script in job"
    stage: build
    script:
    - echo "mvn clean"
    - echo "mvn install"
    - echo "$DOMAIN" # 获取全局变量
    after_script:
    - echo "after_script int buildjob"

    # 单元测试
    unitites:
    stage: test
    script:
    - echo "run test"

    # 发布
    deploy:
    stage: deploy
    script:
    - echo "hello deploy"
    - sleep 2;

    codescan:
    stage: codescan
    script:
    - echo "codescan"
    - sleep 5;

    after_script:
    - echo "after_script"
    - ech
    • 输出

      测试任务 测试任务
      测试任务 测试任务

tags、allow_failure、when、retry、timeout、parallel

  • tags

    用于指定runner

    用于从允许运行该项目的所有Runner 列表中选择特定的Runner,在Runner 注册期间,您可以指定Runner 的标签

  • allow_failure

    allow_failure 允许作业失败,默认值为false,启用后,如果作业失败,改作业将在用户界面显示橙色警告,但是,管道的逻辑流程将认为作业成功/通过,并且不会阻塞,假设所有其他作业均成功,则该作业的阶段及其管道将显示相同的橙色警告,但是,关联的提交将会被标记为通过,而不会发出警告

  • when

    • on_success 前面阶段中的所有作业都成功时才会执行,默认值

    • on_failure 当前面阶段出现失败时执行

    • always 总是执行作业

    • manual 手动执行作业

    • delayed 延迟执行作业

      1
      2
      3
      4
      5
      6
      7
      8
      9
      codescan:
      stage: codescan
      allow_failure: true
      script:
      - echo "codescan"
      - sleep 5;
      when: delayed
      start_in: '30' # 单位秒

  • retry

    • 配置在失败的情况下重试作业的次数
    • 当作业失败并配置了retry,将再次处理该作业,直到达到retry 关键字指定的次数
    • 如果retry 设置为2,并且作业在第二次运行成功(第一次重试),则不会再次重试,retry 值必须是一个整数,等于或大于0,但小于或等于2(最多两次重试,总共运行3 次)
  • timeout

    • 作业级别的超时可以超过项目级别超时,但不能超过Runner 特定的超时

      1
      2
      3
      job:
      script: echo ""
      timeout: 2 hours 30 minutes
  • parallel-并行作业

    • 配置要并行运行的作业实例数,此值必须大于或等于2 并且小于或等于50
    • 这将创建N 哥并行运行的同一作业实例,他们从job_name 1/N 依次命名

Pipeline

  • only && except 用分支策略来限制jobs 构建

    • only 定义那些分支和标签的git 项目将会被job 执行

    • except 定义那些分支和标签的git 项目不会被执行

    • 实例

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      # 独立阶段任务: 构建
      build:
      before_script:
      - echo "before_script in job"
      stage: build
      script:
      - echo "mvn clean"
      - echo "mvn install"
      - echo "$DOMAIN" # 获取全局变量
      only:
      - main # 只允许main 运行 可以匹配正则 /^*.gif$/

      限制
      限制
  • rules

    • 允许按顺序评估单个规则,直到匹配并为作业动态提供属性

    • 不能only except 组合使用

    • 可用规则

      • if 如果条件匹配

      • changes 指定文件发生变化

      • exists 指定文件存在

      • 测试实例

        1
              
  • workfly

问题总结

  • clone: 地址携带tocken 类似字符串,导致hosts 解析报错

  • gitlab 注册由于版本不同导致需要获取密码问题

  • gitlab-runneer 页面500

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # 进入 gitlab 容器内部
    # 进入控制台
    gitlab-rails console

    # 输入如下
    ApplicationSetting.current.reset_runners_registration_token!


    # Clear project tokens
    UPDATE projects SET runners_token = null, runners_token_encrypted = null;
    # Clear group tokens
    UPDATE namespaces SET runners_token = null, runners_token_encrypted = null;
    # Clear instance tokens
    UPDATE application_settings SET runners_registration_token_encrypted = null;
    # Clear key used for JWT authentication
    # This may break the $CI_JWT_TOKEN job variable:
    # https://gitlab.com/gitlab-org/gitlab/-/issues/325965
    UPDATE application_settings SET encrypted_ci_jwt_signing_key = null;
    # Clear runner tokens
    UPDATE ci_runners SET token = null, token_encrypted = null;

  • http 无法使用问题

  • mvn 权限不足问题

  • docker in docker 问题