GitHub Packages in Action

原文地址:https://alphahinex.github.io/2020/01/17/github-packages-in-action/

GitHub Packages 可以用来当做 Release 版本 jar 包的 Maven 仓库。

与 Maven 中央库比,没有繁琐的申请流程,可以快速的将 jar 包发布出去供他人使用。

与 Nexus 私服相比,无需架设公网访问环境。

缺点 是只支持 Release 版本的发布和下载,Snapshot 版本虽然可以发布上去,但无法被其他项目依赖。目前尚不支持自行删除已上传的 jar 包,需联系 GitHub 协助处理。

本文以实例说明,在 Gradle 中如何利用 GPR(GitHub Packages Registry)进行发布版 jar 包的上传、下载及删除。

上传

参考 官方文档,需完成如下步骤。

在 GitHub 创建 Personal access token

GPR 相当于一个需要权限才可访问的 Maven 仓库。故必须使用 GitHub 账号进行相应操作。虽按文档描述可直接利用 GitHub 账号密码(实际若直接用密码,会收到提示,无法正常使用),但更推荐的是通过 token 的方式,限定 token 的权限范围,利用不同 token 完成不同操作。

可在 https://github.com/settings/tokens 创建个人的 token,GRP 相关权限可见 About tokens

建议创建如下两个 token:

  • 只读 token(包含 read:packages):可用来从 GPR 下载自己 及他人 发布的 jar 包
  • 管理 token(包含 read:packages, write:packages, delete:packages, repo):可发布、删除 packages

build.gradle 中添加配置

借助 Gradle 的 maven-publish 插件,将 GPR 配置为 Maven 仓库,通过 publish task 即可完成上传。

以使用 Gradle Groovy 的单包仓库为例,可在 build.gradle 中添加如下内容(注意替换 usernamepassword):

plugins {
    id("maven-publish")
}

publishing {
    repositories {
        maven {
            name = "GitHubPackages"
            url = uri("https://maven.pkg.github.com/OWNER/REPOSITORY")
            credentials {
                username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
                password = project.findProperty("gpr.key") ?: System.getenv("PASSWORD")
            }
        }
    }
    publications {
        gpr(MavenPublication) {
            from(components.java)
        }
    }
}

更多示例可参考 官方文档spring-roll 项目的 实例

此处需补充一下,发布 jar 包时若需要包含源码,需在编译阶段生成好源码 jar 包。

Gradle 6.0.1 Java 插件对此提供了支持,可直接在 build.gradle 中添加如下内容

java {
    withSourcesJar()
}

若是 6.x 之前的版本,可自定义 task 完成源码 jar 包的打包,但是否能正常上传 GPR 未验证。

发布

$ ./gradlew publish

发布成功后,可在仓库的 packages 选项卡或 Profile 中查看,也可使用类似 https://maven.pkg.github.com/alphahinex/spring-roll/io/github/spring-roll/roll-base/0.0.1.RELEASE/roll-base-0.0.1.RELEASE.pom 的地址(需提供 GPR 的访问权限)确认。

开发时若需要将 SNAPSHOT 版本发布到本地 Maven 库,可使用 ./gradlew publishToMavenLocal,并在项目 build.gradle 文件的 repositories 块中增加 mavenLocal()

下载

需下载他人发布到 GPR 中的 jar 包时,配置方式与配置 Nexus 私服的方式类似,例如:

repositories {
  mavenCentral()
  mavenLocal()
  maven {
    url "https://maven.pkg.github.com/alphahinex/spring-roll"
    credentials {
      username = 'GITHUB_USERNAME'
      password = 'TOKEN_WITH_READ:PACKAGES_SCOPE'
    }
  }
}

之后在 dependencies 中添加依赖,如 implementation 'io.github.spring-roll:roll-base:0.0.1.RELEASE',若一切顺利即可下载到 roll-base v0.0.1.RELEASE 的 jar 包和源码。

删除

虽然有 delete:packages 权限,但目前 GitHub 仅允许用户对上传到 GPR 的私有仓库的 jar 包进行删除。

若需要删除公开仓库的 jar 包,需通过 支持 与 GitHub 联系,并提供需要删除的包的链接。

删除私有库的 jar 包需使用 GitHub 在 GraphQL 中提供的删除方法(未验证)。

删除前需获得要删除的包的 packageVersionId(界面不可见),可通过查询接口进行查询,如:

$ curl -X POST \
-H "Authorization: bearer TOKEN" \
-H "Accept: application/vnd.github.packages-preview+json" \
-d '{"query": "query { user(login: \"AlphaHinex\") { registryPackagesForQuery(packageType: MAVEN, first: 100) { edges { node { name id version(version: \"0.1.0.RELEASE\") { id version }} } } }}"}' https://api.github.com/graphql

得到类似下方的信息:

{
  "data": {
    "user": {
      "registryPackagesForQuery": {
        "edges": [
          {
            "node": {
              "name": "io.github.spring-roll.roll-base",
              "id": "MDc6UGFja2FnZTkyOTgy",
              "version": {
                "id": "MDE0OlBhY2thZ2VWZXJzaW9uNTI3MTcx",
                "version": "0.1.0-SNAPSHOT"
              }
            }
          },
          {
            "node": {
              "name": "io.github.spring-roll.roll-dev-configs",
              "id": "MDc6UGFja2FnZTkyOTg0",
              "version": {
                "id": "MDE0OlBhY2thZ2VWZXJzaW9uNTI3MTcy",
                "version": "0.1.0-SNAPSHOT"
              }
            }
          },
          {
            "node": {
              "name": "io.github.spring-roll.roll-dl",
              "id": "MDc6UGFja2FnZTkyOTg1",
              "version": {
                "id": "MDE0OlBhY2thZ2VWZXJzaW9uNTI3MTcz",
                "version": "0.1.0-SNAPSHOT"
              }
            }
          },
          {
            "node": {
              "name": "io.github.spring-roll.roll-test",
              "id": "MDc6UGFja2FnZTkyOTg2",
              "version": {
                "id": "MDE0OlBhY2thZ2VWZXJzaW9uNTI3MTc0",
                "version": "0.1.0-SNAPSHOT"
              }
            }
          },
          {
            "node": {
              "name": "io.github.spring-roll.roll-utils",
              "id": "MDc6UGFja2FnZTkyOTg3",
              "version": {
                "id": "MDE0OlBhY2thZ2VWZXJzaW9uNTI3MTc3",
                "version": "0.1.0-SNAPSHOT"
              }
            }
          },
          {
            "node": {
              "name": "io.github.spring-roll.roll-web",
              "id": "MDc6UGFja2FnZTkyOTg4",
              "version": {
                "id": "MDE0OlBhY2thZ2VWZXJzaW9uNTI3MTc5",
                "version": "0.1.0-SNAPSHOT"
              }
            }
          }
        ]
      }
    }
  }
}

获得到要删除的 jar 包的 packageVersionId 后,依旧通过 GraphQL 接口删除:

$ curl -X POST \
-H "Accept: application/vnd.github.package-deletes-preview+json" \
-H "Authorization: bearer TOKEN" \
-d '{"query":"mutation { deletePackageVersion(input:{packageVersionId:\"MDc6UGFja2FnZTkyOTgy\"}) { success }}"}' \
https://api.github.com/graphql

实例

参考资料

  1. GraphQL 实战:GitHub V4 API 使用
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容