趁着618搞活动,以极低的价格买了一个云服务器。想着折腾点什么。发现可以自己搭一个git服务器。
开始的时候我试着装了装Gitlab。因为Gitlab CE版本是开源免费的,而且看到有些企业也在用。装上去运行后发现2核2G的云服务器直接卡死了,连ssh都登录不了。
后来又发现了gitea。这是一个轻量的git服务器。虽然没有gitlab那么多功能,但占用内存极少。在2核2G的云服务器上运行甚是欢快。
下面记录了安装和折腾过程。enjoy~~
安装Gitlab
拉取gitlab的docker镜像
1 | docker pull gitlab/gitlab-ce:latest |
新建一个存放gitlab的目录
1 | mkdir -p ~/docker/docker_gitlab |
新建配置文件
1 | cd ~/docker/docker_gitlab |
将下面的内容贴进去。其中xx.xx.xx.xx需要修改成自己机器的ip地址。
1 | version: '3.1' |
启动Gitlab
1 | sudo docker-compose up -d |
关掉Gitlab
1 | docker-compose down |
重启docker
1 | systemctl restart docker |
查看启动日志
1 | docker-compose logs -f |
云服务器中设置gitlab端口放行

查看gitlab的root用户的初始密码
进入到gitlab容器内部
1 | docker exec -it gitlab /bin/bash |
查看root初始密码
1 | cat /etc/gitlab/initial_root_password |
参考:
5分钟搭建自己的代码托管平台gitlab
https://zhuanlan.zhihu.com/p/387979095
选择gitea来搭建git服务器
相比较与gitlab,gitea则轻量很多。在我买的服务器都不能流畅运行gitlab后,果断投入了gitea的怀抱。gitea的轻量和快速让我非常惊讶。下图展示了它的内存占用。

这可比动辄吃掉3个多G的gitlab要来的清爽。
但是针对大型企业还是会选择gitlab的。因为它是一个大而全的东西。gitea因为轻量,势必会缺少一些功能。但对于个人和小团体来说已经是够用了。gitea官方有一张与gitlab的功能对比表。可以查看下面的网址了解一下。
https://docs.gitea.io/zh-cn/comparison/
安装gitea
使用docker来安装
在服务器中新建一个存放gitea数据的目录。
1 | mkdir -p /usr/local/docker/docker_gitea |
新建一个docker-compose.yml文件
1 | version: "3" |
使用下面的命令启动gitea
1 | docker-compose up -d |
更新gitea版本
只需要更新docker-compose.yml中的版本号。
1 | image: gitea/gitea:1.16.8 |
查询gitea是否启动
1 | docker-compose ps |
查看gitea启动的log
1 | docker-compose logs |
需要在云服务器中的防火墙设置里打开相应的端口,此处是3000和222。

使用nginx设置反向代理
每次访问gitea服务都在url后面加3000端口确实不太好看,也不方便。所以这里使用nginx反向代理。
ubuntu20安装nginx (云服务器里安装的ubuntu20.04)
1 | sudo apt update |
安装好后nginx会自动启动,可以用下面的命令查询nginx的状态
1 | sudo systemctl status nginx |
这时直接用浏览器访问服务器IP就可以看到nginx的欢迎界面了。

配置反向代理
nginx 配置文件都在/etc/nginx/目录下。
修改nginx的配置文件/etc/nginx/nginx.conf,配置反向代理。
添加下面的内容到http下。
配置可参考:https://www.runoob.com/w3cnote/nginx-setup-intro.html
1 | server { |
默认情况下,nginx 有一个上传单个文件大小限制,上传大于限制大小的文件会返回 413 错误,其大小限制默认值为 1MB。
报错信息:
1 | Enumerating objects: 8, done. |
所以在上面的配置中加了client_max_body_size 100M;,以便修改这个限制。
检测配置文件语法是否正确
1 | sudo /usr/sbin/nginx -t |
重启nginx
1 | sudo /usr/sbin/nginx |
重新加载配置
1 | sudo /usr/sbin/nginx -s reload |
停止nginx
1 | sudo /usr/sbin/nginx -s quit |
配置gitea服务器的域名
打开docker_gitea/gitea/gitea/conf/app.ini文件。
修改DOMAIN、SSH_DOMAIN和ROOT_URL的值。
1 | [server] |
修改好后就可以保存,然后重启gitea。
关闭gitea
1 | docker-compose down |
启动gitea
1 | docker-compose up -d |
设置域名解析
在腾讯购买域名后就可以使用DNSPod工具设置域名解析了。

这里设置的git是域名的前缀,可以以此来区分不同的服务。记录值中填写服务器的公网IP。
这时我们就可以通过域名直接访问gitea服务器了。
设置容器ssh直连
目前可以使用http来克隆和推送代码了。但是容器的ssh接口映射到了主机的非标准接口,所以无法使用ssh来克隆和推送代码。
官方提供的设置的说明,可参考下面的链接。
https://docs.gitea.io/zh-cn/install-with-docker/#ssh-%E5%AE%B9%E5%99%A8%E7%9B%B4%E9%80%9A
数据迁移
如果想把git仓库的数据迁移到另外的服务器中,需要把gitea打包好拷贝到新的服务器中。

同时mysql的备份需要先进入到mysql的docker环境中。
1 | docker exec -it 2f986a21f76c /bin/bash #2f986a21f76c 为docker container id |
使用下面的命令备份数据库
1 | mysqldump -uroot -pgitea --all-databases>all.sql |
恢复数据库时,先启动gitea 的docker环境,让其生成mysql文件夹。

然后把之前备份好的all.sql文件拷贝到mysql文件夹中。
查看启动好的mysql docker id
1 | docker ps -a |
进入到mysql的docker环境中后进入到/var/lib/mysql目录中。
1 | cd /var/lib/mysql |
运行下面的命令恢复数据库
1 | mysql --default-character-set=utf8mb4 -u 'root' -p <all.sql |
提示输入密码时输入gitea。
最后在gitea/gitea/conf/app.ini文件中重新配置一下gitea的域名。就是下面的SSH_DOMAIN、DOMAIN和ROOT_URL。

参考https://docs.gitea.cn/en-us/administration/backup-and-restore/
搭建Drone CI
Drone的官方文档:
Drone是一个基于Docker技术的轻量CI/CD工具。它分为两个部分server和runner。server主要是对接Git服务器,获取仓库内容并解析pipeline文件。runner则运行pipeline文件中定义的内容。有多种runner可以使用。具体的介绍可以参考下面的网址:
https://docs.drone.io/runner/overview/

比较常用的runner是Docker Runner。该runner会拉取相应的docker镜像,然后在镜像中运行定义的内容。
值得一提的是,runner是可以不和server运行在同一台服务器上的。多个runner也可以分别在不同的服务器上运行。
安装drone server
根据实际情况,修改下面的脚本并在云服务器上运行即可。
获取GITEA_CLIENT_ID和GITEA_CLIENT_SECRET
在gitea中添加一个OAuth2 Applications,以便Drone可以使用它访问gitea。

需要注意的是,Redirect URI中的域名需要添加login。并且如果域名申请的了SSL证书(可在DNSPod中操作),则使用https。
获取SHARED_SECRET
使用下面的命令生成一个shared_secret
1 | openssl rand -hex 16 |
使用脚本安装drone server
将上面获取到的内容修改到下面的脚本中。给脚本添加执行权限,然后运行即可。
1 |
|
安装Docker Runner
根据实际情况,修改下面的脚本并在云服务器上运行即可。
这里的SHARED_SECRET跟上面安装server使用的要保持一致。
AGENT_SERVER_HOST就是drone server的域名。
修改好下面的脚本内容,添加执行权限然后运行即可。
1 |
|
编写pipeline
参考网址:
https://docs.drone.io/quickstart/docker/
默认情况下,执行pipeline时会在前面加上clone操作。

pipeline示例:
下面的示例显示了如何使用飞书来发送构建信息。
1 | kind: pipeline |
设置飞书机器人
我们可在聊天群添加飞书机器人。
在群设置里,添加BOTS。

这里添加自定义机器人。这个类型的机器人可以使用webhook来交互。
将生成的Webhook URL设置到插件中即可。上面的示例是使用的drone secret。这个需要在drone server中配置。

feishu插件参数 plugin params
notice_access_token(required) : 自定义机器人的webhoknotice_type(required) : 机器人类型:dingtalk,feishumessage_type(required) : 消息类型:text,markdownnotice_secret: 如果设置了加签, 可以把你的加签密钥填入此项完成加签操作。message_at_all: 是否At所有人message_at_mobiles: 你需要@的群成员的手机号,多个时用英文逗号(,)分隔 , 目前只支持dingtalkmessage_title: 标题,只支持markdownmessage_content: 内容,支持占位符[]替换,支持当前所有环境变量debug: debug模式,打印env等信息custom_started开始时间环境变量,如:DRONE_BUILD_STARTEDcustom_finished完成时间环境变量,如:DRONE_BUILD_FINISHEDCUSTOM_BUILD_CONSUMING: 构建时间(秒)
使用Sonarqube扫描C/C++语言的项目
SonarQube的下载链接:
https://www.sonarqube.org/downloads/
SonarQube提供了下面多个版本。个人用途的话可以使用开源免费的社区版本。但是社区版本是不支持C/C++扫描的。好在有大神做了一个插件来解决这个问题。

基于Docker安装SonarQube
- 拉取
docker镜像
1 | docker pull sonarqube:8.9.9-community |
注意:当前的长期支持版为8.9.9,所以这里拉取这个版本。
- 新建一个
docker_sonarsqube目录,并在里面创建一个docker-compose.yaml文件。写入下面的内容。
1 | version: '3.1' |
- 启动
sonarqube
1 | docker-compose up -d |
查看启动过程的log
1 | docker logs -f sonarqube |
启动sonarqube时可能会报下面的错误。

解决办法是,在/etc/sysctl.conf文件中添加下面的内容。
1 | vm.max_map_count=262144 |
运行下面的命令使设置生效
1 | sudo sysctl -p |
- 访问
sonarqube服务器
因为测试时是在自己电脑上安装的,所以可以访问http://127.0.0.1:9000来登录sonarqube服务器
默认账户和密码
1 | 账户: admin |
登录后需要修改密码。
- 配置界面为中文

- 安装扫描
C/C++的插件
插件的下载网址:
https://hub.fastgit.xyz/SonarOpenCommunity/sonar-cxx/releases
注意:这里放置的为github的代理网站,以便下载速度更快。原网址是https://github.com/SonarOpenCommunity/sonar-cxx/releases
亲测,sonarqube-8.9.9版本可以使用下面版本的插件。

将下载好的jar包放置在目录中的extensions/plugins文件夹中。
重启sonarqube就能生效了。
然后更新一下C++的扫描规则

可以看到规则数是0。我们需要点击右上角的按钮新建一个profile。

然后点击下面的标记的按钮添加规则。

可以看到左边是规则的类别,右边是列出的规则。然后选择想要的规则并激活。

批量激活插件中包含的规则

可以看到规则已经加好了。

设置自定义的profile为默认。

sonarqube默认是关闭c++文件的探测。需要如下图所示设置需要探测的c++文件后缀。

- 下载安装
SonarScanner
下载网址:
https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/
解压后移动到系统目录
1 | mv sonar-scanner-4.7.0.2747-linux /opt/sonar-scanner |
添加执行文件路径
1 | echo 'export PATH="$PATH:/opt/sonar-scanner/bin"' >> ~/.bashrc |
1 | source ~/.bashrc |
修改配置
1 | vim /opt/sonar-scanner/conf/sonar-scanner.properties |
如果sonarqube是安装在本地的,下面的url就写localhost。如果是安装在云服务器上就写服务器的ip。
1 | sonar.host.url=http://localhost:9000 |
执行扫描
首先需要在sonarqube服务器上配置一个project。然后就能得到下面的命令。在需要扫描的目录下运行下面的命令即可。扫描结果可在服务器的网页上查看。
1 | sonar-scanner \ |
注意:第一次运行时需要下载东西会比较慢。
https://techexpert.tips/sonarqube/sonarqube-scanner-installation-ubuntu-linux/
- 静态代码分析
本机安装cppcheck
1 | sudo apt-get update && sudo apt-get install cppcheck |
使用cppcheck来检查代码
1 |
|
基于docker的cppcheck
1 | docker pull neszt/cppcheck-docker |
将cppcheck集成到drone中
在.drone.yml文件中添加下面的内容。
1 | - name: cppcheck |
然后在sonarqube中设置报告的路径

注意,报告的名称要跟.drone.yml文件中保持一致。
参考:
http://www.manongjc.com/detail/29-yxqbaowgctqxpxq.html
https://blog.csdn.net/weixin_44025546/article/details/111303183