关于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