gitlab git clone 卡住_Gitlab的最佳实践

背景

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文件中,主要配置如下内容:

  1. external url;
  2. email(使用的网易企业邮箱);
  3. 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种原因:

  1. 如果这些文件是你从别处克隆过来的,说明源头就不对,或者你克隆的方式不对,或者网络出错了;
  2. 如果这些文件是你在本地新增的,说明.git目录下有些文件被你误删了;
  3. 如果这些文件是你在本地新增的,但是是从别处目录拷贝过来的,你有可能拷贝的是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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值