Github项目使用多CI构建指南

起因

我最近在捣鼓电子书,用python写了一个脚本转换工具,写的脚本为了使用方便,用pyinstaller打包,生成多平台(macos、linux、windows)的执行文件。打包出windows可执行文件需要在windows上编译,不同平台的可执行文件需要在不同的平台上编译,三个平台打包下来。收集文件后再一个个上传到github的releases,真的是非常麻烦,本来我只是想写个脚本省事,结果却因为打包上传耗费大量的时间。

怎么解决这个问题呢?项目放在github上面,在github上面有一些免费的CI服务,
比如travis-ci、appveyor等构建服务。
写的项目放在github上面,github上面有一些开源的免费的CI服务

convert-ebook这个是工具项目的地址,大家可以参照我的配置,配置自己的多平台构件

构建服务介绍

我使用travis-ci、appveyor这两个解决了构建问题。CI服务使用配置文件执行构建项目。
下面我就以我写的工具为例介绍,如何使用两个服务自动构建项目。
使用travis-ci构建linux、macos版本的可执行文件,使用appveyor构建windows可执行文件

travis-ci

travis-ci网址 https://travis-ci.org ,打开后直接使用github登录就行,按提示添加项目就行。

使用.travis.yml文件组织构建,文件需要存放在项目根目录,如图

-w309

travis-ci支持linux、macos镜像,多种语言、构建工具打包项目。

贴配置

# 管理员权限
sudo: required
# 使用python环境
language: python
# python版本
python:
  - "3.5.1"
matrix:
  # 使用的系统镜像(osx、linux)
  include:
    - os: osx
      # travis-ci osx镜像使用python3有问题,会导致构建失败。这里使用generic覆盖上面的python
      language: generic
    - os: linux

# 执行安装前,用shell做的一些额外的操作。这里用来处理osx python版本的问题
before_install: |
  if [ "$TRAVIS_OS_NAME" == "osx" ]; then
    # 我测试了ci的osx镜像,发现存在python3,我需要python指向的版本是2的
    sudo ln -f $(which python3) $(which python)
    sudo ln -f $(which pip3) $(which pip)
    python --version
  fi
# 准备需要的构建环境
install:
  # 安装需要使用依赖包
  - pip install threadpool
  # 安装构建工具
  - pip install pyinstaller
# 构建项目
script:
  - pyinstaller ./convert-ebook.py -F --add-data ./lib/kindlegen:lib/kindlegen
  - mv ./dist/convert-ebook ./dist/convert-ebook-$TRAVIS_OS_NAME
# 发布项目
deploy:
  # 标志发布到github的releases
  provider: releases
  # 发布使用的文件或目录
  file: "dist/convert-ebook-$TRAVIS_OS_NAME"
  # 发布到github需要使用的token
  api_key: $api_key
  # 跳过清理文件 发布文件时,一定要配置为true
  skip_cleanup: true
  # 如果发布时,存在相同的tag版本,继续上传
  # 这一步很关键,多个构件发布releases,存在相同tag会写入到该releases中
  overwrite: true
  # 触发条件,
  on:
    branch: master
    # 必须存在tag时才能发布
    tags: true

appveyor

appveyor网址 https://ci.appveyor.com ,打开后直接使用github登录就行,按提示添加项目就行。
appveyor支持用windows、ubuntu等镜像

需要使用appveyor.yml文件组织构件,文件需要存放在项目根目录,如上一张图

environment:
  matrix:
    - PYTHON: "C:\\Python36"
      PYTHON_VERSION: "3.6.x" # currently 3.6.5
      PYTHON_ARCH: "32"
# 安装python
install:
  - ps: if ($env:APPVEYOR_PULL_REQUEST_NUMBER -and $env:APPVEYOR_BUILD_NUMBER -ne ((Invoke-RestMethod `
      https://ci.appveyor.com/api/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG/history?recordsNumber=50).builds | `
      Where-Object pullRequestId -eq $env:APPVEYOR_PULL_REQUEST_NUMBER)[0].buildNumber) { `
      throw "There are newer queued builds for this pull request, failing early." }
  - ECHO "Filesystem root:"
  - ps: "ls \"C:/\""

  - ECHO "Installed SDKs:"
  - ps: "ls \"C:/Program Files/Microsoft SDKs/Windows\""

  # Install Python (from the official .msi of https://python.org) and pip when
  # not already installed.
  - ps: if (-not(Test-Path($env:PYTHON))) { & appveyor\install.ps1 }

  # Prepend newly installed Python to the PATH of this build (this cannot be
  # done from inside the powershell script as it would require to restart
  # the parent CMD process).
  - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
  - "python -m pip install --upgrade pip"
  - "%CMD_IN_ENV% pip install pyinstaller"
  - "%CMD_IN_ENV% pip install threadpool"
# 构件脚本
build_script:
  # Build the compiled extension
  - ps: "ls"
  - "%CMD_IN_ENV% pyinstaller ./convert-ebook.py -F --add-data lib/kindlegen;lib/kindlegen"
test_script:
  - ps: "ls dist"
# 如果要发布文件,这里一定配置
artifacts:
  - path: dist/*.exe
deploy:
  - provider: GitHub
    auth_token:
      secure: Iw3T58CTmwWRa79KqeIZ/ZE9qXBQD2mTaIa4mK3Hp/4id+igJqEC4GePD5MhCAxS
    prerelease: false
    # 多构件环境下需要为true
    force_update: true
    # 发布条件
    on:
      # 存在tag时,才能上传。这个和master是冲突的,配置时二选一
      APPVEYOR_REPO_TAG: true

多构件组合

我是坑过来的。。。。。。最开始的时候没有配置发布时的限制条件deploy.on,push了一次,两个构件构件项目后,会发布到releases。又会重新触发构件事件,然后死循环了。来来回回推了50多个release,一个一个删的我要吐血。

现在说一些配置的关键点

  • 使用git的tag功能,当需要发布的时候,打tag,推送到仓库。构件上传时会根据该次提交的id去匹配对应的tag进行release发布。
  • 打tag要写描述,描述会作为release的描述。git tag release-v1.0.0 -m "tag描述"
  • CI服务要配置在tag事件才能发布
    • travis-ci deploy.on.tags: true
    • appveyor deploy.on.APPVEYOR_REPO_TAG: true
  • 发布时要打开强制上传,不能存在releases就失败了。
    • travis-ci deploy.overwrite: true
    • appveyor deploy.force_update: true
  • 不同环境下打包上传的文件名不要相同,否则会覆盖掉

使用appveyor配置上传的文件如下,官方文档描述发布github有坑

# 这里必须配置
artifacts:
  - path: dist/*.exe
    name: myartifacts
deploy:
  - provider: GitHub
    # 这里是可选
    artifact: myartifacts

这是我发布出来的效果图


-w334

结语

我在这里简单介绍了两种ci的基本配置,主要将怎么组合多种构件共同发布release。
如果你想了解配置你需要的构建环境,请查看它们的官网文档,里面有不同环境的模板。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342