欢迎光临散文网 会员登陆 & 注册

项目经验分享|Curve社区 陈欣怡:勇敢小白与死线战士

2023-10-31 14:59 作者:开源之夏  | 我要投稿


开源之夏个人专访与项目经验分享持续开放中,欢迎已从开源之夏毕业或正在参与开源之夏活动的学生、导师一同加入专访行动,扫描文末二维码填写专访问卷,与大家分享你眼中的开源之夏!

本期项目经验分享来自Curve社区中选学生——陈欣怡,在开源之夏2023中承担的项目是支持编译指定的cc_library

# 关于 Curve 社区

Curve是网易自主设计研发的高性能、易运维、云原生的分布式存储系统,目前提供块(CurveBS)和文件(CurveFS)两种存储方式。CurveBS支持快照克隆和恢复,支持QEMU虚拟机和物理机NBD设备两种挂载方式。CurveFS基于Fuse支持POSIX文件系统接口。

官网:https://www.opencurve.io/


# 项目基本信息

项目名称:支持编译指定的cc_library

项目导师:Wine93

项目描述:Curve目前的Makefile只支持 cc_binary 的编译。

curve$ make
## list
Usage:
    make list stor=bs/fs
Examples:
    make list stor=bs

## build
Usage:
    make build stor=bs/fs only=TARGET dep=0/1 release=0/1 os=OS
Examples:
    make build stor=bs only=//src/chunkserver:chunkserver
    make build stor=bs only=src/* dep=0
    make build stor=fs only=test/* os=debian9
    make build stor=fs release=1

希望开发者对 Makefile 进行修改,支持编译指定的 cc_library。

参与者需要熟悉基本的 shell 脚本编程,熟悉 bazel 编译,熟悉 Makefile。

项目链接:https://summer-ospp.ac.cn/org/prodetail/232990062


项目开发经验分享

项目实现总思路

第一步:了解前置知识,阅读并理解原仓库相关代码

第二步:在image和物理机中分别实现cc_library的编译

第三步:相关makefile修改,添加编译选项和注释

第四步:pr修改-格式修改、debian版本的编译参数传递等

项目实现细节

源码理解

get_options():解析命令行参数和选项

list_target():列出目标编译对象

build_target():构建目标,并建立target和result的对应

具体源码解读不在此赘述。

实现cc_library的编译

  • 实现list_target函数

    实现思路:该函数目标列出所有编译对象,使用bazel query实现。目标是找出所有包括cc_library编译对象的主目录即为成功。

    首先,对于已有代码,也即cc_binary的实现做分析。

    参考社区中“Curve源码解读”文档辅助架构理解后,理解bs和fs文件所在,添加代码如下

                print_title " SOURCE TARGETS "
        bazel query 'kind("cc_binary", //src/...)'
        bazel query 'kind("cc_binary", //tools/...)'
        bazel query 'kind("cc_binary", //nebd/src/...)'
        bazel query 'kind("cc_binary", //nbd/src/...)'

        bazel query 'kind("cc_library", //include/...)'
        bazel query 'kind("cc_library", //src/...)'
        bazel query 'kind("cc_library", //nebd/src/...)'
        bazel query 'kind("cc_library", //nbd/src/...)'

        print_title " TEST TARGETS "
        bazel query 'kind("cc_(test|binary)", //test/...)'
        bazel query 'kind("cc_(test|binary)", //nebd/test/...)'
        bazel query 'kind("cc_(test|binary)", //nbd/test/...)'

        bazel query 'kind("cc_library", //test/...)'
        bazel query 'kind("cc_library", //nebd/test/...)'
        bazel query 'kind("cc_library", //nbd/test/...)'

    elif [ "$g_stor" == "fs" ]; then
        print_title "SOURCE TARGETS"
        bazel query 'kind("cc_binary", //curvefs/src/...)'
        bazel query 'kind("cc_library", //curvefs/src/...)'

        print_title " TEST TARGETS "
        bazel query 'kind("cc_(test|binary)", //curvefs/test/...)'
        bazel query 'kind("cc_library", //curvefs/test/...)'
    fi
  • 实现build_target

    实现思路:同上,使用bazel query实现cc_library的编译项的扫描。

# test
# PRINT TO CHECK
    bazel query 'kind("cc_(test|binary|library)", //... -//curvefs/...)'
    bazel query 'kind("cc_(test|binary|library)", //... -//curvefs/...)' | grep -E "$g_target"
    for target in "${target_array[@]}"
    do
        echo "$target"
    done
    exit
target_array=($(bazel query 'kind("cc_(test|binary|library)", //... -//curvefs/...)' | grep -E "$g_target"))
target_array=($(bazel query 'kind("cc_(test|binary|library)", //curvefs/...)' | grep -E "$g_target"))

makefile修改

在之前开发的过程中,我遇到了失败编译项目的情况,因此在makefile中添加了相关注释,帮助之后的新手开源者入门Curve。

build curvebs/ build curvefs: 需要先编译依赖项,在编译Curve项目。即需要先进行make dep,在进行make build。或者使用make build dep=1。

make playground: Curve社区提供了docker容器,省去开发者配置环境的困扰。

## build curvebs
    make build stor=bs dep=1
    make dep stor=bs && make build stor=bs

## build curvefs
    make build stor=fs dep=1
    make dep stor=fs && make build stor=fs

## dep
## configure dependency(before build)
    Usage:
        make dep stor=bs/fs
    Examples:
        make dep stor=bs
    
## playground
## create/run a container, changes outside will be mapped into the container
    Usage/Example:
        make playground

实现debian版本的参数传递

实现思路:参数传递,解析参数,变量更改

parse_cfg() {
    local args=`getopt -o v: --long version: -n "playground.sh" -- "$@"`
    eval set -- "${args}"
    while true 
    do
        case "$1" in
            -v|--version)
                g_container_image="$2"
                shift 2
                ;;
            --)
                shift
                break
                ;;
            *)
                exit 1
                ;;
        esac
    done
}

项目结果呈现

运行 make ci-build stor=bs only=//src/chunkserver/datastore:chunkserver_datastore

运行 make ci-build stor=fs only=//curvefs/src/metaserver:curvefs_metaserver

遇到的问题以及解决方案

虚拟机/Docker容器联网问题

在docker中运行make ci-build stor=bs,然后发现容器中没有联网

Vmware Workstation Pro17 ubuntu20.04配置方法

  1. 查看主机客户端(比如clash),在general中打开allow LAN

  2. vmware workstation 17 pro 网络适配器NAT模式

  3. 在主机终端上执行ipconfig查看VMnet8的ipv4地址,如192.168.xx.xx

  4. 记录下clash中https对应的端口号,如7890

  5. 在虚拟机终端中执行export https_proxy=192.168.xx.xx:7890

  6. 执行echo $https_proxy查看是否设置成功

  7. 执行curl -v https://www.google.com

提醒:每个终端都要配置一遍,重启失效

playground重置

bazel clean
make build stor=fs dep=1
cat .obm.cfg
## eixt docker
docker rm -f curve-build-playground-master
vim .obm.cfg
## change debian9 to debian11, try to recompiler in the docker
make playground
make ci-build stor=fs dep=1

后续工作安排

在参加ospp后,我也在持续关注Curve社区的开发者活动,会继续参加Curve社区的建设。

以及将在后期完成由rust语言编写的容器管理项目:https://github.com/quas-modo/obm。


# 参与过程

回想这段第一次参与开源社区活动的经历,我想我会用这样两个词来概括:勇敢小白与死线战士

故事开始在今年的四五月份,好友提起了开源之夏这项活动,丰厚的奖金、开源社区的参与经历、工业级大型项目的接触经历等等都深深地吸引着我们。虽然一早就决定要申请试试,但由于当时繁重的课业,加上让人没有头绪的琳琅满目的社区和项目,我们纷纷犯了拖延症,一直到接近提交项目申请尾声的时候。

这是死线战士的第一次斗争。

考虑到编码水平,我主要在Basic项目中寻找,而根据个人的技术栈和兴趣,我选择了java、c++、compile、machine learning作为主要的寻找对象。但当时开始联系导师得太晚,这才意识到学长在经验分享中的“尽早联系”“尽早开始了解”的含义,很多学生会在项目公示之后就寻找自己感兴趣的项目并联系导师,了解项目并进行社区的一些good issue的尝试,而导师也会在此过程中确定人选。

但我并不想就此放弃机会,因此我还是联系了感兴趣的项目导师。好在得到Curve社区的wine93老师的肯定答复,我快马加鞭地了解社区背景、项目背景、技术栈,在三天之内和老师交流初步想法并撰写提交了项目计划书。这个过程其实是比较惊险的,说实话,我对于项目要求的bazel、shell脚本撰写并不很熟悉,对于项目的具体目的也是一头雾水,但我仔细阅读相关文档、查阅资料,理解源码意思,和导师交流初步想法以及确认初步想法的正确后,完成了一份较为详尽的项目申请书,也帮助我最终中选了Curve社区的实现指定cc_library编译的任务。

我勇敢地跨出了第一步,并尽可能地把握住机会。但当死线战士并不是个好的习惯,如果我没有收到wine93老师的回复,那我可能就丧失了这一宝贵的锻炼机会。

之后的六月,进入了期末周和等待项目入选学生公示的阶段。

而七月和八月,由于个人精力分配出现的问题,支教、比赛、交流的事情接踵而来,我并没有做到原先预期的多线程开发,而是拖慢了整体项目推进的进度,我对此真的感到抱歉,在此期间我主要了解了docker、云原生、Curve社区的一些相关知识。普通人大多数时候,只能踏踏实实地做好一件事,如果再有机会参与开源之夏,我将保证自己在暑假留有更充足的精力进行开发。

真正上手开始编码,则是到了九月初。

这是死线战士的第二次斗争。

复杂的环境、大型项目文件、虚拟机的网络环境、不时出现的报错问题等等都让我有些焦虑、不安,怀疑自己真能按时提交pr并完成项目吗?疑虑和犹疑向来不能解决问题。我知道我面对的是一个相对简单初级的项目,而我所剩的时间绝对足够完成这个项目。带着这样的信念,我选择了沉下心来解决问题、编写代码。遇到问题时,我会先选择google和gpt解决我的问题,但是遇到一两天都没有头绪的问题,我还是会叨扰我的mentor。在此很感谢wine93老师的耐心解答和悉心教导。在提交和合并pr的过程中,我还第一次接触大型ci测试,以及学习了git的各种进阶用法,虽然刚开始学习的时候有些无助,但我还是最终解决了这些问题,最终完成了pr的merge。

虽然我在其中多数时候赶着ddl,但我认识到了提前量的重要性,提前联系导师,或许能申请到更合心意的项目,规划好项目计划按时完成甚至提前完成,给自己更轻松的掌控感,也防止工作量超出预期无法完成任务。下一次,就不再当一个死线战士啦。

回顾这段经历,我要感谢开源之夏组委会和Curve社区提供的平台,感谢wine93老师的指导,感谢我的同伴给予我参加的勇气,感谢在deadline之前仍然认真勇敢沉下心来做事的自己。在这次项目中,我第一次合并pr,第一次摆脱玩具项目,第一次对于开源这件事有了初步的认识

我想,完成了这个项目,我的开源之路才刚刚踏上征程。


# 开源之夏个人随访

--自我介绍--

OSPP请简单介绍一下自己,并说一下自己的开源经历吧。

陈欣怡大家好~我是南京大学软件工程专业的陈欣怡,在本次开源之夏中我参与的Curve社区的初级项目,是我第一次参与开源社区,接触开源,在浏览社区的贡献者文档、查看之前的issue和pr中、和社区贡献者的交流中,我打破了对开源社区的畏惧心理,觉得参与开源是一件由浅入深、小白也可以逐步上手的事情

OSPP你眼中的开源是什么样的?据了解,你所在的高校开源氛围颇为浓厚,你认为参与开源对于计算机专业的大学生来说是必要的吗?

欣怡在我眼里的开源,也许是程序员的一种浪漫吧,开源社区构建了一个生态,人们可以查阅、修改代码,可以提出bug和issue暴露缺陷,也可以提供pr解决问题,自主、自由、开放地开发。

我觉得开源对于计算机专业地大学生来说不是必要的,但是是很推荐去参与的。最初参与的途径可以是ospp这样的暑期活动,也可以各个社区组织的开发者活动,也可以是自己感兴趣的good first issue。参与开源好处多多,提升个人代码能力和解决问题的能力,提升对于工业级项目和大型项目的认知,为自己的简历增添履历等等。

OSPP参与开源项目开发实践与在课堂上进行的实践学习有什么不同?

欣怡课堂的实践学习通常都比较小型、基础、有退路,而开源项目比较大型、复杂,遵守严格的开发规范和开发流程,是需要实际投入使用和与别人交互的代码

--参与开源之夏--

OSPP在开源之夏的项目开发过程中,你有遇到什么困难或挑战么?你是如何克服的呢?有哪些收获?

欣怡由于个人技术栈并不完全符合项目要求,一开始在理解项目和构建项目环境上有些困难,通过不断学习、阅读文档、google等方法,尝试自己解决问题。当然,有些自己实在解决不了的还是会询问导师,很感谢温柔、悉心指导的wine93老师。其实说实话,由于之前做的都是课程项目或者团队项目,遇到自己解决不了的问题,再不济也可以问大腿朋友。但这次是独立开发,最需要最能够依靠的还是自己,在这次经历中,也许才真正具备了程序员的基本素养之一——独立解决问题的能力。阅读报错信息、抓住关键问题、询问搜索引擎和生成式AI,用别人提出的各种方式尝试解决问题的感觉真的很好。

OSPP对于在活动中选择社区、挑选项目、与导师沟通、撰写申请书方面,有什么经验或建议可以分享给大家么?

欣怡在寻找合适项目、提交项目申请书的方面,最建议做到的是,尽早搜寻,尽早投递,尽早交流。在我这次申请的过程中,就犯了ddl战士的老毛病,拖到了最后一刻。在琳琅满目的项目中四处搜寻,最后撰写项目申请书也比较匆忙。如果有意向报名开源之夏的话,建议在项目公布之后,就迅速寻找感兴趣的项目,及时联系导师,然后着手做一些社区的good first issue了解社区,然后充分地撰写自己的项目申请书。总之,不要做死线战士,留足提前量啦

--寄语--

OSPP有什么话想对计划参加开源之夏活动的学弟学妹们说?

欣怡带着敢于尝试、勇于交流提问、认真钻研思考的心勇敢地往前冲吧,参与开源最难的,也许是迈出第一步的勇气。


END

专栏编辑:大梦

校对:校大山、陈欣怡

制图:GoodWhite


专栏投稿请联系开源小助手:kaiyuanzhixia 或专栏编辑:Hungryfish34(备注“专栏投稿”加速通过),或填写下方专访信息收集问卷。






项目经验分享|Curve社区 陈欣怡:勇敢小白与死线战士的评论 (共 条)

分享到微博请遵守国家法律