虽然有不少文章介绍这个主题,但是,有很多人留言在Mac OS怎么使用GPG;上传脚本难配置。这篇文章就将解决这些问题。
文章还是会按照整体流程来叙述,但侧重点会在Mac OS使用GPG、脚本模板化两个方面。
申请GroupId使用权
-
创建Issue,类型选Project

- 填写资料

Group Id的值有两种:
- 个人有可公开访问的域名,填写个人域名
- 有github,填写io.github.username(username为用户名)
- 留意回复,并按指示操作
GPG生成密钥
命令均在Mac OS下操作
-
安装gnupg
brew install gnupg
-
生成密钥对
gpg --full-gen-key
密钥类型可以根据需要选择;密钥有效期,为了方便建议选永不过期。
-
上传公钥
私钥是绝不能泄漏的,公钥是别人用来验证是否是用你的私钥签名。所以,公钥需要上传到公钥服务器。
gpg --keyserver keyserver.ubuntu.com --send-keys B5C2D2AF
--keyserver:指定公钥服务器
--send-keys:可指定密钥ID
由于国内科学上网,有些服务器可能无法访问,提供两个其他的选择:
- keys.openpgp.org
- pgp.mit.edu
-
导出密钥
为了更方便的使用密钥,比如CI,将密钥导出。
gpg --export-secret-keys B5C2D2AF > B5C2D2AF.gpg
--export-secret-keys:可指定密钥ID
上传脚本
- 在需要上传module根目录创建scripts目录
- 在创建的scripts目录下创建publish.gradle文件
- 复制上传脚本
project.plugins.apply('maven-publish')
project.plugins.apply('signing')
def localProps=new Properties()
localProps.load(project.file('local.properties').newDataInputStream())
Enumeration enumeration = localProps.keys();
while (enumeration.hasMoreElements()) {
def key = enumeration.nextElement();
def value = localProps.get(key);
project.properties[key]=value
}
afterEvaluate {
publishing {
publications {
release(MavenPublication) {
groupId = 'io.github.wslaimin'
artifactId = 'RVAdapter'
version = '1.0.0'
from components.release
// generate pom.xml
pom {
name = 'RVAdapter'
description = 'Simply defining adapters of RecyclerView in Android'
url = 'https://github.com/wslaimin/RVAdapter.git'
licenses {
license {
name = 'The Apache License, Version 2.0'
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id = 'wslaimin'
name = 'TFly'
email = 'wslaimin@gmail.com'
}
}
scm {
url = 'https://github.com/wslaimin/RVAdapter.git'
}
}
}
}
repositories {
maven {
// change to point to your repo
def releaseRepo = 'https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/'
def snapshotRepo = 'https://s01.oss.sonatype.org/content/repositories/snapshots/'
url = publishing.publications.release.version.endsWith('SNAPSHOT') ? snapshotRepo : releaseRepo
credentials {
username = project.properties['credencial.username']
password = project.properties['credencial.password']
}
}
maven {
name 'Build'
url = layout.buildDirectory.dir('repo')
}
}
}
if(project.properties['signing.keyId']&&project.properties['signing.password']&&project.properties['signing.secretKeyRingFile']){
signing {
sign publishing.publications.release
}
}
}
-
在需要上传module根目录下的local.properties(如果没有新建个)加入口令
credencial.username= credencial.password= signing.keyId= signing.password= signing.secretKeyRingFile=
credencial.username:Sonatype账号
credencial.password:Sonatype密码
signing.keyId:生成的密钥ID
signing.password:密钥密码
signing.secretKeyRingFile:导出密钥文件位置
-
在需要上传module的build.gradle引用上传脚本
apply from: './scripts/publish.gradle'
以上步骤完成后,同步项目后,能够看到publish相关任务:

publishReleasePublicationToBuildRepository:部署到项目的build目录下
publishReleasePublicationToMavenLocal:部署到本地maven仓库
publishReleasePublicationToMavenRepository:部署到远程maven仓库
脚本模板化
每个新项目都写一遍脚本,配置口令,显然是不便的。所以,可以将脚本模板化来简化配置过程。
打开Android Studio的Live Templates配置。
- 创建上传脚本模板

创建好模板后,在创建好的publish.gradle输入pub就能快速引入上传脚本。
-
创建口令模板
方法同上,文件类型选择Other。
发布
执行publishReleasePublicationToMavenRepository任务后,只是staging状态,需要在Sonatype后台操作发布。
以上就是所有内容了,enjoy it!