趁着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) : 自定义机器人的webhok
notice_type
(required) : 机器人类型:dingtalk
,feishu
message_type
(required) : 消息类型:text
,markdown
notice_secret
: 如果设置了加签
, 可以把你的加签密钥填入此项完成加签操作。message_at_all
: 是否At
所有人message_at_mobiles
: 你需要@的群成员的手机号,多个时用英文逗号(,
)分隔 , 目前只支持dingtalk
message_title
: 标题,只支持markdown
message_content
: 内容,支持占位符[]
替换,支持当前所有环境变量debug
: debug模式,打印env
等信息custom_started
开始时间环境变量,如:DRONE_BUILD_STARTED
custom_finished
完成时间环境变量,如:DRONE_BUILD_FINISHED
CUSTOM_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