通过GitHub Actions发布和安装软件包

关于Github packages和Github Actions

github packages是github的免费服务。

github actions可以用于实现自有仓库的CI和DI,配合github packages可以为其过程提供所需文件安装包。

登陆认证到Container registry

在通过github actions workflow认证容器注册服务器时,GITHUB_TOKEN是比较推荐的安全实践。

当你的workflow通过PAT登陆ghcr.io时,强烈建议使用GITHUB_TOKEN来完成整个过程。

登陆认证到github的package注册服务器

当你访问package注册服务器时,建议使用为仓库生成的GITHUB_TOKEN,而不是PAC。

我们应该为contents字段设置只读权限,为packages字段设置可写权限。

repository-owned packages的读写权限和package访问权限

当你使能Github Actions时,GITHUB_TOKEN就是Githubb app的安装访问token。你将通过GITHUB_TOKEN来允许对你的仓库进行Github app安装。

Container注册服务器的读写权限和package访问权限

ghrc.io允许用户创建和主导免费的容器。

用户访问Container注册服务器时应该用GITHUB_TOKEN而不是PAT。

通过workflow修改容器的默认权限和访问设置

当你增,删,改和安装容器时,管理员有一些默认的权限来保证对工作流的掌控。

比如,当你用GITHUB_TOKEN创建容器时:

  • 容器继承仓库的可见性和权限模型
  • 容器创建时,仓库的管理员也就变成了容器的管理员

通过Action发布一个软件包

你可以通过Github Actions在CI的过程中自动的发布软件包。也可以当你的代码达标时,通过CD生成新的部署包。例如你可以可以通过workflow创建一个CI任务,当测试通过时,自动生成软件包,然后发布到Github Packages。

当你更新代码时,就会自动触发workflow。

当workflow结束时,新生成的软件包就会出现在git仓库中。

通过Github Action安装软件包

当你通过GITHUB_TOKEN安装Github Packages上面的软件包时,你只需要简单的配置不需要额外的认证。当流量传输时,是免费的。

升级服务到ghcr.io

ghrc的docker注册服务器支持GITHUB_TOKEN实现安全的认证。当你使用PAT访问ghcr.io时,强烈建议使用GITHUB_TOKEN工作流。

当你使用GITHUB_TOKEN来增加安全性时,它让你不必为了能随时使用workflow而创建一个long-lived PAT。

附一个通过GITHUB_TOKEN来发布docker镜像的配置:

name: Demo Push

on:   
  push:
    # Publish `master` as Docker `latest` image.
    branches:
      - master
      - seed

    # Publish `v1.2.3` tags as releases.
    tags:
      - v*

  # Run tests for any PRs.
  pull_request:

env:
  IMAGE_NAME: ghtoken_product_demo

jobs:
  # Push image to GitHub Packages.
  # See also https://docs.docker.com/docker-hub/builds/
  push:
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read

    steps:
      - uses: actions/checkout@v2

      - name: Build image
        run: docker build . --file Dockerfile --tag $IMAGE_NAME --label "runnumber=${GITHUB_RUN_ID}"

      - name: Log in to registry
        # This is where you will update the PAT to GITHUB_TOKEN
        run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin

      - name: Push image
        run: |
          IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME

          # Change all uppercase to lowercase
          IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')
          # Strip git ref prefix from version
          VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
          # Strip "v" prefix from tag name
          [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
          # Use Docker `latest` tag convention
          [ "$VERSION" == "master" ] && VERSION=latest
          echo IMAGE_ID=$IMAGE_ID
          echo VERSION=$VERSION
          docker tag $IMAGE_NAME $IMAGE_ID:$VERSION
          docker push $IMAGE_ID:$VERSION

发表评论

您的电子邮箱地址不会被公开。