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閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容