Gitlab 基本实操 电脑版发表于:2020/8/27 9:52 ![Gitlab](https://img.tnblog.net/arcimg/hb/92d512aee2af495fafe464a822fdea10.png "Gitlab") >#Gitlab 基本实操 [TOC] Gitlab简括 ------------ >Gitlab 本身是一个代码托管的工具。 >特点如下: - 免费、开源 - 功能强大 - 分布式 - Git flow - Git CI 安装参考 ------------ https://docs.gitlab.com/omnibus/docker/ >请提前为 `$GITLAB_HOME` 环境变量提供路径 ```bash 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 ``` 或 ```bash 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 ``` >进入容器内部 ```bash sudo docker exec -it gitlab /bin/bash ``` >`/etc/gitlab/gitlab.rb`用您的编辑器打开并设置`external_url`: ```bash # 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`: ```bash gitlab_rails['gitlab_shell_ssh_port'] = 2222 ``` >最后,重新配置GitLab: ```bash 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 命令 ```bash # gitlab-ctl #客户端命令行操作行 # gitlab-ctl reconfigure #重新加载配置 # gitlab-ctl stop #停止gitlab # gitlab-ctl start #启动gitlab # gitlab-ctl restart #重启gitlab # gitlab-ctl status #查看组件运行状态 # gitlab-ctl tail nginx #查看某个组件的日志 ``` ![](https://img.tnblog.net/arcimg/hb/f1901a2dd2a3417b8c1f65dbcad1d9c8.png) GitLab的基本操作 ------------ >### 创建用户 ![](https://img.tnblog.net/arcimg/hb/12944b85683e4dd593b413b5b89323e6.png) tn>在这里可以创建项目、用户以及组,我们先来创建用户 ![](https://img.tnblog.net/arcimg/hb/3c3f1cb44fb240ea88639100749a2717.png) ![](https://img.tnblog.net/arcimg/hb/c49526f30fab4524b11f023d8d41f722.png) tn>接下来修改密码 ![](https://img.tnblog.net/arcimg/hb/59cb42f7f95442d29c0ee096ac6371fa.png) tn>以后还要修改可以在Dashboard下面找到该用户。 ![](https://img.tnblog.net/arcimg/hb/5b38551c060c4bd38d8d292a26b9b992.png) >### 关闭注册页面 ![](https://img.tnblog.net/arcimg/hb/8122cc02490440b8b60897c105f799f8.png) tn>我们发现在登录的时候有注册页面,导致任何人都可以注册,所以我们可以关闭掉注册页面。 ![](https://img.tnblog.net/arcimg/hb/37e497b6d6e446438b47546fefb9f919.png) ![](https://img.tnblog.net/arcimg/hb/d3a3f7d02d7e496e9a5c30f5334eba78.png) tn>再次访问就没有注册页面了 ![](https://img.tnblog.net/arcimg/hb/7c871bb7eed846f18b93ace7a2d999ce.png) >### 创建项目组 ![](https://img.tnblog.net/arcimg/hb/30f9b48627d647cdb92c20f0b6279ab8.png) ![](https://img.tnblog.net/arcimg/hb/49adb759b19445d5b2c16174ab0f5376.png) ![](https://img.tnblog.net/arcimg/hb/edec6974da40427186abf78d1680486f.png) >### 创建项目 ![](https://img.tnblog.net/arcimg/hb/9d0f5a0121604d88a665bd2f16d62e1b.png) ![](https://img.tnblog.net/arcimg/hb/3b9ff50da4144343a0c477189dfaedb1.png) GitFlow的三种流程 ------------ >###最早期分支流程 ![早期](https://img.tnblog.net/arcimg/hb/574b73e8fe9c45a3a48ed6d48cf1510a.png "早期") tn>就只在两个人开发的情况下,就三条分支: Master 、 Lei 、 Jesse ;负责对不同的需求进行开发,当 Jesse 提交代码到 Master 分支上时,Lei 需要对每一次 Master 的更新进行拉取一次然后再提交代码。 <br/> >问题有如下两点: - 当 Jesse 代码有问题时,需要等待 Jesse 在本地修改完成后,Lei 才可以再次拉取与提交代码,会造成 Master 分支拥堵。 - 测试直接影响 Master 分支对线上项目有一定影响 <br/> >###第二种分支流程 ![第二种分支流程](https://img.tnblog.net/arcimg/hb/43ffeca024964045a55f7ecfb545e41b.png) tn>当 Lei 与 Jesse 开发不同功能时,从分支上看到 Lei 先完成分支上的内容并提交到 Release 分支上,Jesse 完成对不同功能的需求开发,只需要从 Release 分支拉取到本地再次提交代码即可。假如这个时候刚好就是要上线的1.0版本,我们可以对这1.0版本进行测试如果有bug,再次让开发人员进行修改与提交。测试好1.0版本后将更新代码到 Master 主分支并且发布1.0版本的产品。如果在这当中 Master 分支出现问题,将会同步到 HotFix 分支,由开发人员修复后更新到 Master 分支与 Release 分支上 <br/> >问题: - 这种开发模式只适合一个开发团队,不适合多个团队同时开发 >###第三种分支流程 ![](https://img.tnblog.net/arcimg/hb/53412da40ad44ac8bd3d3138d10ef508.png) tn>当我们有两个或多个团队时,且分别开发不同的功能,我们可以分为两个 feature 分支两个团队进行开发,当开发完成后更新到 Dev 分支上,最后提交到 Release 分支上进行测试,测试成功后发布到 Master 分支上。当发布后,有团队做完不同的功能将会更新到 Dev 分支上。如果中途在 Release 分支上测试失败,可以在 Dev 分支或feature分支上进行修改并在 Release 分支上再次测试。 GitLab CI ------------ ![GitLab CI](https://img.tnblog.net/arcimg/hb/bd63b6ea151c4c44a3d4a60d4fbb2132.png "GitLab CI") tn>上面画了一个简易的图,画的不好,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注册和安装 ------------ >###下载安装包 ```bash wget -O /usr/local/bin/gitlab-runner https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-linux-amd64 ``` >赋予执行权限 ```bash chmod +x /usr/local/bin/gitlab-runner ``` >###注册Runner <br/> >1.输入以下命令启动注册 ```bash gitlab-runner register ``` >2.在GitLab Server上找到相关信息(从首页的Gitlab config中去设置) ![相关信息](https://img.tnblog.net/arcimg/hb/3fc84505dff44d469961a0279ffd8eed.png "相关信息") >3.注册相关信息 ![](https://img.tnblog.net/arcimg/hb/cca87fd10713451f998e64e2334dadc7.png) >4.查看CI ![](https://img.tnblog.net/arcimg/hb/c3e7f881700e4e9a8d0e7564f0b343d3.png) >###添加SSH Keys <br/> >1.从本地路径找到`C:\Users\{用户名}}\.ssh\id_rsa.pub`显示SSH的key <br/> >2.添加 SSH-Key ![添加SSH-Key](https://img.tnblog.net/arcimg/hb/585c51d9a0664bd28fc93cd18136a204.png "添加SSH-Key") >###创建项目 <br/> >1.创建项目地址 ![](https://img.tnblog.net/arcimg/hb/b4c0ebbb63eb427490dffcd75ee48426.png) >2.编写`.gitlab-ci.yml` ```bash rtest: script: - cd User.API - docker-compose up -d --build --force-recreate - docker rmi $(docker images | grep "none" | awk '{print $3}') ``` tn>Gitlab CI 官方配置文件参数说明(中文) 快速入门 https://docs.gitlab.com.cn/ce/ci/quick_start/README.html 配置文档讲解 https://docs.gitlab.com.cn/ce/ci/yaml/ >3.按照项目提示的方式提交代码 ```bash 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 ``` tn>上传完代码后CI会自动跑起来 <br/> >###解决Docker非服务启动问题 ![](https://img.tnblog.net/arcimg/hb/1898e9a28d804e6f98ed5ea361da512a.png) >解决方案(1) tn>1、启动docker服务 ```bash service docker start ``` tn>2、生成自启动服务 ```bash systemctl enable docker.service ``` tn>3、查看服务状态,Active状态为:active(running) ```bash systemctl status docker.service ``` >解决方案(2) tn>添加`gitlab-runner`用户到`docker` ```bash sudo usermod -aG docker gitlab-runner ``` tn>到这里测试环境部署算是完成了,接下来该把生成的镜像进行上传到私有仓库中去。并搭建正式环境。 ![](https://img.tnblog.net/arcimg/hb/e1403dc868e94261a8f4131889e1daa2.png) 私有仓库的搭建 ------------ >###Docker registry介绍 tn>用于存储和分发Docker映像的Docker Registry 2.0实现。 >如果要执行以下操作,则应使用registry介绍: - 严格控制图像的存储位置 - 完全拥有您的图像分发管道 - 将图像存储和分发紧密集成到您的内部开发工作流程中 <br/> >###运用Docker registry <br/> ```bash docker run -d -p 311:5000 --name registry registry:2 ``` ![](https://img.tnblog.net/arcimg/hb/14c2d4e93e514fd59c016c92d075e6f0.png) tn>我们可以通过 `http://{IP}:311/v2/` 访问当前仓库的镜像有哪些 ![](https://img.tnblog.net/arcimg/hb/cb7fd5468b9647eea8f63b2377f956a9.png) tn>这里我们通过如下命令对`alpine`打一个本地的包进行测试 ```bash docker tag alpine localhost:311/alpine:local docker images ``` ![](https://img.tnblog.net/arcimg/hb/32f88f26b2ee48398ea5f49a69546c95.png) tn>最后进行推送 ```bash docker push localhost:311/alpine:local ``` ![](https://img.tnblog.net/arcimg/hb/2fe98f02937d47ba838c779699a833c7.png) tn>通过 `http://localhost:311/v2/alpine/tags/list` 进行查看 `alpine` 本地镜像的 `Tag` ,以及`http://localhost:311/v2/_catalog`。更多请参考:https://docs.docker.com/registry/spec/api/#listing-image-tags ![](https://img.tnblog.net/arcimg/hb/adec8361d21a4fd3b5cb231e55d2792a.png) >###运用Docker registry UI(docker-registry-frontend) tn>在我们进行操作Api的时候是很不方便的,所以我们可以通过(docker-registry-frontend)来进行管理进行可视化管理。 ```bash 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 ``` tn>其中 `ENV_DOCKER_REGISTRY_HOST` 环境变量表示**仓库域名或地址** `ENV_DOCKER_REGISTRY_PORT` 环境变量表示**仓库的端口** 执行完命令后访问 `127.0.0.1:312` ![](https://img.tnblog.net/arcimg/hb/431a8a07ce4949409dad5843b19b0700.png) ![](https://img.tnblog.net/arcimg/hb/cf40f357b0b54f3484d7e93d032a40b4.png) ![](https://img.tnblog.net/arcimg/hb/01d03bdbbd4c4354b4082e23b8bb0a8b.png) tn>现在我们可以看到刚刚我们提交上去的`alpine`镜像。但我们会发现有一个缺点,就是在我们进行访问的时候并没有进行权限验证。 >###Docker registry本地基本身份验证 <br/> >实现访问限制的最简单方法是通过基本身份验证(这与其他Web服务器的基本身份验证机制非常相似)。本示例使用本机基本身份验证htpasswd来存储机密。 tn>警告:不能将身份验证与将凭据作为明文发送的身份验证方案一起使用。您必须先 配置TLS,身份验证才能正常工作。 >1.创建一个密码文件,为用户提供一个条目`testuser`,密码为 `testpassword`: ```bash mkdir auth yum -y install httpd htpasswd -Bbn testuser testpassword > auth/htpasswd ``` 或 ```bash docker run \ --entrypoint htpasswd \ registry:2 -Bbn testuser testpassword > auth/htpasswd ``` >2.如果使用的是第二种方式注意停止registry。 ```bash docker container stop registry ``` >3.使用基本身份验证启动注册表。 ```bash 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 ``` tn>随后当再次提交到 **你的域名时** 会进行身份验证。 未完待续.....