Gitlab 与 Jenkins
大型项目开发可以使用 Gitlab + Jenkins
的方式,前者作为代码仓负责代码的管理,后者是一个自动化的持续集成环境,可以完成各种自动化构建、测试、部署的任务。两者结合起来就能实现开发者提交代码到 Gitlab
, Jenkins
以一定频率自动运行测试的工作,提升团队效率。
Gitlab
是基于Ruby On Ralis
的一个开源版本管理系统,实现一个自托管的 Git 项目仓库。Jenkins
是一个开源的持续集成系统,方便开发者利用图形化界面进行项目部署发布等固定操作,通常也会和Gitlab
配合起来,在git push
完成后触发设定好的操作,例如将代码部署到某个开发环境中。Jenkins
本身是用 Java 开发的,需要 jdk 的环境。
通过 Gitlab
和 Jenkins
这两个常用的开源项目,便可搭建自己的代码管理工具和自动化部署平台。
值得注意的是,当前较新版本的 gitlab 自身已经完全能够胜任 CI/CD 功能。
gitlab/ci
集成在 gitlab 里,配合上 gitlab-runner
就可以跑CI了。
有兴趣的可以尝试下由 gitlab 完成整个代码的开发,测试,部署,发布的流程。
Gitlab
gitlab安装 可以参考这篇,版本不是那么新,有些许差异。
# 可以找到最新的版本
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu/pool/xenial/main/g/gitlab-ce/gitlab-ce_11.10.0-ce.0_amd64.deb
# 安装
dpkg -i gitlab-ce_11.10.0-ce.0_amd64.deb
打开 /etc/gitlab/gitlab.rb
文件进行基础设置,所有的核心设置均在这个文件中。
打开浏览器输入服务的IP地址即可访问,注意如果服务器上之前有 web 服务器在运行的话要关闭,比如 Apache
。
$ sudo /etc/init.d/apache2 start
$ sudo /etc/init.d/apache2 restart
$ sudo /etc/init.d/apache2 stop
采用简易的方法进行域名解析,最好用DNS服务器。
- 打开
c:\Windows\System32\drivers\etc\hosts
,增加新的一条记录。内容是 gitlab服务器的 IP 地址以及域名。 - 在Internet属性配置面板里选择局域网设置->代理服务器->高级->对 gitlab 服务器的域名添加一条例外,即对该域名不使用 proxy 代理服务器进行处理。刷新windows的DNS解析,
ipconfig /flushdns
。
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
...
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
# 增加一条记录指明 gitlab 服务器 IP 地址与域名的对应关系,一个IP可以对应多个域名
gitlab 服务管理命令
# 启动所有 gitlab 组件:
gitlab-ctl start
# 停止所有 gitlab 组件:
gitlab-ctl stop
# 停止所有 gitlab postgresql 组件:
gitlab-ctl stop postgresql
# 停止相关数据连接服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
# 重启所有 gitlab 组件:
gitlab-ctl restart
# 重启所有 gitlab gitlab-workhorse 组件:
gitlab-ctl restart gitlab-workhorse
# 查看服务状态
gitlab-ctl status
# 生成配置并启动服务
gitlab-ctl reconfigure
gitlab 安装细节
主配置文件: /etc/gitlab/gitlab.rb
GitLab 文档根目录: /opt/gitlab
默认存储库位置: /var/opt/gitlab/git-data/repositories
GitLab Nginx 配置文件路径: /var/opt/gitlab/nginx/conf/gitlab-http.conf
Postgresql 数据目录: /var/opt/gitlab/postgresql/data
gitlab 存储位置 帮助链接。
默认存放在:/var/opt/gitlab/git-data/repositories
一般我们会更改到另外独立的目录进行存储,例如 /data/git-data。
mkdir -pv /data/git-data
chown -R git:git /data/git-data #修改创建目录的属主和属组为git用户
sudo vim /etc/gitlab/gitlab.rb
# 启用git_data_dirs参数,并修改path到需求的目录。
git_data_dirs({
"default" => {
"path" => "/var/opt/gitlab/git-data" #"/mnt/nfs-01/git-data"
},
})
Once you set the multiple storage paths,
you can choose where new projects will be stored via the Application Settings in the Admin area.
Note that Omnibus stores the repositories in a repositories subdirectory of the git-data directory.
gitlab邮箱配置
这里没有使用 postfix
,采用 SMTP
的方式配置邮件服务器来发送。如果邮件服务器不支持SSL/TLS加密的话采用下面这种关掉相应的TLS选项的方式进行配置,更多请参考 gitlab邮件配置。
### Email Settings
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'system.notice@qq.com'
gitlab_rails['gitlab_email_display_name'] = 'gitlab.notice'
gitlab_rails['gitlab_email_reply_to'] = 'system.notice@qq.com'
gitlab_rails['gitlab_email_subject_suffix'] = 'gitlab'
### GitLab email server settings
###! Docs: https://docs.gitlab.com/omnibus/settings/smtp.html
###! **Use smtp instead of sendmail/postfix.**
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "system.notice@qq.com"
gitlab_rails['smtp_password'] = "xxxxx"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = false
gitlab_rails['smtp_tls'] = false
gitlab_rails['smtp_openssl_verify_mode'] = 'none'
邮件测试
gitlab-ctl reconfigure
gitlab-rails console
irb(main):002:0>Notify.test_email('destination_email@address.com', 'Message Subject', 'Message Body').deliver_now
注意点:
- 配置
gitlab_rails['smtp_openssl_verify_mode'] = 'none'
可以解决ssl certificate 验证不通过问题。 - gitlab_email_from 以及 smtp_address 两栏根据服务器的支持情况,可以选择配置成不一样的,如果出现
550 5.7.1 Client does not have permissions to send as this sender
的错误的话就配成一样就可以了。
配置 HTTPS 访问
生成自签名的 .key .crt
,生成方法请参考。
把上述.key以及.crt放置到 /etc/gitlab/ssl
目录下。
修改gitlab.rb
的 external_url
为 https
,修改。之后重启 gitlab
即可。
nginx['enable'] = true
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.verify.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.verify.com.key"
在比较新的Chrome浏览器上,有如下的注意点,生成的证书要带SAN。
错误:“主题备用名称缺失”或 NET::ERR_CERT_COMMON_NAME_INVALID 或“您的连接不是私密连接”
在传输层安全性 (TLS) 连接期间,Chrome 浏览器会进行检查以确保网站连接使用的是有效、受信任的服务器证书。
Chrome 58 及以上版本只会使用 subjectAlternativeName 扩展程序(而不是 commonName)来匹配域名和网站证书。
主题备用名称可以是域名,也可以是 IP 地址。如果证书没有正确的 subjectAlternativeName 扩展程序,
系统就会向用户发送 NET::ERR_CERT_COMMON_NAME_INVALID 错误消息,告知他们连接并非处于私密状态。
如果证书缺少 subjectAlternativeName 扩展程序,系统就会在 Chrome DevTools 的“安全”面板中显示警告,
告知用户主题备用名称缺失。
如有必要,您可以针对 Chrome 65 以下版本设置 EnableCommonNameFallbackForLocalAnchors 政策。
这样一来,Chrome 就会在缺少 subjectAlternativeName 扩展程序的情况下使用证书的 commonName 来匹配主机名。
Chrome 里点击 Settings->Advanced->Privacy and security->Manage certificates。把证书导入到受信任的根证书颁发机构。也可以打开运行,运行命令certmgr.msc
,展开树以转到 受信任的根证书颁发机构 | 证书。右键“所有任务”,导入证书。
创建一个project的后续操作
要获得访问gitlab的权限,需要在gitlab的账户里添加SSH key。
key的生成方法见下。如果不是用IP地址直接访问的,注意添加 hosts 条目进行域名解析。
ssh-keygen -t rsa -b 4096 -C your_email
cat ./ssh/id_rsa.pub
Command line instructions
You can also upload existing files from your computer using the instructions below.
Git global setup
git config --global user.name "xxx"
git config --global user.email "xxx"
Create a new repository
git clone git@xxx.git
cd xxx
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
Push an existing folder
cd existing_folder
git init
git remote add origin git@gitlab.verify.com:hongmengOS/hm-verify-kernel.git
git add .
git commit -m "Initial commit"
git push -u origin master
Push an existing Git repository
cd existing_repo
git remote rename origin old-origin
git remote add origin git@gitlab.verify.com:hongmengOS/hm-verify-kernel.git
git push -u origin --all
git push -u origin --tags
gitlab 配置
为了和 Jenkins 能够实现互联,需要对 gitlab 进行一定的配置。
上传公钥, 个人以及Jenkins 拉取代码使用
下载上传代码如果使用 SSH 协议的话需要上传用户的公钥。本质是使用 SSH 登录到 gitlab。
点击用户头像,settings里点击 SSH Keys,上传访问的公钥。
通常开发服务器以及CI服务器是分开的,所以需要两个密钥对,个人开发服务器以及 Jenkins 所在服务器的密钥对生成这里就不介绍了。
创建 webhook 来触发 Jenkins
在 project 页面点击 Settings-> Integrations
。
URL 填写规则是
http://USERID:APITOKEN@JENKINS_URL/project/YOUR_JOB
可参考 https://github.com/jenkinsci/gitlab-plugin 进行 gitlab 端的配置。
这部分相当于上面链接里介绍的 GitLab-to-Jenkins authentication
。因为是 gitlab 来触发 jenkins 完成构建。为了防止恶意用户触发构建,需要对 gitlab 进行凭据管理。方法是由 jenkins 提供一个 Secret Token
。
注意,URL使用 ip:port 的方式比较好,不要使用域名,不然可能会报错 XXX hostname XXX
注意,使用 Token 以后,原来那个用户就没办法使用用户名密码的方式登录到 Jenkins了
Configuring global authentication
- Create a user in Jenkins which has, at a minimum, Job/Build permissions
- Log in as that user (this is required even if you are a Jenkins admin user), then click on the user’s name in the top right corner of the page
- Click ‘Configure,’ then ‘Show API Token…’, and note/copy the User ID and API Token
- In GitLab, when you create webhooks to trigger Jenkins jobs, use this format for the URL and do not enter anything for ‘Secret Token’:
http://USERID:APITOKEN@JENKINS_URL/project/YOUR_JOB
- After you add the webhook, click the ‘Test’ button, and it should succeed
Configuring per-project authentication
If you want to create separate authentication credentials for each Jenkins job:
- In the configuration of your Jenkins job, in the GitLab configuration section, click ‘Advanced’
- Click the ‘Generate’ button under the ‘Secret Token’ field
- Copy the resulting token, and save the job configuration
- In GitLab, create a webhook for your project, enter the trigger URL (e.g. http://JENKINS_URL/project/YOUR_JOB) and paste the token in the Secret Token field
- After you add the webhook, click the ‘Test’ button, and it should succeed
Disabling authentication
If you want to disable this authentication (not recommended):
- In Jenkins, go to Manage Jenkins -> Configure System
- Scroll down to the section labeled ‘GitLab’
- Uncheck “Enable authentication for ‘/project’ end-point” - you will now be able to trigger Jenkins jobs from GitLab without needing authentication
URL的格式上面已经介绍了,根据需要是否填写每个JOB的 Secret Token。Triggers选择触发 webhook 的事件,Jenkins 那边也可以配置成响应某些事件。
获取 gitlab API token 用于 Jenkins 返回状态给 gitlab
Gitlab API token
在 gitlab 里用户头像,注意这个用户至少应该是项目的 'Developer’以上权限的拥有者。
点击 setting
,在这里创建一个 access token
,然后给 Jenkins 使用。注意这里的 token 关闭或者刷新这个页面就没了,所以抓紧拷贝。这里相当于gitlab-plugin介绍 里的 Jenkins-to-GitLab authentication
一节。
最好是创建一个 gitlab 公共账号,这样 Jenkins 返回状态显示的就是这个公共账号了。
不然就会像下图一样使用了某个不太合适的用户回复 Jenkins 信息。
具体的操作页面如下
生成得到的 Personal Access Tokens
sudo ln -s /opt/apache-maven-3.3.9/ /opt/maven
export M2_HOME=/opt/maven
export M2=$M2_HOME/bin
export PATH=$M2:$PATH
mvn -version