搭建私有gitlab仓库及CI/CD的实现

1,669 阅读4分钟

前言

gitlab作为业界优秀的仓库管理系统的开源项目,不仅能满足我们日常的代码托管功能,更能用于搭建企业、学校等内部私库。这篇文章上讲解了基于docker容器技术搭建gitlab私库过程,并在此基础上延展讲述了gitlab的另一个优秀功能CI/CD

前提条件:至少 4 核 8G 服务器

我这里用的是腾讯云centos14按量收费模式,各位看官如果跟作者一样囊中羞涩,也可以选择这种模式,用完关机(注意选择关机不收费的方式)或直接注销,可节省很多毛爷爷 "_"

更新 yum

yum update

更新好后,安装 docker 的依赖

yum install -y yum-utils device-mapper-persistent-data lvm2

添加阿里云 docker 镜像仓库

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

通过 yum 安装 docker

yum install docker-ce

启动 docker

systemctl start docker
// 并设置开机启动
systemctl enable docker

gitlab 的搭建

拉取 gitlab:ce 镜像 这里采用 ce 版本,为社区免费版

docker pull gitlab/gitlab-ce

运行 gitlab 镜像 注意端口映射 防止与其他服务冲突

   docker run -d \
   -p 2222:22 -p 9000:80 -p 8443:443 \
   --volume /docker/gitlab/config:/etc/gitlab \
   --volume /docker/gitlab/logs:/var/log/gitlab \
   --volume /docker/gitlab/data:/var/opt/gitlab \
   -e TZ=Asia/Shanghai \
   --restart always \
   -m 4GB \
   --name gitlab gitlab/gitlab-ce:latest

这里有一个注意的点,关于自定义 gitlab 端口??

比如将 gitlab 部署到 9000 端口(记得到云服务器上将9000端口设置成安全组)

我们需要在 /docker/gitlab/config/gitlab.rb 文件末尾添加

external_url 'http://yourhost:9000'

nginx['listen_port'] = 80

修改完毕了记得重启gitlab容器

docker restart gitlab

gitlab 启动很慢,一般需要 3-10 分钟,初始账号:root,初始密码:cat /docker/gitlab/config/initial_root_password 此处的路径根据 上面数据卷 --volume 的设置,初始密码在 24 小时后失效,所以登录后第一件是就是重置密码

到这里我们已经将gitlab部署成功了,是不是很简单?访问一下吧,浏览器输入 http://yourhost:9000 ; 如果出现 502 ,别着急让子弹再飞一会儿;最后效果:

1660115436106.jpg

现在我们来解决下一个问题,gitlab如何实现CI/CD? 或者说gitlab怎么感知我们有代码提交并执行CI/CD? 答案就在gitlab-runner

gitlab-runner是一个开源项目,用于运行Pipeline作业并将结果发送回GitLab。它常常与GitLab CI一起使用。

创建 gitlab-runner 容器

docker run -d --name gitlab-runner --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /docker/gitlab-runner/gitlab-runner-config:/etc/gitlab-runner \
    -e TZ=Asia/Shanghai \
    gitlab/gitlab-runner:latest

注意数据卷:/var/run/docker.sock:/var/run/docker.sock 映射关系,否则在 ci 执行过程中会报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

注册 runner

官方文档

docker run --rm -v /docker/gitlab-runner/gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner register \
  --non-interactive \
  --executor "docker" \
  --docker-image alpine:latest \
  --url "http://yourhost:9000" \
  --registration-token "yourtoken" \
  --description "docker-runner" \
  --maintenance-note "Free-form maintainer notes about this runner" \
  --tag-list "dockercicd3,vitepro3" \
  --run-untagged="true" \
  --locked="false" \
  --access-level="not_protected"

如果报错:flag provided but not defined: -maintenance-note

则删除 --maintenance-note "Free-form maintainer notes about this runner" 这一行

这里需要注意 “--registration-token "yourtoken" ” token 的获取在这里:

image.png

这是注册成功后的效果:

image.png


CI/CD

使用docker构建项目

在项目根目录新建 DockerFile 文件

# 此处的node镜像版本最好与项目使用的一致
FROM node:latest as builder

WORKDIR /app

# 此处利用缓存 不必每次安装依赖 可作为性能优化
COPY package.json package-lock.json /app/

RUN npm install --registry=https://registry.npm.taobao.org

COPY . .

RUN npm run build

FROM nginx:latest

COPY --from=builder /app/dist /usr/share/nginx/html

编写.gitlab-ci.yml 文件

关于yaml的语法在这里

在项目根目录下新建 .gitlab-ci.yml 文件

image: node:latest

stages:
  - install
  - build
  - deploy

cache:
  paths:
    - node_modules

job_install:
  stage: install
  tags:
    - vitepro
  script:
    - npm install --registry=http://registry.npm.taobao.org

job_build:
  stage: build
  tags:
    - vitepro
  script:
    - npm run build

job_deploy:
  image: docker
  stage: deploy
  tags:
    - vitepro
  script:
    - docker build -t citestimages .
    - if [ $(docker ps -aq --filter name=citest-container) ]; then docker rm -f citest-container;fi
    - docker run -d -p 8082:80 --name citest-container citestimages

注意我这里将端口设置成了8082,各位可按自己实际情况决定。

此处如果报错:error during connect: Post "http://docker:2375/v1.24/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=citestimages&target=&ulimits=null&version=1": dial tcp: lookup docker on 183.60.83.19:53: no such host

是一个很典型的 docker in docker 的问题,解决办法:

经尝试 官方提供的 --docker-volumes /var/run/docker.sock:/var/run/docker.sock 这种方案不适用,建议采用:

vim /docker/gitlab-runner/gitlab-runner-config/config.toml

volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]

修改过配置后记得重启容器

另外如果采用 docker 的方式部署的话,可省略上面的 install、build 阶段,接下来提交我们的代码到我们的仓库,可以看到已自动触发了构建了

image.png

构建完成即可访问 "http://yourhost:8082"

总结

以上就是关于 gitlab 私库的搭建及CI/CD的实现过程,主要采用了linux、docker、git基础命令、yaml语法,大多数相关知识都可以查阅文档解决,其中的一些的常见的报错,也给出了相关的解决办法,如有不足之处,也请各位看官大佬指出,菜鸟作者一定第一时间更正。