持续集成工具,属于我们程序员的美国队长

1,262

提到美国队长,我们联想到的应该是一名二战时期的老兵,冰封70年之后回到现实世界,却能带领一个由神和天才科学家组成的队伍。他的领袖气质、人格魅力吸引了复仇者们,他心中的善良和正义让他可以拿起雷神之锤。若说复仇者联盟中的超级英雄们哪一个最具有完美的品质,美队当之无愧。

每个程序员心中应该都有一个美队,他是完美主义的化身,追求极致的体现。程序员写代码追求没有bug,追求易于修改,追求代码健壮,追求快速发版。。。,但有时候人力有时穷,我们需要依靠外部工具,持续集成相信我们大多数程序员都不陌生,用过的人应该都会说

当然了,也不排除有些人没接触过,或者说听过没用过。不过都没关系,今天给大家详细讲解Github官方推出的持续集成工具--Github Action,指引大家从头搭建自己的持续集成工具栈,想看另一个大牌集成厂商Travis CI的移步这里,Travis CI研究后感悟,当然也可以结合一起看,如果能给大家带来一点点参考和启发,我写文章的目的就达到了。

持续集成(英文:Continuous integration),简称CI,百度词条显示:“持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。”。作为开发人员应该很好理解,我们在代码中一处微小的改动都可能引发bug,有可能影响到整个产品的使用,如果没监控好流到线上去,就真的要拿程序员祭天了😇😇😇。所以我们需要监控从修改到发布这中间的所有环节,但假如由人力来完成,既不现实也容易出错,所以CI出现了,它只需要我们前期做好配置,中间检查环节它会帮我们完成,甚至直接发布,作为iOS开发人员,我们应该还是比较头痛一会这个测试过来要版本测试,一会那个测试过来要版本测试,会严重打乱我们自己的计划和思路。

背景交代完,下面开始一步步指引大家使用Github Action,有时间的同学可以看看官方网址,里面有部分是中文文档,还是比较便于阅读的。时间不多的同学,可以照着下面文档做,实现一键发布应该是没问题的。

首先我们新建一个仓库

仓库里新建一个我们iOS的工程项目,提交

在GitHub仓库页面点击Actions,看到如下图所示,因为Github Action有官方workflow脚本,但目前还没有iOS的,仅仅是针对语言的,所以我们看到仓库检测到我们是swift代码,提示我们可以安装这个,虽然不是iOS的,不过没关系,我们先Set up这个,后面我们慢慢修改。

点完之后,我们看到下图,其实是在“.github/workflows”路径下创建了一个.yml文件,这个就是我们的脚本文件,Github也是根据有无这个文件来进行hook,hook住了执行脚本代码。那么现在的脚本代码是swift编译的,我们后面要改成iOS的。现在我们先提交,后面留着慢慢改,慢慢研究。

提交后,我们发现Action报错了,因为脚本不对嘛,很正常。

我们拉取最新代码后看本地文件,我们找到swift.yml文件,打开我们准备修改。

我们不必仔细研究YAML语法,当然感兴趣有时间的同学可以看看阮一峰老师的YAML 语言教程,没时间的同学可以参考我写的,知道大概意思就可以了。

#脚本名字
name: iOS Build

#触发时机
on: [push]

#工作流程
jobs:
  build:
    name: Build phase
    runs-on: macOS-latest
    strategy:
        matrix:
            destination: ['platform=iOS Simulator,OS=13.2.2,name=iPhone 11']
    steps:
    #抓取代码,用别人写好的
    - uses: actions/checkout@master
    #自己写设置SSH Keys脚本
    - name: Setup SSH Keys and known_hosts for fastlane match
      #环境变量,预先设置,在Github页面Settings/Secrets路径下添加,secrets.PRIVATE_KEY就是secrets路径下命名为PRIVATE_KEY的环境变量
      env:
         PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
         PUBLIC_KEY: ${{ secrets.PUBLIC_KEY }}
         HOST: ${{ secrets.HOST }}
           #  Copied from https://github.com/maddox/actions/blob/master/ssh/entrypoint.sh
      #把这些环境变量设置到远程服务器,这样远程服务器就跟你本地电脑有一样的权限了,不然部署会有问题
      run: |
        SSH_PATH="$HOME/.ssh"

        mkdir -p "$SSH_PATH"
        touch "$SSH_PATH/known_hosts"

        echo "$PRIVATE_KEY" > "$SSH_PATH/id_rsa"

        chmod 700 "$SSH_PATH"
        ssh-keyscan github.com >> ~/.ssh/known_hosts
        chmod 600 "$SSH_PATH/known_hosts"
        chmod 600 "$SSH_PATH/id_rsa"

        eval $(ssh-agent)
        ssh-add "$SSH_PATH/id_rsa"

    - name: fastlane build and pgy deploy
      #执行别人写好的fastlane脚本,根据需要配置
      uses: maierj/fastlane-action@v0.10.0
      with:
        #执行我们写好的pgy命令
        lane: 'pgy'
        subdirectory: 'fastlane'
      env:
        #用match自动管理证书
        MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}

fastlane脚本如下


default_platform(:ios)

platform :ios do

  create_keychain(
      name: "CI",
      password: ENV["MATCH_PASSWORD"],
      default_keychain: true,
      unlock: true,
      timeout: 3600,
      lock_when_sleeps: false
  )
  match(
        git_url: "git@github.com:zhusongyu/certificates.git", 
        type: "adhoc", 
	readonly: true, 
	app_identifier: "com.zsy.actiondemo",
      	keychain_name: "CI",
      	keychain_password: ENV["MATCH_PASSWORD"]
	)
  sh("security list-keychains -d user") 
  sh("security default-keychain -d user")
  sh("security find-identity -v -p codesigning CI")

  lane :pgy do
    xcode_select("/Applications/Xcode.app")
    gym(xcargs: "-UseNewBuildSystem=YES",
        scheme: "GithubActionDemo",
	project: "GithubActionDemo.xcodeproj",
	export_method: "ad-hoc",
      	export_options: {
          compileBitcode: false,
        }  
     )
    pgyer(api_key: "92c0423f53102ddf1f06a92bd0f2fb86", user_key: "4ae6cbc1ef990ff47453be759d93d306",password: "123456", install_type: "2")

    # firim(firim_api_token:"392bc7f0f92622ec086cb47be760b054")
  end
end

因为用到了fastlane,所以把Gemfile文件放进来

Gemfile文件内容如下

source "https://rubygems.org"

gem "fastlane"
# gem 'cocoapods'

plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)

脚本配置好,接下来我们把环境变量设置一下,找到文件路径.ssh,这是一个隐藏文件,需要按cmd+shift+.显示隐藏文件,把这三个文件里面的内容复制到对应key

添加完如下图所示

因为我们用到了match自动管理证书,所以需要创建一个专门管理证书的仓库,详细可参考match使用文档,或者参考这篇中文文档,简单概述如下

1、新建certificates私有仓库

2、在项目文件夹下执行 fastlane match init

3、生成一个Matchfile文件,然后执行 fastlane match adhoc

4、生成adhoc证书

5、查看仓库已经生成最新证书

6、把Xcode自动管理证书关掉,选用我们刚刚生成的证书,证书配置结束

因为我们会在远程服务器创建钥匙串,所以会有一个钥匙串密码,我们也添加到环境变量中,密码自己设置

配置到这里应该就结束了,直接提交代码到远程仓库,应该就可以触发脚本,我提交代码的时候,Info.plist文件没有提交上去,跟我一样没提交的同学补一下即可。最后我是部署到蒲公英的,可以看到我们已经成功打包发布。

感兴趣的同学赶快自己动手试一下吧,我知道你们都在家里学蛆一样在爬呢😂😂😂,趁着疫情宅在家摸索一些有趣的东西吧😁😁😁

最后还是希望疫情赶快结束吧,武汉加油,中国加油🇨🇳🇨🇳🇨🇳