内容转载自个人博客java
对于普通的github仓库,只须要在根目录建立.github/workflows/
文件夹便可自动使用Actions功能,具体执行的操做能够建立一个配置文件(命名不限),如build_apk.yml
Github Actions产品对公开仓库是彻底免费的,对私人仓库每个月有2000分钟使用时间,详细说明见费用。另外,github有许多官方已经实现好的actions能够供用户直接调用,用户只需用设置参数便可
每一个配置文件称为一个工做流程(workflow),每一个工做流程能够包含多个做业(job),每一个做业能够包含一系列的步骤(steps),每一个step能够称为action,能够认为这是三个层级android
这里以项目WhuHelper为例,介绍如何使用YAML语法和Github Actions功能git
build test
、build app-debug.apk
)之后的文件版本为4ef2e90,只须要关注文件build_apk.yml便可,其余文件无变化app-debug.apk
、建立仓库的release(只包括代码,且只在push tag
时触发)、为这次release添加apk文件,文件版本为20fe364,只须要关注文件build_apk.yml便可,其余文件无变化主要涉及到的操做为:设置workflow及如下层级的每一个操做名字、设置workflow的触发条件、建立多个job、job的条件执行、调用别人写好的actions、本身为某个step设置输出参数供其余步骤调用、持久化build的结果、上传build的结果供用户下载、下载build的结果供下一步操做使用、多个job之间传递数据、多个step之间传递数据、使用环境变量
实例build_apk.yml
文件内容及解析以下:github
name: Auto build debug apk # 设置workflow的触发条件 # 在pull和push到主分支时触发workflow # 在push tags时触发workflow on: pull_request: branches: - 'master' push: branches: - 'master' # 在push tag时触发 tags: - '*' # workflow的全部做业job jobs: # 单个job的名字:测试Android项目 # 每一个job执行完毕会默认删除全部文件等 # 可经过cache来保留特定文件夹和文件 # 也可以使用upload-artifact上传来实现保留文件,再配合download-artifact实现多job之间的数据传递 test: # test这个做业的实际名字 # 也是执行build时Actions监控处显示的名字 name: Run Unit Tests # job的运行平台,还有windows、macos及不一样版本可供选择 runs-on: ubuntu-18.04 # test任务的具体步骤,能够有不少个步骤,都写在这里 steps: # 使用别人写好的指定版本的actions脚本,名称是checkout # 这是步骤1,即每一个'-'符号到下一个'-'符号之间的部分是一个步骤 - uses: actions/checkout@v2 # 这是步骤2,建立java环境,with里面填写actions的输入参数 - name: set up JDK 1.8 uses: actions/setup-java@v1 # 设置setup-java脚本的输入参数 with: java-version: 1.8 # 步骤3,执行shell命令 - name: Unit tests run: bash ./gradlew test --stacktrace apk: name: Generate APK runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v2 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build debug APK run: bash ./gradlew assembleDebug --stacktrace # 利用upload-artifact实现build结果的保存(能够在Actions的控制台下载压缩文件) - name: Upload APK uses: actions/upload-artifact@v2 with: # 设置压缩文件的名称,在控制台会获得WhuHelper-debug.zip文件的下载连接 # 下载后解压缩,里面直接能够看到app-debug.apk,没有其余东西 name: WhuHelper-debug path: app/build/outputs/apk/debug/app-debug.apk deploy: name: Upload Release Asset # 依赖上一个job needs: apk runs-on: ubuntu-latest # 只在tag时执行,即在本身终端运行如下代码后才会触发 # git tag -a v0.1.0 -m "release 0.1.0 version" # git push origin –-tags if: contains(github.ref, 'tags/') steps: # 本身编写的shell命令 # 学习如何设置单个任务的输出来被其余任务调用 - name: Prepare Release # 设置id通常是为了其余step调用本步骤的输出 id: prepare_release run: | TAG_NAME=`echo $GITHUB_REF | cut -d / -f3` echo ::set-output name=tag_name::$TAG_NAME - name: Download build result for job apk # 只有上一步获取到tag_name才继续,下载前面apk任务里面的WhuHelper-debug.zip文件 # 自动解压缩到当前文件夹,自动删除原压缩文件 # 多任务之间的数据交换 if: steps.prepare_release.outputs.tag_name uses: actions/download-artifact@v2 with: name: WhuHelper-debug - shell: bash # 手动更改apk名字 run: | mv app-debug.apk app-debug-${{steps.prepare_release.outputs.tag_name}}.apk # 发布release,版本号是用户git push的tag里面的版本号,发布的只有代码压缩包(与手动默认发布一致) - name: Create Release id: create_release # 只有上一步获取到tag_name才继续 if: steps.prepare_release.outputs.tag_name uses: actions/create-release@v1 env: # GitHub 会自动建立 GITHUB_TOKEN 密码以在工做流程中使用 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # 设置时区,默认是格林尼治时间 # TZ: Asia/Shanghai with: tag_name: ${{steps.prepare_release.outputs.tag_name}} release_name: Release ${{steps.prepare_release.outputs.tag_name}} by zfb draft: false prerelease: false # 这一步是对上一步发布的release文件的补充,调用github api上传一个apk文件 - name: Upload Release Asset id: upload-release-asset # 只有create_release成功获得输出才继续 if: steps.create_release.outputs.upload_url uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: ./app-debug-${{steps.prepare_release.outputs.tag_name}}.apk asset_name: app-debug-${{steps.prepare_release.outputs.tag_name}}.apk asset_content_type: application/vnd.android.package-archive
coding.net
主要包括如下步骤:docker
访问令牌
,授予仓库权限,假设名字为GITHUB_AUTO_DEPLOY
,复制显示的token备用设置-->仓库设置
,便可看到设置本仓库地址的方法,本例子显示为(格式为https://e.coding.net/团队名/项目名/仓库名.git
)git remote set-url origin https://e.coding.net/zfbin/zfbin/zfbin.git
使用token来读写远程仓库(格式为https://用户名:token@e.coding.net/团队名/项目名/仓库名.git
),使用以下命令本身测试一下,用户名(默认是手机号码)为13677888877
,上一步获得的token是cdd0b865cdd0b865cdd0b865cdd0b865cf87ce84
,团队名称是zfbin
,项目的名称是zfbin
,代码仓库的名称是zfbin
(这里全部配置的敏感信息都是示例):shell
~/work/github/zfbin > git push "https://13677888877:cdd0b865cdd0b865cdd0b865cdd0b865cf87ce84@e.coding.net/zfbin/zfbin/zfbin.git" master:master Everything up-to-date ~/work/github/zfbin >
github
打开Github的此仓库的Secrets选项,新建如下秘钥:express
DEPLOY_CODING cdd0b865cdd0b865cdd0b865cdd0b865cf87ce84 CODING_USERNAME 13677888877 CODING_REF e.coding.net/zfbin/zfbin/zfbin.git
coding.net
github的仓库的原始文件版本为8570167,最终添加github actions以后的文件版本为0462a89e,不须要关注其余文件,只考虑.github/workflows/deploy_to_coding.yml
文件,其内容以下:macos
name: Auto deploy to coding pages # 在push主分支时触发构建 on: push: branches: - 'master' jobs: # job的名字:推送到coding deploy: name: Deploy to Coding # job的运行平台 runs-on: ubuntu-18.04 # test任务的步骤 steps: # 使用别人写好的指定版本的actions脚本,名称是checkout,下载本仓库 - uses: actions/checkout@v2 - name: 设置提交者的我的信息 # 这三个变量的值都放在 https://github.com/zfb132/zfb132.github.com/settings/secrets env: # 设置时区 TZ: Asia/Shanghai # 在coding.net的某个仓库新建访问令牌出现的秘钥 coding_token: ${{ secrets.DEPLOY_CODING }} # 团队中的某我的的用户名,通常默认是本人手机号码 coding_username: ${{ secrets.CODING_USERNAME }} # 格式为:e.coding.net/组织名/项目名/仓库名.git coding_ref: ${{ secrets.CODING_REF }} run: | export message=$(git log --pretty=format:"%s" -1) [ -f CNAME ] && rm CNAME || echo "CNAME doesn't exist" rm -rf .github rm -rf .git git clone https://${coding_username}:${coding_token}@${coding_ref} coding_dir cd coding_dir && mv .git ../ && cd ../ && rm -rf coding_dir git config --local user.email "zfb132@gmail.com" git config --local user.name "zfb" git config core.filemode false git remote set-url origin https://${coding_ref} git add . git commit -m "$message" git push --force --quiet "https://${coding_username}:${coding_token}@${coding_ref}" master:master
具体运行的命令的解释:ubuntu
export message=$(git log --pretty=format:"%s" -1)
是获取github的提交的messagerm CNAME
是删除github仓库的CNAME
文件,由于coding.net不须要此文件rm -rf .github
是删除github actions的配置文件,由于coding.net不须要进行CIrm -rf .git
是删除github仓库时的git信息,为后面使用coding.net的git清理空间git clone https://${coding_username}:${coding_token}@${coding_ref} coding_dir
是克隆coding.net的对应仓库,主要为了.git
文件夹,因此只是把此仓库下载到一个临时文件夹coding_dir
cd coding_dir && mv .git ../ && cd ../ && rm -rf coding_dir
是把coding.net的.git
文件夹替换掉原来的,而且删除临时文件夹git config --local user.email "zfb132@gmail.com"
是设置提交者的电子邮箱地址git config --local user.name "zfb"
是设置提交者的名字git config core.filemode false
忽略文件属性的问题,由于github的文件模式(权限)不必定与coding.net的相同git remote set-url origin https://${coding_ref}
是设置远程仓库的地址为coding.net的仓库git add .
是添加文件到暂存区git commit -m "$message"
设置commit的信息与github一致git push --force --quiet "https://${coding_username}:${coding_token}@${coding_ref}" master:master
是强制推送到远程仓库