ㅤcoderitl

V1

2022/02/15阅读:75主题:萌绿

Centos7-Gitlan-GitlabRunner

Centos7-安装 GITLAB 并配置

网络配置

  • 安装虚拟机时选择NAT,安装不开启本地网络
  • 安装完毕后修改
cd /etc/sysconfig/network-scrips/
ls
# 每个人的名称不一样 前缀应该一样
vim ifcfg-ens33

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static # 修改此处 必须是静态,后期搭建 gitlab 由于没改变,时不时 ip 自己发生变化,搞蒙了
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=442728f9-6417-486f-84a0-e97eacf6319b
DEVICE=ens33
ONBOOT=yes
# 添加如下
DNS1=8.8.8.8
DNS2=8.8.4.4

  • SSH连接
# 检测 SSHD 服务
systemctl status sshd

可运行 => 该SSHD服务正常
可运行
  • error
# 可能需要安装
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
  • 连接
# 获取 ip
ip addr  |  ipconfig(最小化安装没有该命令)
# xshell.. 其他工具连接方式 => 输入 root 用户即密码(安装时设定的)
ssh root@ip:port

Yum 源更换

  • 解析DNS
# Could not resolve host: mirrors.aliyun.com; 未知的错误时操作 直接执行,由于是后面引起
# 打开文件,编辑文件(上面提到,注意补全)
vi /etc/sysconfig/network-scripts/ifcfg-
# 增加下面的dns
DNS1=8.8.8.8
DNS2=8.8.4.4
# 重启服务
service network restart
  • 更换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包信息到本机,提高搜索速度
yum makecache
# 更新 yum
yum update -y
  • 后面找到新方案
#开放ssh、http服务
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --add-service=http --permanent

#
重载防火墙规则
sudo firewall-cmd --reload

#
 防火墙关闭
systemctl stop firewalld
systemctl disable firewalld

安装GITLAB

  • 切换sshd端口
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

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

  • gitlab

# 创建本地gitlab 存储配置文件、日志、数据等的路径
mkdir -p ~/data/gitlab/config ~/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 222:22 --name gitlab --restart always -v ~/data/gitlab/config:/etc/gitlab -v ~/data/gitlab/logs:/var/log/gitlab -v ~/data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:12.9.0-ce.0

#
 进入容器内部
docker exec -it gitlab bash
vim /etc/gitlab/gitlab.rb
# 编辑站点地址
    #可以访问GitLab的URL。
    external_url 'GENERATED_EXTERNAL_URL'
    gitlab_rails['time_zone'] = 'Asia/Shanghai'
    gitlab_rails['smtp_enable'] = true
    gitlab_rails['gitlab_shell_ssh_port'] = 222
# 刷新配置
gitlab-ctl reconfigure
# 重启服务
gitlab-ctl restart
# 退出容器
exit
# docker 重启
docker restart gitlab

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

  • 修改密码,登录服务器
修改root密码
修改root密码
第一次是修改root密码,下图是修改后的
第一次是修改root密码
  • 安装、注册runner
# docker 安装
docker pull gitlab/gitlab-runner:v12.9.0
# 创建映射路径
# mkdir -p  ~/data/gitlab/gitlab-runner/config

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

sudo chown root:root /var/run/docker.sock
docker exec -it gitlab-runner usermod -aG root gitlab-runner

#
 检查
docker ps | grep gitlab-runner
# 进入容器内部
docker exec -it 容器id bash
# 测试
gitlab-runner -h
测试环境v12.9.0 配置容器内环境变量
测试环境 容器内环境测试
  • 注册runner

    注册Runner => share
    注册Runner
    特定Runner
    特定Runner 特定
    IP/dashboard/groups => 1.创建组 2. 创建Runner
    Groups-Runner
  • GitlabRunner类型

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

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

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

  • Docker

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"
  • shell
# 后续测试
docker run -itd --rm -v ~/data/gitlab-runner/config:/etc/gitlab-runner  gitlab/gitlab-runner:v12.9.0 register \
--non-interactive \
--executor "shell" \
--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"
  • 相关命令
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

流水线任务

  • 项目根目录下创建.gitlab-ci.yml
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

  • 错误

    解决前 解决后
    提示权限不足,是完全不需要理会权限问题,就算设置后,依然读取不到mvn 解决后
  • 解决方案

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

      获取路径
      获取路径
  1. 添加数据卷

  2. 或者重新启动gitlab-runner 容器时指定数据卷

  # 查看正在运行的容器
  docker ps
  # 停止容器
  docker stop 上述获取的容器id
  # 删除容器
  docker rm 上述获取的容器id

  #
 参数解释
  # 将宿主机的 maven、java 环境映射到 docker 内 前面是系统(宿主机)相关环境变量位置:后面是docker内映射路径
  -v /usr/local/maven_home/apache-maven-3.6.3:/usr/local/maven_home/apache-maven-3.6.3
  -v /usr/local/maven_home/jdk1.8.0_231:/usr/local/maven_home/jdk1.8.0_231

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

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

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

  1. 配置所需环境变量
# 进入容器内
docker exec -it 容器id bash
# 配置容器内 maven,java 环境变量
vim /etc/profile
    # 填写下面内容 系统内和docker都配置
    JAVA_HOME=/usr/local/maven_home/jdk1.8.0_231
    JRE_HOME=/usr/local/maven_home/jdk1.8.0_231/jre
    MAVEN_HOME=/usr/local/maven_home/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项目

    stages:
      - test

    test:
      stage: test
      script:
        - echo first build ci
        - /usr/local/maven_home/apache-maven-3.6.3/bin/mvn package

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

job、script、stages

  • job

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

  • script

job:
  script:
   - command x
   - connmand
   - ...

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

  • before_script

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

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

  • after_script

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

    必须是一个数组

  • stages

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

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

stages:
  - build
  - test
  - codescan
  - deploy
  • .pre & .post
.pre 始终是整个管道的第一个运行阶段
.post始终是整个管道的最后一个运行阶段
用户定义的阶段都在两者之间运行

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

  • 测试
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延迟执行作业

      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特定的超时

      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项目不会被执行

    • 实例

# 独立阶段任务: 构建
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指定文件存在

分类:

后端

标签:

其他

作者介绍

ㅤcoderitl
V1