使用 Drone CI 自动编译APK

自从有自己的服务器之后,啥都想挂上去、自动化啥的。Drone CI 是一个开源的自托管自动测试交付平台,依托Docker。

安装

官网都是有文档的,我这里用的自托管的Gitea,如果使用Github或者其他平台请自行查看文档参数,另外Docker的安装我这里就不赘述了。

首先是服务端(Server),用来提供前端页面并控制运行端:

docker run -v=/var/lib/drone:/data\ # 映射数据目录到本地
 -e=DRONE_GITEA_SERVER={Gitea的主页地址}\
 -e=DRONE_GITEA_CLIENT_ID={从Gitea生成的OAuth2 ID}\
 -e=DRONE_GITEA_CLIENT_SECRET={从Gitea生成的OAuth2 secret}\
 -e=DRONE_SERVER_HOST={Drone前端的主机名,不加协议}\
 -e=DRONE_SERVER_PROTO=https\ # 协议
 -e=DRONE_RPC_SECRET={用于和Runner沟通的secret,必须与Runner端相同}\
 -p=443:443\ # 映射端口,可以映射到其他端口,然后用nginx反代
 --restart=always\ # 自动重启
 --detach=true\ # run在后台
 --name=drone drone/drone:1

然后你就可以访问地址看看了,正常的话会跳转的你设定的托管站进行OAuth登录认证,然后你就可以看到你的仓库列表了。

当然,我们还没安装完,刚刚是服务端,现在我们需要安装运行端(Runner)才能运行我们的命令。Runner有不同类型,详情见文档,我这里使用的是Docker Runner。

docker run -v /var/run/docker.sock:/var/run/docker.sock\
  -e DRONE_RPC_PROTO=https\ # 服务端协议
  -e DRONE_RPC_HOST={服务端主机名}\
  -e DRONE_RPC_SECRET={用于和Runner沟通的secret,必须与Server端相同}\
  -e DRONE_RUNNER_CAPACITY=2\ # Runner的并发pipeline数量,默认为2,可以根据情况酌情更改,太高会炸
  -e DRONE_RUNNER_NAME=local\ # 当前Runner的名称,给Server端用的
  --restart always \
  --detach=true\ # run在后台
  --name runner drone/drone-runner-docker:1

现在我们就安装完了,可以使用了

SDK

打开一个Android项目,我们先处理下SDK的问题,因为我没有找到合适的自带SDK的镜像,所以就用Gradle现下好了。但是有个问题,现下的SDK需要你同意协议,不然不让你用,所以我们需要手动存一个License。

首先在项目目录下创建一个sdk的目录作为之后编译的 ANDROID_HOME ,然后将你本地SDK目录下的licenses复制进来即可。

配置

Drone的配置文件是YAML格式的,置于项目根目录。文件名默认为 .drone.yml,可以在Server端更改。

kind: pipeline
type: docker
name: default

platform:
  os: linux
  arch: amd64

steps:
  - name: build
    image: gradle #使用Gradle镜像
    environment:
      ANDROID_HOME: /drone/src/sdk
        # /drone/src 就是项目根目录。这里把SDK的环境变量设定一下,确保license生效
    commands:
      - chmod +x gradlew
        # 赋予Gradle执行权限
      - ./gradlew assembleRelease --stacktrace
        # 编译apk,"assemble编译类型",--stacktrance 打印栈
    when:
      event:
        - tag
          # 仅在打标签时编译,不然每次commit都要编译一次

    # 我这里将编译的apk发到Gitea的release里去
  - name: release
    image: plugins/gitea-release
    settings:
      api_key:
        from_secret: API_KEY
          # 这里时用server端的secret加密了的
      base_url: https://…… #Gitea的主页地址
      files:
        - app/build/outputs/apk/release/app-release.apk
      prerelease: true
    when:
      event:
      - tag

trigger:
  event:
    - tag
      # 确保整个pipeline只在tag时触发

提交编译

闲置我们可以尝试提交编译了,但是因为我设置了trigger,所以需要打标签才能触发。建议使用Git flow保持健康的流程管理。

提交后不需要刷新服务端网页,它会自动获取状态,可以点开查看详细的编译过程。

发布评论

您的邮箱地址不会被公开。 必填项已用 * 标注