前言
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 ,别着急让子弹再飞一会儿;最后效果:
现在我们来解决下一个问题,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 的获取在这里:
这是注册成功后的效果:
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 阶段,接下来提交我们的代码到我们的仓库,可以看到已自动触发了构建了
构建完成即可访问 "http://yourhost:8082"
总结
以上就是关于 gitlab 私库的搭建及CI/CD的实现过程,主要采用了linux、docker、git基础命令、yaml语法,大多数相关知识都可以查阅文档解决,其中的一些的常见的报错,也给出了相关的解决办法,如有不足之处,也请各位看官大佬指出,菜鸟作者一定第一时间更正。