背景
Gitlab是最流行的私有化部署git服务。
安装与部署
1,基于docker进行安装
Gemfield使用了CE版(社区版本):
docker run --detach --hostname ai1.gemfield.org
-p 443:443 -p 80:80 -p 2222:22
--name gitlab --restart always
--volume /bigdata/gitlab/config:/etc/gitlab
--volume /bigdata/gitlab/logs:/var/log/gitlab
--volume /bigdata/gitlab/data:/var/opt/gitlab
gitlab/gitlab-ce:latest
注意这里挂载的端口是80:80,Gemfield实验了8080:80,想通过http://ai1.gemfield.org:8080来访问gitlab,但是一直无法访问(即使已经更改了external_url)。
2,配置
配置在config/gitlab.rb文件中,主要配置如下内容:
- external url;
- email(使用的网易企业邮箱);
- lfs;
## GitLab URL
重新配置:
docker exec -it gitlab gitlab-ctl reconfigure
然后重启:
docker restart gitlab
上述配置中关键点有两项:1,邮件服务器的设置;2,lfs的设置。
Gitlab的大文件使用
开发人员喜欢使用git维护一些东西,比如代码,比如md文件(WiKi中不要太多)。但是,还有一些开发人员输出的东西,比如microsoft的word、excel、ppt之类的office文件,jpg、png之类的图片文件等,这些是二进制文件,无法被git的diff、delta等概念很好的追踪起来——或者说,根本就维护不起来。
现在git有lfs扩展(lfs,large file system),上述Gemfield部署的gitlab也支持lfs。那现在就可以使用了。
1,在自己工作的电脑上安装lfs扩展
sudo apt install git-lfs
2,针对某个项目进行git lfs install
#在某个Git仓库下
$ git lfs install
Updated pre-push hook.
Git LFS initialized.
这个命令会安装pre-push的git hook,顾名思义,就是在push之前会调用一些hook做一些事情。没错,会执行推送large file的操作。
3,指定哪些文件需要被git lfs track
比如下面的命令说明要track后缀为docx的文件:
git lfs track "*.doc"
git lfs track "*.docx"
4,常规操作
添加大文件的日常操作:
#将large File添加到项目中
git add .
#将文件的metadata写入
git commit -m "Add gemfield docx file"
#将git repo和large file同步到gitlab server上
git push origin master
5,别忘了.gitattributes
确保.gitattributes文件是被git追踪的,不然只有你本地有,别人克隆这个项目就不好使了。
git add .gitattributes
6,其他人克隆这个项目
就正常的clone就行了,没什么特殊的。
7,获得remote的最新的lfs
git lfs fetch origin master
8,对文件加锁
因为git lfs管理的是二进制文件,并不擅长解决merge之类的问题,因此它有一个特殊的概念:文件加锁(gitlab 10.5后支持)。操作流程如下所示:
- 先配置哪些文件是可以加锁的,语法和.gitignore类似;
- 如果要准备修改一个文件了,先对这个文件加锁;
- 修改完后push,然后解锁该文件;
git lfs出现错误
1,在git push中出现错误
比如下面的错误:
Uploading LFS objects: 0% (0/2), 0 B | 0 B/s, done
(missing) docs/gemfield报告.xlsx (382c62de3ee85740d999daddf1261ada97b233a8191b3c009a4545602137dfbd)
(missing) docs/syszux周报.xlsx (a38a682e4081cd529baf16557e57f44cee596c2c30ba6054aa08cadc4af94c7b)
......
remote: GitLab: LFS objects are missing. Ensure LFS is properly set up or try a manual "git lfs push --all".
......
error: failed to push some refs to 'http://ai1.gemfield.org'
当出现这个错误的时候,你会发现虽然git lfs ls-files能list出“gemfield报告.xlsx”这些文件,但是这些文件对应的id:“382c62de3ee85740d999daddf1261ada97b233a8191b3c009a4545602137dfbd“并没有出现在.git目录下。如果你运行git lfs fsck 命令,会输出:
Object docs/gemfield报告.xlsx (382c62de3ee85740d999daddf1261ada97b233a8191b3c009a4545602137dfbd) could not be checked: no such file or directory
......
Moving corrupt objects to /Users/civilnet/github/ai1_gemfield_org/syszux_av/.git/lfs/bad
rename /Users/civilnet/github/ai1_gemfield_org/syszux_av/.git/lfs/objects/a3/8a/a38a682e4081cd529baf16557e57f44cee596c2c30ba6054aa08cadc4af94c7b /Users/civilnet/github/ai1_gemfield_org/syszux_av/.git/lfs/bad/a38a682e4081cd529baf16557e57f44cee596c2c30ba6054aa08cadc4af94c7b: no such file or directory
出现这种情况有3种原因:
- 如果这些文件是你从别处克隆过来的,说明源头就不对,或者你克隆的方式不对,或者网络出错了;
- 如果这些文件是你在本地新增的,说明.git目录下有些文件被你误删了;
- 如果这些文件是你在本地新增的,但是是从别处目录拷贝过来的,你有可能拷贝的是git lfs pointer文件,这些文件会出发git lfs命令的bug,也就是文件被添加了,但.git下没有,也就遇到了上述git lfs fsck输出的错误。
Gitlab runner的安装
待续。
Gitlab的CI、CD
在项目根目录下放置 .gitlab-ci.yml 文件,格式为Yaml。下面Gemfield列举几个例子:
1,C++
# This file is a template, and might need editing before it works on your project.
2,Django
# This file is a template, and might need editing before it works on your project.
# Official framework image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/python
image: python:latest
# Pick zero or more services to be used on all builds.
# Only needed when using a docker container to run your tests in.
# Check out: http://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-a-service
services:
- mysql:latest
- postgres:latest
variables:
POSTGRES_DB: database_name
# This folder is cached between builds
# http://docs.gitlab.com/ce/ci/yaml/README.html#cache
cache:
paths:
- ~/.cache/pip/
# This is a basic example for a gem or script which doesn't use
# services such as redis or postgres
before_script:
- python -V # Print out python version for debugging
# Uncomment next line if your Django app needs a JS runtime:
# - apt-get update -q && apt-get install nodejs -yqq
- pip install -r requirements.txt
# To get Django tests to work you may need to create a settings file using
# the following DATABASES:
#
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.postgresql_psycopg2',
# 'NAME': 'ci',
# 'USER': 'postgres',
# 'PASSWORD': 'postgres',
# 'HOST': 'postgres',
# 'PORT': '5432',
# },
# }
#
# and then adding `--settings app.settings.ci` (or similar) to the test command
test:
variables:
DATABASE_URL: "postgresql://postgres:postgres@postgres:5432/$POSTGRES_DB"
script:
- python manage.py test
3,Dockerfile
# This file is a template, and might need editing before it works on your project.
docker-build-master:
# Official docker image.
image: docker:latest
stage: build
services:
- docker:dind
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
script:
- docker build --pull -t "$CI_REGISTRY_IMAGE" .
- docker push "$CI_REGISTRY_IMAGE"
only:
- master
docker-build:
# Official docker image.
image: docker:latest
stage: build
services:
- docker:dind
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
script:
- docker build --pull -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" .
- docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"
except:
- master