forecho

把生命浪费在美好的事物上

使用 GitLab

2017年11月07日

安装 GitLab

1
2
3
$ sudo apt-get install curl openssh-server ca-certificates postfix
$ curl -sS http://packages.gitlab.com.cn/install/gitlab-ce/script.deb.sh | sudo bash
$ sudo apt-get install gitlab-ce

修改 GitLab 配置文件

1
$ sudo vim /etc/gitlab/gitlab.rb

修改之后的配置如下:

1
2
3
external_url 'http://repo.yd.com';
web_server['external_users'] = ['www-data']
nginx['enable'] = false // 关闭自带nginx

修改时区

1
$ sudo vim /var/opt/gitlab/gitlab-rails/etc/gitlab.yml

修改后为: time_zone : 'Beijing'

然后重启 GitLab

1
2
$ sudo gitlab-ctl reconfigure
$ sudo gitlab-ctl restart

配置 nginx

GitLab 默认是集成了 nginx,但是我们一般不用他的,上面修改配置的时候,我们已经把 GitLab 集成的 nginx 关闭了。下面我们说一下如何使用 Linux 的 nginx。

添加 gitlab nginx 配置文件

1
$ sudo vim /etc/nginx/conf.d/gitlab.conf

添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
upstream gitlab-workhorse {
  server unix:/var/opt/gitlab/gitlab-workhorse/socket;
}
server {
  listen 80;
  # 此处域名可以根据情况修改,其它地方不用改
  server_name repo.yd.com;
  server_tokens off;
  root /opt/gitlab/embedded/service/gitlab-rails/public;
  access_log  /var/log/nginx/gitlab_access.log;
  error_log   /var/log/nginx/gitlab_error.log;
  location / {
    client_max_body_size 0;
    gzip off;
    proxy_read_timeout      300;
    proxy_connect_timeout   300;
    proxy_redirect          off;
    proxy_http_version 1.1;
    proxy_set_header    Host                $http_host;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto   $scheme;
    proxy_pass http://gitlab-workhorse;
  }
}

退出 vim, 使用下面命令确认 nginx 配置是否正确:

1
$ sudo nginx -t -c /etc/nginx/nginx.conf

重启 nginx

1
$ sudo service nginx reload

配置 Email

修改配置文件

1
$ sudo vim /etc/gitlab/gitlab.rb

依次修改以下几处

1
2
3
4
5
6
7
8
9
10
11
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtpdm.aliyun.com"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "gitlab@no-reply.forecho.com"
gitlab_rails['smtp_password'] = "xxxxxx"
gitlab_rails['smtp_domain'] = "no-reply.forecho.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
# ...
gitlab_rails['gitlab_email_from'] = "gitlab@no-reply.forecho.com"

重启

1
2
$ sudo gitlab-ctl reconfigure
$ sudo gitlab-ctl restart

测试

1
2
3
$ sudo gitlab-rails console
// 发送测试邮件
$ Notify.test_email('收件人邮箱', '邮件标题', '邮件正文').deliver_now

GitLab 配置 CI

本来打算安装完 GitLab 之后再安装个 Jenkins 继续集成的,但是发现现在 GitLab 自带 CI 了,虽然没有 Jenkins 强大,但是够我们用。

解决安装源的问题

1
2
$ sudo curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
$ sudo vim /etc/apt/sources.list.d/runner_gitlab-ci-multi-runner.list

然后把源换成 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ci-multi-runner/ubuntu/ 清华大学的,然后更新和安装:

1
$ sudo apt-get update && sudo apt-get install gitlab-ci-multi-runner

注册

1
$ sudo gitlab-ci-multi-runner register

url 要添加你自己搭建的 GitLab 域名 + /ci

token 为 GitLab 管理员登陆你自己搭建的 GitLab 之后去 xxx/admin/runners 网址找 token

Please enter the executor: docker-ssh, ssh, docker+machine, kubernetes, docker, parallels, shell, virtualbox, docker-ssh+machine 输入 shell

其他的随便填,后期可以在页面上改。

开启和关闭命令

1
2
$ sudo gitlab-ci-multi-runner start
$ sudo gitlab-ci-multi-runner stop

如何使用?

这个是重点,在你项目的根目录下新建一个 .gitlab-ci.yml 文件。下面是我们使用 angular 实现自动编译的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
image: node:latest
cache:
  paths:
    - node_modules/

deploy_dev:
  stage: deploy
  environment: Dev
  only:
    - dev
  script:
    - whoami
    - rm ./package-lock.json
    - npm install
    -  ./node_modules/@angular/cli/bin/ng build --prod --build-optimizer
    - ls
    - mv dist company_dev
    - cp -R company_dev /home/www

deploy_test:
  stage: deploy
  environment: Test
  only:
    - test
  script:
    - whoami
    - rm ./package-lock.json
    - npm install
    - ./node_modules/@angular/cli/bin/ng build --prod --env=test --build-optimizer
    - ls
    - mv dist company_test
    - cp -R company_test /home/www
    - echo "发布到测试环境"
    - rsync -avuz -e 'ssh -i /home/www/deploy_rsa' /home/www/company_test root@192.168.1.48:/home/www
    - echo "修改远程目录"
    - ssh -i /home/www/deploy_rsa root@192.168.1.48 "rm -rf /home/www/company && mv /home/www/company_test /home/www/company"
    - curl --request POST --url 'https://oapi.dingtalk.com/robot/send?access_token=xxxxx' --header 'content-type:application/json' --data '{"msgtype":"text","text":{"content":"测试环境已经更新"},"at":{"atMobiles":["xxxx","xxx"],"isAtAll":false}}'

简单解释一下:

  • 由于之前注册 GitLab CI 的时候选的是 shell,所以运行的时候用的是本台机器的环境,意味着上面的代码你要提前安装好 nodejs 环境。
  • GitLab CI 运行的时候使用的是 gitlab-runner 用户操作,你如果想实现 cp 等一些命令,可能需要把 gitlab-runner 添加到有权限的组中。先切换到 root 用户,再切换到  gitlab-runner 用户:
1
2
$ sudo su - 
$ su gitlab-runner
  • 上面的配置实现的是 dev 分支推送代码之后会执行 deploy_dev 里面的操作。 test 分支推送代码之后会执行 deploy_test 里面的操作。
  • 最后一行脚本是结合钉钉的群机器人做一个回调通知,告诉大家测试环境代码已经更新,非常方便。

总结

GitLab 已经是一个互联网企业的标准配置了,免费,功能强大。这篇文章主要是记录自己在公司搭建 GitLab 的过程,包括基本安装,nginx 的配置,配置邮件服务以及 GitLab CI 的使用。