为Github仓库添加Github Actions实现持续集成: Android apk自动编译发布以及github pages同步推送coding.net
内容转载自我的博客
说明
对于普通的github仓库,只需要在根目录创建.github/workflows/
文件夹即可自动使用Actions功能,具体执行的操作可以创建一个配置文件(命名不限),如build_apk.yml
Github Actions产品对公开仓库是完全免费的,对私人仓库每月有2000分钟使用时间,详细说明见费用。另外,github有许多官方已经实现好的actions可以供用户直接调用,用户只需用设置参数即可
每个配置文件称为一个工作流程(workflow),每个工作流程可以包含多个作业(job),每个作业可以包含一系列的步骤(steps),每个step可以称为action,可以认为这是三个层级
- workflow的基本语法
- workflow语法的基本数据类型、函数和内置变量
- workflow支持的所有触发条件,过滤指定的触发条件
- 在workflow及以下层级使用GITHUB_TOKEN秘钥的方法(内置,无需设置,直接调用)
- 在workflow及以下层级使用其他秘钥的方法
- 在workflow的多个job之间传递数据的方法
- job及其以下层级的条件运行
- 在job的不同step之间传递数据的方法
- 在job的某个step里面使用Docker的方法
- 在job里面使用cache来加快每次构建速度
- 为job下面的所有步骤的run命令设置默认shell和工作目录
1. 编写Android项目的CI配置文件
这里以项目WhuHelper为例,介绍如何使用YAML语法和Github Actions功能
- 原始仓库的文件版本为c1a78da
- 添加CI功能(自动进行
build test
、build app-debug.apk
)以后的文件版本为4ef2e90,只需要关注文件build_apk.yml即可,其他文件无变化 - 最终的CI功能包括自动进行构建测试、构建
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
文件内容及解析如下:
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
2. 编写Jekyll项目的CI配置文件
2.1 配置coding.net
主要包括以下步骤:
- 首先新建一个空项目(如果已经有了的话就不需要再新建,但是要保证与Github的对应仓库版本一致,防止无法commit)
- coding.net的代码仓库新建
访问令牌
,授予仓库权限,假设名字为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
(这里所有配置的敏感信息都是示例):
~/work/github/zfbin > git push "https://13677888877:cdd0b865cdd0b865cdd0b865cdd0b865cf87ce84@e.coding.net/zfbin/zfbin/zfbin.git" master:master
Everything up-to-date
~/work/github/zfbin >
2.2 配置github
打开Github的此仓库的Secrets选项,新建以下秘钥:
DEPLOY_CODING cdd0b865cdd0b865cdd0b865cdd0b865cf87ce84
CODING_USERNAME 13677888877
CODING_REF e.coding.net/zfbin/zfbin/zfbin.git
2.3 自动部署到coding.net
github的仓库的原始文件版本为8570167,最终添加github actions之后的文件版本为0462a89e,不需要关注其他文件,只考虑.github/workflows/deploy_to_coding.yml
文件,其内容如下:
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
具体运行的命令的解释:
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
是强制推送到远程仓库
为Github仓库添加Github Actions实现持续集成: Android apk自动编译发布以及github pages同步推送coding.net的更多相关文章
- Jenkins+GitHub+Xcode+fir搭了一个持续集成环境
enkins+GitHub+Xcode+fir搭了一个持续集成环境 字数826 阅读5699 评论44 喜欢49 原文链接 Coding Duck 今天用Jenkins+GitHub+Xcode+fi ...
- vue-qiankun公司微前端项稳定目落地后的总结(附github仓库demo,将会持续更新)
️本文为博客园社区首发文章,未获授权禁止转载 大家好,我是aehyok,一个住在深圳城市的佛系码农♀️,如果你喜欢我的文章,可以通过点赞帮我聚集灵力️. 个人github仓库地址: https:gi ...
- 使用Docker搭建Jenkins+Docker持续集成环境(自动化构建发布部署)
本文介绍如何通过Jenkins的docker镜像从零开始构建一个基于docker镜像的持续集成环境,包含自动化构建.发布到仓库\并部署上线. 0. 前置条件 服务器安装docker,并启动docker ...
- 持续集成之Jenkins自动部署war包到远程服务器
一.无war包链接的情况 无war包链接时,需先下载war包到本地,然后执行: ---------------------------------------------以下部分为转载-------- ...
- github仓库添加MIT许可
俩种方法 1.新建仓库 直接在选择添加即可如下图: 2.为已创建仓库后添加MIT协议 直接在给工程根目录添加LICENSE文件提交即可,内容是 MIT License Copyright (c) 年份 ...
- JavaWeb+SVN+Maven+Tomcat +jenkins搭建持续集成环境和自动部署
https://blog.csdn.net/wh52788/article/details/80900477 https://blog.csdn.net/liyong1028826685/articl ...
- 使用Jenkins+Docker+Gitlab+Maven搭建持续集成环境
继使用Docker搭建Gitlab后 大致的步骤如下: 开发人员通过IDE工具(IntelliJ IDEA)将代码推送到gitlab. jenkins从gitlab中获取到源码,并使用maven编译. ...
- 研发协同平台持续集成之Jenkins实践
导读 研发协同平台有两个核心目标,一是提高研发效率 ,二是提高研发质量,要实现这两个核心目标,实现持续集成是关键之一. 什么是持续集成 在<持续集成>一书中,对持续集成的定义如下:持续集成 ...
- Github 持续化集成 工作流 Npm包自动化发布
Github 持续化集成 工作流 Npm包自动化发布 简介 持续集成指的是,频繁地(一天多次)将代码集成到主干. 它的好处主要有两个: 快速发现错误.每完成一点更新,就集成到主干,可以快速发现错误 ...
随机推荐
- LibreOj-10012-「一本通-1-2-例-2」Best-Cow-Fences
题目地址 思路 二分平均值,区间为$0$~$2000$.将每个$a[i]$减去平均值,就只用考虑字段和是否$>=0$了. 关于计算子段和,可以使用前缀和表示,$sum[i]$表示前$i$个数的和 ...
- deepstrem编译缺少gst/gst.h解决方案
Deepstream在编译程序的程序的显示缺少gst/gst.h 具体情况是Deepstream运行已编译好的deepstream-app可以正常运行,但对源码编译的时候出现以述情况,初步分析是我们安 ...
- 【MindSpore】Ubuntu16.04上成功安装GPU版MindSpore1.0.1
本文是在宿主机Ubuntu16.04上拉取cuda10.1-cudnn7-ubuntu18.04的镜像,在容器中通过Miniconda3创建python3.7.5的环境并成功安装mindspore_g ...
- .NET5下的三维应用程序开发
终于等到了.NET5的发布,怀着激动的心情体验了一下:"香"就一个字. 如何基于.NET5开发工业软件,也广大三维应用开发者关心的问题.我们的Rapid SDK已经率先支持.NET ...
- monkey在指定的activity里面运行
下载包地址:链接: https://pan.baidu.com/s/1Wk2eOj3saZx71Mx6pT2L4Q 提取码: gupa 运行方式:步骤1: 将工具下载下来放到本地目录下,解压步骤2:配 ...
- 小兔子有颗玻璃心A版【转】
作者:诸君平身链接:https://www.zhihu.com/question/49179166/answer/116926446来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
- 网络编程-python实现-UDP(1.1.2)
@ 目录 1.UDP是什么 2.代码实现 1.UDP是什么 Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol).UDP ...
- C4 模型 - 可视化架构设计
前言 世界上最难的两件事是: 1. 把我的思想放进你的脑袋 2. 把你的钱放进我的口袋 第二点我们不探讨,因为这是众所周知的,不信?过来试试:) 对于第一点,对我们程序员来说,其实也是我个人一直强调的 ...
- 用Python批量爬取优质ip代理
前言 有时候爬的次数太多时ip容易被禁,所以需要ip代理的帮助.今天爬的思路是:到云代理获取大量ip代理,逐个检测,将超时不可用的代理排除,留下优质的ip代理. 一.爬虫分析 首先看看今天要爬取的网址 ...
- 如何去掉ul和li前面的小黑点
做网站的时候经常会遇到如上图所示的小圆点,难看不说,还容易影响布局,下面就介绍几种消除小圆点的方法: 1. 找到相关CSS文件,在.ul 和.li 部分添加: 1 list-style: none; ...