title


今天拿手头一个 GitHub 项目实验了一下在线的集成服务,前后试用了 TravisCI, CircleCIAppVeyor。由于测试工程内包含了一些使用了 WPF 的 C# 代码,前面两个跑在 Linux/Mono 上不是很友好,而 AppVeyor 的配置非常顺利,与 GitHub 的互操作也没有任何问题,所以完成之后记录一下备忘。

基本流程

首先将 AppVeyor 跟 GitHub 绑定后,就可以点击项目主页上的“ + New Project ”添加工程了。

new_project

添加工程之后,需要到 Settings 里面做一些对应的配置。这里择要说一下吧。


General 一栏中,有一个变量是生成的版本字符串,通常在后面打包时会用到。{build} 是一个自增长的序列号。

cfg01

Environment 一栏中,比较重要的是 Init script 和 Install script 的区别——简单说,前者发生在 git clonegit checkout 前,后者发生在它们之后。

cfg02

如果像测试工程那样在库中包含 submodule,就需要在 Install script 内做 git submodule update (如上图)

Build 一栏中的各种选项应该是不需要解释,程序员都很熟悉了。

Artifacts 一栏中,如果指定的是目录, AppVeyor 会自动打成 zip 包,包名就是 Deployment Name,在这里可以用上前面的版本字符串。

cfg03

接下来是最后也是最重要的一栏 —— Deployment。 如果前面的步骤都很顺利,这一步就会把生成并打包好的文件发布出去。由于我的测试项目在 GitHub 上,这里我就选了 GitHub Releases (需要填入 GitHub authentication token)。注意这里需要明确指出待发布的 Artifacts 列表。

这里有一项是 Draft Release(以草稿方式发布)比较有用,发布的内容只有当手动确认后才会公开出现在 GitHub 项目的 Releases 栏内,以免造成误发布。

deploy03

以 draft 方式发布在 GitHub 上后效果如上图。


好了,如果一切顺利的话,至此 AppVeyor 已完成了 从获取代码,编译,打包,部署到 GitHub ,并以 GitHub Release 方式发布 的整个流程,还算简单吧。注意,在整个过程中,无需自己手写一句 git, make, msbuild, zip, copy 等各种内部和外部的命令,甚至连 solution file (*.sln) 都不需要手动指定,俺觉得总体上还是非常简洁的。


状态显示(Status Badge)

有了持续集成的服务以后,最自然的想法是给项目加上当前集成状态的标示。有了这个东东,任何查看项目的人都能第一时间获知集成的状态,不良提交造成 build break 的情况就能迅速得到重视和修复。

badge

如何添加可以看这个页面


控制部署的触发

默认情况下 AppVeyor 是每个提交都会编译和部署的,也就是说,如果没有错误,每一次提交最终都会触发一次发布(Release)。而大多数时候我们需要的实际上是“每次提交的时候都编译,但只有指定的版本才触发部署”。读了一下文档,我发现这个需求可以通过 APPVEYOR_REPO_TAG 这个环境变量(仅在 push 了包含 tagged commit 之后为真)来实现。

具体做法如下图所示,在 Deployment 的选项里新增一个部署条件(Add deployment condition)判断一下 APPVEYOR_REPO_TAG,就可以做到只有打 tag 的提交才触发部署了。

deploy1

打完之后测试了一下,这是一个 untagged commit 的行为,嗯,一切正常。

deploy2


最后好奇看了一下针对 public projects 的收费版的价格,每个月 $29.5。不过俺觉得免费版日常已经基本够用了。



Gu Lu

Comments
Write a Comment
  • 994129509 reply

    博主您好,我用appveyor 打包完成的项目,在github的仓库上看不到打包完成的包,请指教

  • 994129509 reply

    Creating "0.1.1" release for repository "shijianzhong/wx-electron" tag "0.1.1" commit "970401a3fc00e04f791918151fc7b0f8f2f3857f"...Skipped - release with tag "0.1.1" already exists

    No artifacts were published. Make sure you have specified correct artifacts filter.

    Updating "0.1.1" release for repository "shijianzhong/wx-electron" tag "0.1.1" commit "970401a3fc00e04f791918151fc7b0f8f2f3857f"...OK

Tags

游戏开发   随笔   Programming   C/C++   优化   Unity   C++   知乎   游戏设计   比特币   Unity3D   区块链   软件开发   引擎设计   系统架构   Production   idtech   中国文化   加密货币   项目管理   Bitcoin   游戏评论   资源管理   资源流水线   效率   道德经   网络   方法论   模板编程   Blockchain   Lua   Blockchain Computing   Oculus   GDC   渲染   VR   PerfAssist   Unity MemoryProfiler   BCH   经济学   信息过载   行业报告   字体   Productivity   图形   网络编程   Dice   协程   EMC   Premake   测试   中间件   Game Engine   新手引导   区块链游戏   Methodology   CI   命令行解析   goroutine   ndk   Ethereum   nanomsg   自动化   Scripting   摘录   Debugging   同步技术   cppcon   C++模板   DOOM3   技术评估   Unity GC   C++11   学习方法   Surface Pro 3   Engine Evaluation   CRT   文化   笔记   golang   图形编程   多线程   ETH   Bitcoin Cash   cppcon14   Bitcoin SV   Visual Studio   Unity Coroutine   跨语言可变参数列表   团队协作   货币   Deployment   Visual Assist   工程改进   Michael Abrash   exp   开放世界   域名   虚拟现实   系统重构   slua   遮挡剔除   完美转发   协作式调度   Modern C++   类型推导   Memory Debugging   个人成长   小故事   BTC   暴雪   产品   历史   错误处理   Unity Profiler   MOD  

知识共享许可协议
本作品由Gu Lu创作,采用知识共享Attribution-NonCommercial-NoDerivatives 4.0 国际许可协议进行许可。