有许多重复性的工作,我们每天都必须做。而且它们可能有点无聊,困难,和单调。
但是,与其在这些日常任务上劳心劳力,你可以把它们委托给别人,让别人或其他东西为你做这些事情。这样,你就可以有更多的时间来做你想做的事情。你可以有时间来放松。
如果你曾经开发过一个Android应用程序,你就会知道一些任务会变得多么乏味:
- 运行测试
- 在合并新的代码时,确保应用程序可以编译
- 构建和发布应用程序。
那么,我们应该把这些任务传给谁呢?另一个同事?他们可以直接把它转交给其他人,而这不会释放任何人的时间。另外,我们也不想让我们的同事感到无奈。解决办法是什么?
向GitHub Actions问好。👐
什么是GitHub动作?
GitHub 动作是当我们的仓库中发生某些事情时可以触发的命令。行动的核心是一个配置文件,其中有一个描述命令的列表。
- 需要发生什么
- 什么时候应该发生
这个配置文件是YAML格式(.yml),一个例子看起来像这样:
name: My GitHub Action
on: pull_request
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
让我们来分析一下上面的例子:
- 我们给我们的行动起一个名字(我的GitHub行动)[可选)
- 我们标明这个动作应该何时运行(当拉动请求被打开时)
- 我们启动一个任务列表(工作),一旦这个动作被触发就会发生。
- 第一个是构建 动作
- runs-on命令告诉 GitHub 哪个运行器将执行这个作业(这是一个虚拟服务器,你可以在 Windows/Mac/Linux 之间进行选择)
- 每个作业都可以有很多阶段,这些阶段由步骤 关键字来分组
- uses关键字告诉脚本要执行什么行动
这是一个非常简短的例子,并没有展示GitHub Actions的所有功能,但它提供了对配置文件结构的窥视。
在接下来的章节中,我们将创建一些有助于保持开发周期高效的行动。
请注意,所有的 GitHub 动作文件都需要放置在你的项目主文件夹下,路径为 .github/workflows。

如何为拉动请求创建GitHub动作
无论你是单独工作还是作为团队的一员,确保你的应用程序是稳定的是至关重要的。因此,当你考虑合并一个拉动请求时,确保你的应用程序能正常编译,所有测试都能通过是完全有意义的。
在我们的例子中,我们已经展示了如何检查我们仓库中的代码。在这个动作中,我们将包括以下步骤:
- 设置JDK版本
- 改变虚拟环境的权限
- 运行测试(如果我们有的话)
- 构建应用程序
name: Android Build
on: pull_request
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set Up JDK // 1
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Change wrapper permissions // 2
run: chmod +x ./gradlew
- name: Run Tests // 3
run: ./gradlew test
- name: Build Project // 4
run: ./gradlew assemble
你可以看到,在上面,每个步骤都有它自己的属性和具体的属性。
我就不一一介绍了,因为你可以通过文档自己去做。大多数步骤的共同点是run关键字。这个属性说明要执行什么命令。
✋ 我们需要第二个步骤,以便虚拟环境能够运行gradle命令。没有它,它将无法运行。
如何制作发布应用程序的GitHub动作
一旦你第一次发布了你的应用程序,重新发布它就变得有点像一件苦差事。
你必须确保版本升级,建立APK,通过Google Play Console提交,以及其他繁琐的任务。
我们可以用另一个GitHub动作来自动完成这个过程。这个动作比前一次要复杂一些,因为它需要使用GitHub Secrets。
简而言之,GitHub Secrets是一种将敏感信息作为仓库的环境变量来存储的方法。我们将需要使用它们,因为:
- 我们需要对我们的应用程序进行签名
- 我们要给这个行动以权限,将我们构建的应用提交给Google Play商店。
让我们先了解一下如何创建GitHub Secrets。
- 在你的仓库的主页内,点击设置 标签

- 在左手边的菜单上,会有一个名为秘密的选项

- 要创建一个秘密,请按下新建仓库秘密 按钮

现在我们把这个问题解决了,让我们看看发布应用程序的脚本:
name: Android Publish
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set Up JDK
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Change wrapper permissions
run: chmod +x ./gradlew
- name: Run Tests
run: ./gradlew test
- name: Build Project
run: ./gradlew build
- name: Build Release AAB // 1
run: ./gradlew bundleRelease
- name: Sign AAB // 2
uses: r0adkll/sign-android-release@v1
with:
releaseDirectory: app/build/outputs/bundle/release
signingKeyBase64: ${{ secrets.SIGN_KEY }}
alias: ${{ secrets.ALIAS }}
keyStorePassword: ${{ secrets.STORE_KEY_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
- name: Deploy to Play Store // 3
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{secrets.SERVICE_ACCOUNT}}
packageName: com.tomerpacific.laundry
releaseFiles: app/build/outputs/bundle/release/app-release.aab
track: production
你可能已经注意到,这个动作将在workflow_dispatch上运行。这是什么意思?基本上它允许从GitHub本身手动触发这个动作。
当然,你也可以决定宁愿在主分支发生推送时运行这个动作(例如)。
在上面的片段中,标有1的步骤会触发构建我们的应用程序的.aab。然后,就像我们在Android Studio中构建它一样,我们必须签署这个.aab文件。
这是GitHub的秘密首次发挥作用。我们需要为以下内容创建秘密:
- 签名密钥 (secrets.SIGN_KEY)
- 密钥别名 (secrets.ALIAS)
- 存储密钥密码 (secrets.STORE_KEY_PASSWORD)
- 钥匙密码(secrets.KEY_PASSWORD)。
一旦我们签署了.aab文件,我们就可以将其部署到Google Play商店。在这一步,还有一点工作要做,因为我们需要允许这个GitHub Action有在Google Play上为我们部署应用的权限。但是,等等,我们该怎么做呢?我们使用一个服务账户。
如何创建一个服务账户
服务账户是你创建的一个实体,它告诉与之互动的服务或应用程序,它是代表你来操作的。
在我们的例子中,我们的GitHub Action要与Google Play Store互动,这样它就可以上传我们应用程序的新版本。
要创建一个服务账户,请到Google Cloud Console去。如果你在那里没有账户,请确保创建一个。然后,在主页面的左侧菜单中,会有一个名为服务账户的列表项。

一旦你点击了它,在窗口的右侧,你将看到你已经拥有的任何服务账户。
我们想创建一个新的账户,在窗口的顶部有一个按钮可以做到这一点。

在打开的窗口中,你必须输入服务的名称,你也可以输入描述:

这里给出的名称将是这个服务账户的唯一标识符。
在第二步,你将被要求给这个服务账户一个角色。从 "选择角色 "下拉菜单中,选择 "基本"→"编辑"。

最后,在第三步中,在 "授予用户访问此服务帐户 "部分的两个地方填写你的电子邮件:

按下完成按钮后,你将需要为这个服务账户创建一个密钥。该行动将使用这个密钥来被Google Play识别。
要创建密钥,请点击服务账户主屏幕中行动标签下的三个横点。在出现的菜单中,选择管理密钥:

在这个窗口中,我们将通过选择 "新钥匙"按钮并从出现的菜单中选择 "创建新钥匙 "来创建一个钥匙:

现在我们可以选择新钥匙的格式--默认是JSON,我们将保持选择,点击创建:

一旦你这样做了,一个文件将被下载到你的电脑。请确保保留这个文件,因为它有与你的服务账户相关的所有数据,而且你将无法再次下载它。
我们将采用这个文件的内容,然后用它创建一个GitHub秘密(secrets.SERVICE_ACCOUNT**)。
最后但并非最不重要的是,我们需要让Google Play知道这个服务账户。这样做需要我们登录到我们的Google Play控制台账户,然后前往设置→API访问。
如果你向下滚动该页面,你会看到一个名为服务账户的部分。你应该能够看到你之前创建的服务账户。点击授权访问链接

在打开的设置中,前往应用程序权限。在这里,你将选择这个服务账户与哪些应用程序互动。
在账户权限下,发布 部分下的所有内容都应该被选中。我强烈建议你看一下所有其他的设置,并自己决定你想留下什么检查或者你想勾选什么。
一旦你完成了,点击位于右下角的邀请用户按钮。

邀请发出后,我们就可以运行发布到存储的动作了。
如何在 GitHub 中监控我们的行动
要看你的仓库定义了哪些动作,请点击动作标签。这个标签展示了所有定义的工作流程和已经运行的工作流程。

在左手边,你可以看到所有已经定义的操作,在右手边,你可以看到所有已经运行的操作。如果你想看一个特定的行动,你可以点击它。

如果该动作被定义为在工作流_调度上运行,你会看到一个按钮,使你能够运行它(如上图所示)。
如果你想看一个工作流程的具体运行情况,你也可以在工作流程主页面上点击其中一个运行情况来实现。如果其中一个动作运行失败,这将是调查的地方,看看哪里出了问题。
我们的第一个动作应该是在拉动请求被打开时触发的。如果它工作正常,你应该看到这个。

这就是你所拥有的!
总结
读到这里已经很长时间了,但我们已经完成了为你的应用程序创建持续集成和持续部署管道所需的一切。