
Gitlab 基本实操
Gitlab简括
Gitlab 本身是一个代码托管的工具。
特点如下:
- 免费、开源
- 功能强大
- 分布式
- Git flow
- Git CI
安装参考
https://docs.gitlab.com/omnibus/docker/
请提前为
$GITLAB_HOME
环境变量提供路径
docker run --detach \
--hostname localhost \
--publish 8929:8929 --publish 2222:22 \
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab \
--volume $GITLAB_HOME/logs:/var/log/gitlab \
--volume $GITLAB_HOME/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
或
sudo docker run --detach \
--hostname 127.0.0.1 \
--publish 8929:8929 --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
进入容器内部
sudo docker exec -it gitlab /bin/bash
/etc/gitlab/gitlab.rb
用您的编辑器打开并设置external_url
:
# For HTTP
external_url "http://gitlab.example.com:8929"
or
# For HTTPS (notice the https)
external_url "https://gitlab.example.com:8929"
设置
gitlab_shell_ssh_port
:
gitlab_rails['gitlab_shell_ssh_port'] = 2222
最后,重新配置GitLab:
gitlab-ctl reconfigure
注意运行内存8个g,如果需要对资源进行限制,可以参考这篇文章:https://www.cnblogs.com/zhuochong/p/9728383.html
gitlab 安装目录
目录 | 描述 |
---|---|
/etc/gitlab |
配置文件目录 |
/run/gitlab |
运行pid目录 |
/opt/gitlab |
安装目录 |
/var/opt/gitlab |
数据目录 |
/var/log/gitlab |
日志目录 |
gitlab 命令
# gitlab-ctl #客户端命令行操作行
# gitlab-ctl reconfigure #重新加载配置
# gitlab-ctl stop #停止gitlab
# gitlab-ctl start #启动gitlab
# gitlab-ctl restart #重启gitlab
# gitlab-ctl status #查看组件运行状态
# gitlab-ctl tail nginx #查看某个组件的日志
GitLab的基本操作
创建用户
在这里可以创建项目、用户以及组,我们先来创建用户
接下来修改密码
以后还要修改可以在Dashboard下面找到该用户。
关闭注册页面
我们发现在登录的时候有注册页面,导致任何人都可以注册,所以我们可以关闭掉注册页面。
再次访问就没有注册页面了
创建项目组
创建项目
GitFlow的三种流程
最早期分支流程
就只在两个人开发的情况下,就三条分支: Master 、 Lei 、 Jesse ;负责对不同的需求进行开发,当 Jesse 提交代码到 Master 分支上时,Lei 需要对每一次 Master 的更新进行拉取一次然后再提交代码。
问题有如下两点:
- 当 Jesse 代码有问题时,需要等待 Jesse 在本地修改完成后,Lei 才可以再次拉取与提交代码,会造成 Master 分支拥堵。
- 测试直接影响 Master 分支对线上项目有一定影响
第二种分支流程
当 Lei 与 Jesse 开发不同功能时,从分支上看到 Lei 先完成分支上的内容并提交到 Release 分支上,Jesse 完成对不同功能的需求开发,只需要从 Release 分支拉取到本地再次提交代码即可。假如这个时候刚好就是要上线的1.0版本,我们可以对这1.0版本进行测试如果有bug,再次让开发人员进行修改与提交。测试好1.0版本后将更新代码到 Master 主分支并且发布1.0版本的产品。如果在这当中 Master 分支出现问题,将会同步到 HotFix 分支,由开发人员修复后更新到 Master 分支与 Release 分支上
问题:
- 这种开发模式只适合一个开发团队,不适合多个团队同时开发
第三种分支流程
当我们有两个或多个团队时,且分别开发不同的功能,我们可以分为两个 feature 分支两个团队进行开发,当开发完成后更新到 Dev 分支上,最后提交到 Release 分支上进行测试,测试成功后发布到 Master 分支上。当发布后,有团队做完不同的功能将会更新到 Dev 分支上。如果中途在 Release 分支上测试失败,可以在 Dev 分支或feature分支上进行修改并在 Release 分支上再次测试。
GitLab CI
上面画了一个简易的图,画的不好,so sorry! Runner是GitLab CI的重要组件之一,它可以部署在独立的服务器上,不影响GitLab服务器。首先我们对Runner经过不同的生成方式(shell,Docker,SSH,Kubernetes)去生成从GitLab Server拉取下来的代码,然后把其中生成的以不同方式进行存储,这里我们采用Docker镜像仓库的形式进行存储。最后在不同的环境下进行测试。
GitLab CI 支持多平台(Windows、OSX、Unix) 多语言(Java、Php、Ruby等),这其中自然也包括C#。它还有以下几个特性:
- 分布式运行:多服务器、并行
- 可以运行在本地、Docker容器、SSH Remote等
- 支持批处理:windows、Power Shell (这让我们用msbuild 编译上一代的.net程序有了可能)
在使用也就是执行阶段,GitLab Runner 给我们提供了以下7种执行方式。官方称之为 executors。
- Shell
- Docker
- Docker Machine
- Parallels
- VirtualBox
- SSH
- Kubernetes
在注册Runner阶段,我们就需要选择executor,我们今天将选择使用本地Shell这种大家最熟悉的方式来执行作业Job。
GitLab Runner注册和安装
下载安装包
wget -O /usr/local/bin/gitlab-runner https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-linux-amd64
赋予执行权限
chmod +x /usr/local/bin/gitlab-runner
注册Runner
1.输入以下命令启动注册
gitlab-runner register
2.在GitLab Server上找到相关信息(从首页的Gitlab config中去设置)
3.注册相关信息
4.查看CI
添加SSH Keys
1.从本地路径找到
C:\Users\{用户名}}\.ssh\id_rsa.pub
显示SSH的key
2.添加 SSH-Key
创建项目
1.创建项目地址
2.编写
.gitlab-ci.yml
rtest:
script:
- cd User.API
- docker-compose up -d --build --force-recreate
- docker rmi $(docker images | grep "none" | awk '{print $3}')
Gitlab CI 官方配置文件参数说明(中文)
快速入门 https://docs.gitlab.com.cn/ce/ci/quick_start/README.html
配置文档讲解 https://docs.gitlab.com.cn/ce/ci/yaml/
3.按照项目提示的方式提交代码
git init
git remote add origin ssh://git@127.0.0.1:2222/root/beta2.git
git add .
git commit -m "Initial commit"
git push -u origin master
上传完代码后CI会自动跑起来
解决Docker非服务启动问题
解决方案(1)
1、启动docker服务
service docker start
2、生成自启动服务
systemctl enable docker.service
3、查看服务状态,Active状态为:active(running)
systemctl status docker.service
解决方案(2)
添加gitlab-runner
用户到docker
sudo usermod -aG docker gitlab-runner
到这里测试环境部署算是完成了,接下来该把生成的镜像进行上传到私有仓库中去。并搭建正式环境。
私有仓库的搭建
Docker registry介绍
用于存储和分发Docker映像的Docker Registry 2.0实现。
如果要执行以下操作,则应使用registry介绍:
- 严格控制图像的存储位置
- 完全拥有您的图像分发管道
- 将图像存储和分发紧密集成到您的内部开发工作流程中
运用Docker registry
docker run -d -p 311:5000 --name registry registry:2
我们可以通过 http://{IP}:311/v2/
访问当前仓库的镜像有哪些
这里我们通过如下命令对alpine
打一个本地的包进行测试
docker tag alpine localhost:311/alpine:local
docker images
最后进行推送
docker push localhost:311/alpine:local
通过 http://localhost:311/v2/alpine/tags/list
进行查看 alpine
本地镜像的 Tag
,以及http://localhost:311/v2/_catalog
。更多请参考:https://docs.docker.com/registry/spec/api/#listing-image-tags
运用Docker registry UI(docker-registry-frontend)
在我们进行操作Api的时候是很不方便的,所以我们可以通过(docker-registry-frontend)来进行管理进行可视化管理。
docker run -d --name registry-web --link registry:registry -e ENV_DOCKER_REGISTRY_HOST=registry -e ENV_DOCKER_REGISTRY_PORT=5000 -p 312:80 konradkleine/docker-registry-frontend:v2
其中 ENV_DOCKER_REGISTRY_HOST
环境变量表示仓库域名或地址 ENV_DOCKER_REGISTRY_PORT
环境变量表示仓库的端口 执行完命令后访问 127.0.0.1:312
现在我们可以看到刚刚我们提交上去的alpine
镜像。但我们会发现有一个缺点,就是在我们进行访问的时候并没有进行权限验证。
Docker registry本地基本身份验证
实现访问限制的最简单方法是通过基本身份验证(这与其他Web服务器的基本身份验证机制非常相似)。本示例使用本机基本身份验证htpasswd来存储机密。
警告:不能将身份验证与将凭据作为明文发送的身份验证方案一起使用。您必须先 配置TLS,身份验证才能正常工作。
1.创建一个密码文件,为用户提供一个条目
testuser
,密码为testpassword
:
mkdir auth
yum -y install httpd
htpasswd -Bbn testuser testpassword > auth/htpasswd
或
docker run \
--entrypoint htpasswd \
registry:2 -Bbn testuser testpassword > auth/htpasswd
2.如果使用的是第二种方式注意停止registry。
docker container stop registry
3.使用基本身份验证启动注册表。
docker run -d \
--restart=always \
--name registry \
-v `pwd`/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
-v `pwd`/cert:/certs \
-v /root/docker/registry:/var/lib/registry\
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/xxxx.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/xxxx.key \
-p 443:443 \
registry:2
随后当再次提交到 你的域名时 会进行身份验证。
未完待续…..
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

