Tagged: git

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。

Git 管理项目

常用命令

# 查看git配置信息
git config --list

# 查看文件信息
git ls-files       #仅查看所有的文件名
git ls-tree head   #查看版本(分支)中所有的文件
git ls-files -s    #查看暂存区和版本中所有文件的详细信息

# 查看commit日志
git log
git log --oneline
git log --graph

# 推送代码至服务器
git pull

# 获取最新版到本地,不会自动merge
git fetch

# 拉取远程分支到本地
git pull <远程主机名> <远程分支名>:<本地分支名>
git fetch <远程主机名> <远程分支名>:<本地分支名>

# 推送到服务器
git push

# 添加文件到暂存区
git add <filePath>
git add .

# 添加commit信息
git commit -m "<message>"

# 合并分支
# 切换到master,将dev分支合并到master分支
git merge dev

# 删除
# -r 递归移除目录
# -n 执行命令时,不会真做操作,只是展示执行后的操作信息
git rm -r -n runtime/*    # 不会删除掉文件
git rm -r runtime/*       # 会删除掉文件
git rm -r --cached runtime/*  # 从暂存区删除,不会删除本地文件

# 放弃本地修改
git checkout -- <filePathName>

# 冲突
# 冲突是需要手动解决的,最好是借助工具解决掉冲突,先add,再commit即可。

# 基础配置
# 设置用户信息
git config --global user.name "Jalena"
git config --global user.email "jalena@bcsytv.com"

# 查看某一项设置
git config <key>

# 格式化与多余的空白字符
git config --global core.autocrlf true

# 回滚版本
# 方式一
git reset --soft 版本号  #从分支回到暂存区
git reset head 文件      #从暂存区回到修改过的内容
git check out  文件      #从修改过的文件到原文件

# 方式二
git reset --mix 版本号   #从分支回到修改过的内容 == git reset 版本号
git check out  文件      #从修改过的文件到原文件

# 方式三
git reset --hard 版本号  #从分支回到原文件

远程仓库相关命令

# 初始化
git init

# 检出代码
git clone https://github.com/odoo/odoo.git
# 查看远程仓库
git remote -v
#添加远程仓库
git remote add [name] [url]
# 删除远程仓库
git remote rm [name]
# 修改远程仓库
git remote set-url --push [name] [newUrl]
# 拉取远程仓库
git pull [remoteName] [localBranchName]
# 推送远程仓库
git push [remoteName] [localBranchName]

分支(branch)操作相关命令

# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 创建本地分支
git branch [name] // 注意新分支创建后不会自动切换为当前分支
# 切换分支
git checkout [name]
# 创建新分支并立即切换到新分支
git checkout -b [name]
# 删除分支
# -d 只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。
# -D 强制删除一个分支
git branch -d [name]  
# 合并分支
# git merge [name] # 将名称为[name]的分支与当前分支合并
# 创建远程分支(本地分支push到远程)
git push origin [name]
# 删除远程分支
git push origin heads/[name]
git push origin [name]

子模块(submodule)相关操作命令

# 添加子模块
git submodule add [url] -b <version> [path]
# 初始化子模块,只在首次检出仓库时运行一次就行
git submodule init
# 更新子模块,每次更新或切换分支后都需要运行一下
git submodule update
# 删除子模块:(分4步走哦)
git rm --cached [path]
# 编辑".gitmodules"文件,将子模块的相关配置节点删除掉
# 编辑".git/config"文件,将子模块的相关配置节点删除掉
# 手动删除子模块残留的目录

Git 使用密钥登陆服务

生成密钥

# 生成 sshkey
ssh-keygen -t rsa -C "jalena@bcsytv.com"

添加已经存在的密钥至Linux

cd ~/.ssh
rz id_rsa
chmod 600 id_rsa
chmod 700 ~/.ssh

# 添加密钥到系统
ssh-agent bash
ssh-add id_rsa
ssh-add -l

添加密钥到Windows目录

将密钥文件存放至用户目录 %HOMEPATH%\.ssh

Windows 存放密钥

使用密钥登陆必须使用git@这样的ssh协议才行,如果之前使用的是https协议的话,那么需要将协议修改为git@这样的ssh协议。

Mac设置

mac系统下需要维护配置文件,不然重启之后会发现找不到密钥。

touch ~/.ssh/config

# 维护如下内容
Host github.com
HostName github.com
User jalena
PreferredAuthentications publickey
IdentityFile /Users/jalena/.ssh/git_rsa
UseKeychain yes
AddKeysToAgent yes

Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile /Users/jalena/.ssh/git_rsa
UseKeychain yes
AddKeysToAgent yes

修改仓库地址

$ git remote -v
origin https://github.com/demo/test.git (fetch)
origin https://github.com/demo/test.git (push)

# 替换协议为git
$ git remote set-url origin git@github.com:demo/test.git

添加密钥至GitEE

gitee 公钥设置

添加密钥至GitHub

测试

$ ssh -T git@gitee.com
Welcome to Gitee.com, jalena!

$ ssh -T git@github.com
Hi jalena! You've successfully authenticated, but GitHub does not provide shell access.

至此可以使用git@来管理项目

Archives