Tagged: gitlab

GitLab CI & GitLab Runner

概念

持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

持续集成的好处

  • 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
  • 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。

简介 & 原理

自动部署涉及了若干个角色,主要介绍如下

  • GitLab-CI
    这个是一套配合GitLab使用的持续集成系统,是GitLab自带的,也就是你装GitLab的那台服务器上就带有的。无需多考虑。.gitlab-ci.yml的脚本解析就由它来负责。
  • GitLab-Runner
    这个是脚本执行的承载者,.gitlab-ci.yml的script部分的运行就是由runner来负责的。GitLab-CI浏览过项目里的.gitlab-ci.yml文件之后,根据里面的规则,分配到各个Runner来运行相应的脚本script。这些脚本有的是测试项目用的,有的是部署用的。

GitLab简单原理图

GitLab-CI与GitLab-Runner关系示意图

Runner类型

  • Shared Runner:这种Runner(工人)是所有工程都能够用的。只有系统管理员能够创建Shared Runner
  • Specific Runner:这种Runner(工人)只能为指定的工程服务。拥有该工程访问权限的人都能够为该工程创建Shared Runner

.gitlab-ci.yml

这个是在git项目的根目录下的一个文件,记录了一系列的阶段和执行规则。GitLab-CI在push后会解析它,根据里面的内容调用runner来运行。

安装 GitLab Runner

# https://gitlab.com/gitlab-org/gitlab-runner

# For RHEL/CentOS/Fedora
sudo yum install gitlab-runner

# For RHEL/CentOS/Fedora(找不到再执行这个)
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash

注册GitLab Runner

docs:https://docs.gitlab.com/runner/register/index.html

安装好gitlab-ci-multi-runner这个软件之后,我们就可以用它向GitLab-CI注册Runner了。

向GitLab-CI注册一个Runner需要两样东西:GitLab-CI的url注册token。其中,token是为了确定你这个Runner是所有工程都能够使用的Shared Runner还是具体某一个工程才能使用的Specific Runner。

如果要注册Shared Runner,你需要到管理界面的Runners页面里面去找注册token。

如果要注册Specific Runner,你需要到项目的设置的Runner页面里面去找注册token。

# 查看帮助
gitlab-runner register -h

# 手动按提示创建
gitlab-runner register

# 一条命令执行方式
gitlab-runner register \
  --non-interactive \
  --url "https://gitlab.com/" \
  --registration-token "PROJECT_REGISTRATION_TOKEN" \
  --executor "shell" \
  --description "cbs-runner" \
  --tag-list "cbs,autopush" \
  --run-untagged \
  --locked="false" \

执行完成后,我们会在 设置 - CI/CD - Runner 下看到我们注册的Runner

Runners

运行Runner

Runner注册完成之后还不行,还必须让它运行起来,否则它无法接收到GitLab-CI的通知并且执行软件集成脚本。怎么让Runner运行起来呢?

gitlab-runner提供了这样一个命令,你可以通过他来处理。

gitlab-runner run-single --help

编写 .gitlab-ci.yml

stages:
  - pushtonewhope

pushtonewhope:
  stage: pushtonewhope
  script:
    - ./pushtonewhope.sh
  only:
    - cbs
  tags:
    - autopush

将.gitlab-ci.yml放入项目根目录,这样就ok了

Git 通过Commit关闭Issue

如果要在相同仓库关闭一个Issue(工单),可以使用下面列表中的关键词并在其后面加上Issue编号的应用(#+issue编号)。

例如一个提交信息中包含 Fixes #45 ,那么一旦这次提交被合并到默认分支,仓库中的45号issue就会自动关闭。

Issue 关键字

  • close
  • closes
  • closed
  • fix
  • fixes
  • fixed
  • resolve
  • resolves
  • resolved

如果在不同的仓库中关闭issue,可以使用 username/repository#issue_number 这样的语法。
例如,在提交信息中包含Closes example_user/example_repo#76将会关闭那个仓库的的76号issue,前提是你push到了那个仓库。

关闭多个issues

如果你在commit的开头使用多个上述关键字加issue的引用的话,你就可以关闭多个issues。
例如,This closes #34, closes #23, and closes example_user/example_repo#42将会关闭同一个仓库的34和23号issue以及 example_user/example_repo 仓库的42号issue。

Install GitLab with Docker

环境:CentOS release 6.9 (Final)

安装Docker

yum search docker
yum -y install docker-io
service docker start

# 查看版本
docker version

下载Gitlab

docker pull gitlab/gitlab-ce:latest

启动Gitlab

docker run --detach \
    --hostname gitlab.bcsytv.com \
    --publish 443:443 --publish 80:80 --publish 2222:22 \
    --name 'gitlab' \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

常用命令

# 列出所有容器 
docker ps -a

# 列出最近一次启动的container
docker ps -l 

# 显示一个运行的容器里面的进程信息
docker top Name/ID  

# 查看容器内部详情细节
docker inspect <id/container_name>

# 启动容器并启动bash(交互方式)
docker run -i -t <image_name/continar_id> /bin/bash

# 启动容器以后台方式运行(更通用的方式)
docker run -d -it  image_name

# 附着到正在运行的容器
docker attach <id、container_name>

# 进入正在运行的容器内部,同时运行bash(比attach更好用)
docker exec -t -i <id/container_name>  /bin/bash

# 查看容器日志
docker logs <id/container_name>

# 实时查看日志输出
docker logs -f <id/container_name> (类似 tail -f) (带上时间戳-t)

# 在容器中安装新的程序
docker run image_name apt-get install -y app_name  

# 从容器里面拷贝文件/目录到本地一个路径
docker cp Name:/container_path to_path  
docker cp ID:/container_path to_path

# 保存对容器的修改(commit) 当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。
docker commit ID new_image_name  

# 删除单个容器
docker rm Name/ID 

# 删除所有容器
docker rm `docker ps -a -q`  

# 停止、启动、杀死、重启一个容器
docker stop Name/ID  
docker start Name/ID  
docker kill Name/ID  
docker restart name/ID

# 列出镜像
docker images

# 从dockerhub检索image
docker search image_name

# 下载image
docker pull image_name

# 删除一个或者多个镜像;
docker rmi image_name  

# 显示一个镜像的历史;
docker history image_name

# 发布docker镜像
docker push new_image_name

# ps:要发布到私有Registry中的镜像,在镜像命名中需要带上Registry的域名(如果非80端口,同时需要带上端口号)比如:
docker push dockerhub.yourdomain.com:443/hello.demo.kdemo:v1.0

# 查看docker0的网络(宿主机上操作)
ip a show docker0

# 查看容器的IP地址
docker inspect -f '{{ .NetworkSettings.IPAddress }}' <id、container_name>

# 附着到容器内部查看其内部ip:
ip a show eth0

Archives