GitHub Actions 笔记

GitHub Action 将构建产物自动推送到另一个仓库 参考: GitHub Action 将构建产物自动推送到另一个仓库 | realwds's blog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
name: Deploy to GitHub Pages
on:
push:
branches:
- master
jobs:
deploy:
name: Deploy to GitHub Pages
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Use Node.js
uses: actions/setup-node@v1
with:
node-version: 10.x
- name: npm install and build
run: |
npm install
npm run build

- name: Deploy
uses: s0/git-publish-subdir-action@develop
env:
REPO: git@github.com:owner/repo.git
BRANCH: gh-pages
FOLDER: build
SSH_PRIVATE_KEY: {{hbeSeoContent}}#123;{ secrets.DEPLOY_PRIVATE_KEY }}
自制 GitHub Actions 包, 供他人使用 参考: dotnet 基于 dotnet format 的 GitHub Action 自动代码格式化机器人 9sako6/imgcmp: 📷A GitHub Action that automatically optimizes images in your repository. Supported image file formats: JPEG, PNG, GIF, SVG, WEBP dotnet 在 GitHub 的 Action 上部署自动代码编码规范机器人_lindexi-CSDN博客 zylele/social-readme: 在你的GitHub主页中自动构建社交feed流 peter-evans/create-pull-request: A GitHub action to create a pull request for changes to your repository in the actions workspace GitHub Actions Documentation - GitHub Docs Creating actions - GitHub Docs 自制一个 GitHub Action 包,此包对应一个 GitHub 仓库,上架 Marketplace GitHub Action 类型
Type Operating system
Docker container Linux
JavaScript Linux, macOS, Windows
Composite Actions Linux, macOS, Windows

1. 创建 Docker 容器类型 GitHub Actions

参考: Creating a Docker container action - GitHub Docs 补充 您可能会发现对 GitHub Actions 环境变量和 Docker 容器文件系统有基本的了解会很有帮助: “使用环境变量” “ GitHub 的虚拟环境

1.1 创建 Dockerfile

仓库根目录/Dockerfile 例如: hello-world-docker-action/Dockerfile
1
2
3
4
5
6
7
8
# Container image that runs your code
FROM alpine:3.10

# Copies your code file from your action repository to the filesystem path `/` of the container
COPY entrypoint.sh /entrypoint.sh

# Code file to execute when the docker container starts up (`entrypoint.sh`)
ENTRYPOINT ["/entrypoint.sh"]

1.2 创建 action.yml

hello-world-docker-action/action.yml
action.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# action.yml
name: 'Hello World'
description: 'Greet someone and record the time'
inputs:
who-to-greet: # id of input
description: 'Who to greet'
required: true
default: 'World'
outputs:
time: # id of output
description: 'The time we greeted you'
runs:
using: 'docker'
image: 'Dockerfile'
args:
- {{hbeSeoContent}}#123;{ inputs.who-to-greet }}
该 action.yml 定义了一个 who-to-greet 输入和一个 time 输出参数。 要将输入传递给 Docker 容器,您必须使用声明输入 inputs 并在 args 关键字中传递输入。 GitHub 将从您的 Dockerfile 构建一个镜像,并使用此镜像在新容器中运行命令。

1.3 编辑 action 代码

您可以选择任何基础 Docker 映像,因此可以为您的操作选择任何语言。 以下 shell 脚本示例使用 who-to-greet 输入变量在日志文件中打印“Hello [who-to-greet]”。 接下来,脚本获取当前时间并将其设置为输出变量,稍后在作业中运行的操作可以使用该变量。 为了让 GitHub 识别输出变量,您必须使用特定语法的工作流命令:echo "::set-output name=<output name>::<value>". 更多信息请参阅“ GitHub 操作的工作流命令”。
    entrypoint.sh 在 hello-world-docker-action 目录中创建一个新文件。 将以下代码添加到您的 entrypoint.sh 文件中。
entrypoint.sh
entrypoint.sh
1
2
3
4
5
#!/bin/sh -l

echo "Hello $1"
time=$(date)
echo "::set-output name=time::$time"
如果 entrypoint.sh 执行没有任何错误,则操作的状态设置为 success 。 您还可以在操作的代码中显式设置退出代码以提供操作的状态。有关详细信息,请参阅“设置操作的退出代码”。
    entrypoint.sh 通过在您的系统上运行以下命令使您的文件可执行。
1
chmod +x entrypoint.sh

1.4 创建 README.md

为了让人们知道如何使用您的操作,您可以创建一个 README 文件。当您计划公开分享您的操作时,自述文件最有帮助,但也是提醒您或您的团队如何使用该操作的好方法。 在您的hello-world-docker-action目录中,创建一个README.md指定以下信息的文件: 操作的详细描述。 必需的输入和输出参数。 可选的输入和输出参数。 动作使用的秘密。 操作使用的环境变量。 如何在工作流中使用您的操作的示例。 README.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Hello world docker action

This action prints "Hello World" or "Hello" + the name of a person to greet to the log.

## Inputs

## `who-to-greet`

**Required** The name of the person to greet. Default `"World"`.

## Outputs

## `time`

The time we greeted you.

## Example usage

uses: actions/hello-world-docker-action@v1
with:
who-to-greet: 'Mona the Octocat'

1.5 在 workflow 中测试你的 GitHub Actions

现在您已准备好在工作流中测试您的操作。 当操作位于私有存储库中时,该操作只能在同一存储库中的工作流中使用。 任何存储库中的工作流都可以使用公共操作。

1.5.1 使用公共 GitHub Actions 的示例

以下工作流代码使用公共存储库中已完成的hello world操作actions/hello-world-docker-action。 将以下工作流示例代码复制到.github/workflows/main.yml文件中,但将 替换为actions/hello-world-docker-action您的存储库和操作名称。 您还可以who-to-greet用您的姓名替换输入。即使未发布到 GitHub Marketplace,也可以使用公共操作。 有关更多信息,请参阅“发布操作”。 .github/工作流/main.yml hello-world-docker-action@v1 中的 v1 为 git tag v1
main.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
on: [push]

jobs:
hello_world_job:
runs-on: ubuntu-latest
name: A job to say hello
steps:
- name: Hello world action step
id: hello
uses: actions/hello-world-docker-action@v1
with:
who-to-greet: 'Mona the Octocat'
# Use the output from the `hello` step
- name: Get the output time
run: echo "The time was {{hbeSeoContent}}#123;{ steps.hello.outputs.time }}"

1.5.2 使用私有 GitHub Actions 的示例

将以下示例工作流代码复制到.github/workflows/main.yml操作存储库中的文件中。 您还可以who-to-greet用您的姓名替换输入。此私有操作无法发布到 GitHub Marketplace,只能在此存储库中使用。 .github/工作流/main.yml
main.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
on: [push]

jobs:
hello_world_job:
runs-on: ubuntu-latest
name: A job to say hello
steps:
# To use this repository's private action,
# you must check out the repository
- name: Checkout
uses: actions/checkout@v2
- name: Hello world action step
uses: ./ # Uses an action in the root directory
id: hello
with:
who-to-greet: 'Mona the Octocat'
# Use the output from the `hello` step
- name: Get the output time
run: echo "The time was {{hbeSeoContent}}#123;{ steps.hello.outputs.time }}"
从您的存储库中,单击 Actions 选项卡,然后选择最新的工作流运行。 在 Jobs 或在可视化图表中,单击 A job to say hello 。 您应该会看到“Hello Mona the Octocat”或您用于 who-to-greet 输入的名称以及打印在日志中的时间戳。

2. 创建 JavaScript 类型 GitHub Actions

参考: Creating a JavaScript action - GitHub Docs

3. 创建 复合 类型 GitHub Actions

参考: Creating a composite action - GitHub Docs

4. action.yml 语法

参考: Metadata syntax for GitHub Actions - GitHub Docs 仓库根目录/action.yml 或者 action.yaml

常用

name

必需,GitHub Actions 在 GitHub Marketplace 的显示名称,也将用于显示在 Actions tab 帮助你在每个 job 识别 Action

author

Optional The name of the action's author.

description

Required A short description of the action.

inputs

可选的输入参数允许您指定操作期望在运行时使用的数据。 GitHub 将输入参数存储为环境变量。 大写字母的输入 id 在运行时转换为小写。我们建议使用小写输入 ID。
action.yml
1
2
3
4
5
6
7
8
inputs:
numOctocats:
description: 'Number of Octocats'
required: false
default: '1'
octocatEyeColor:
description: 'Eye color of the Octocats'
required: true
当您在工作流文件中指定输入或使用默认输入值时,GitHub 会为输入创建一个名为 的环境变量INPUT_<VARIABLE_NAME>。创建的环境变量将输入名称转换为大写字母并用_字符替换空格。 如果操作是使用复合编写的,则它不会自动获取INPUT_<VARIABLE_NAME>. 如果未发生转换,您可以手动更改这些输入。 要访问 Docker 容器操作中的环境变量,您必须使用args操作元数据文件中的关键字传递输入。有关 Docker 容器操作的操作元数据文件的更多信息,请参阅“创建 Docker 容器操作”。 例如,如果工作流定义了numOctocats和octocatEyeColor输入,则操作代码可以使用INPUT_NUMOCTOCATS和INPUT_OCTOCATEYECOLOR环境变量读取输入的值。

outputs for composite actions

可选 outputs使用相同的参数outputs.<output_id>和outputs.<output_id>.description(见“outputs为GitHub的操作”),还包括value令牌。
action.yml
1
2
3
4
5
6
7
8
9
10
outputs:
random-number:
description: "Random number"
value: {{hbeSeoContent}}#123;{ steps.random-number-generator.outputs.random-id }}
runs:
using: "composite"
steps:
- id: random-number-generator
run: echo "::set-output name=random-id::$(echo $RANDOM)"
shell: bash

runs for composite actions

action.yml
1
2
3
4
5
6
7
8
9
10
11
runs:
using: "composite"
steps:
# 1. The command you want to run. This can be inline or a script in your action repository:
- name: Inline command
id: inline-command
# {{hbeSeoContent}}#123;{ github.action_path }} or $GITHUB_ACTION_PATH
run: {{hbeSeoContent}}#123;{ github.action_path }}/test/script.sh
shell: bash


runs.steps[*].uses

引用 action 某些 Action 需要您必须使用with关键字设置的输入。查看 Action 的 README 文件以确定所需的输入。
action.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
runs:
using: "composite"
steps:
# Reference a specific commit
- uses: actions/checkout@a81bbbf8298c0fa03ea29cdc473d45769f953675
# Reference the major version of a release
- uses: actions/checkout@v2
# Reference a specific version
- uses: actions/checkout@v2.2.0
# Reference a branch
- uses: actions/checkout@main
# References a subdirectory in a public GitHub repository at a specific branch, ref, or SHA
- uses: actions/aws/ec2@main
# References a local action
- uses: ./.github/actions/my-action
# References a docker public registry action
- uses: docker://gcr.io/cloud-builders/gradle
# Reference a docker image published on docker hub
- uses: docker://alpine:3.8

runs.steps[*].with

通过 with 传递参数, 参数以环境变量方式传递。 该变量以 INPUT_ 为前缀并转换为大写。
action.yml
1
2
3
4
5
6
7
8
9
runs:
using: "composite"
steps:
- name: My first step
uses: actions/hello_world@main
with:
first_name: Mona
middle_name: The
last_name: Octocat

runs.steps[*].env

可选map仅为该步骤 设置一组环境变量。如果要修改工作流中存储的环境变量,请echo "{name}={value}" >> $GITHUB_ENV在复合步骤中使用。

runs for Docker actions

Example using a Dockerfile in your repository

1
2
3
runs:
using: 'docker'
image: 'Dockerfile'

Example using public Docker registry container

1
2
3
runs:
using: 'docker'
image: 'docker://debian:stretch-slim'

runs.using

Required You must set this value to 'docker'.

pre-entrypoint

可选允许您在entrypoint操作开始之前运行脚本。 例如,您可以使用pre-entrypoint:运行先决条件设置脚本。 GitHub Actions 用于docker run启动此操作,并在使用相同基础映像的新容器中运行脚本。 这意味着运行时状态与主entrypoint容器不同,您需要的任何状态都必须在工作区HOME、 或作为STATE_变量访问。 该pre-entrypoint:操作始终默认运行,但您可以使用pre-if. 使用using语法指定的运行时将执行此文件。 在此示例中,该pre-entrypoint:操作运行名为 的脚本setup.sh:
1
2
3
4
5
6
7
runs:
using: 'docker'
image: 'Dockerfile'
args:
- 'bzz'
pre-entrypoint: 'setup.sh'
entrypoint: 'main.sh'

post-entrypoint

可选 允许您在runs.entrypoint操作完成后运行清理脚本。 GitHub Actions 用于docker run启动此操作。 由于 GitHub Actions 使用相同的基础映像在新容器中运行脚本,因此运行时状态与主entrypoint容器不同。 您可以在工作区HOME、 或作为STATE_变量访问您需要的任何状态。 该post-entrypoint:操作始终默认运行,但您可以使用post-if.
1
2
3
4
5
6
7
runs:
using: 'docker'
image: 'Dockerfile'
args:
- 'bzz'
entrypoint: 'main.sh'
post-entrypoint: 'cleanup.sh'

runs.args

可选定义 Docker 容器输入的字符串数组。输入可以包括硬编码的字符串。当容器启动时,GitHub 将 传递args给容器ENTRYPOINT。 在args相同的方式获得用于CMD在指令Dockerfile。如果您CMD在您的 中使用,请Dockerfile使用按偏好排序的指南:
    在操作的自述文件中记录必要的参数,并在 CMD 指令的中忽略它们。 使用默认值,允许不指定任何 args 即可使用操作。 如果操作显示 --help 标记或类似项,请使用它让您的操作能够自行记录。
如果您需要将环境变量传递到操作中,请确保您的操作运行命令外壳来执行变量替换。例如,如果您的entrypoint属性设置为"sh -c",args将在命令外壳中运行。或者,如果您Dockerfile使用 anENTRYPOINT来运行相同的命令 ( "sh -c"),args则将在命令外壳中执行。 有关将CMD指令与 GitHub 操作结合使用的更多信息,请参阅“ Dockerfile 对 GitHub 操作的支持”。
action.yml
1
2
3
4
5
6
7
runs:
using: 'docker'
image: 'Dockerfile'
args:
- {{hbeSeoContent}}#123;{ inputs.greeting }}
- 'foo'
- 'bar'

branding

设置 GitHub Actions 图标 您可以使用颜色和羽毛图标来创建徽章来个性化和区分您的操作。徽章显示在GitHub Marketplace 中您的操作名称旁边。
action.yml
1
2
3
branding:
icon: 'award'
color: 'green'

branding.color

The background color of the badge. Can be one of: white, yellow, blue, green, orange, red, purple, or gray-dark.

branding.icon

The name of the Feather icon to use.
activity airplay alert-circle alert-octagon
alert-triangle align-center align-justify align-left
align-right anchor aperture archive
arrow-down-circle arrow-down-left arrow-down-right arrow-down
arrow-left-circle arrow-left arrow-right-circle arrow-right
arrow-up-circle arrow-up-left arrow-up-right arrow-up
at-sign award bar-chart-2 bar-chart
battery-charging battery bell-off bell
bluetooth bold book-open book
bookmark box briefcase calendar
camera-off camera cast check-circle
check-square check chevron-down chevron-left
chevron-right chevron-up chevrons-down chevrons-left
chevrons-right chevrons-up circle clipboard
clock cloud-drizzle cloud-lightning cloud-off
cloud-rain cloud-snow cloud code
command compass copy corner-down-left
corner-down-right corner-left-down corner-left-up corner-right-down
corner-right-up corner-up-left corner-up-right cpu
credit-card crop crosshair database
delete disc dollar-sign download-cloud
download droplet edit-2 edit-3
edit external-link eye-off eye
facebook fast-forward feather file-minus
file-plus file-text file film
filter flag folder-minus folder-plus
folder gift git-branch git-commit
git-merge git-pull-request globe grid
hard-drive hash headphones heart
help-circle home image inbox
info italic layers layout
life-buoy link-2 link list
loader lock log-in log-out
mail map-pin map maximize-2
maximize menu message-circle message-square
mic-off mic minimize-2 minimize
minus-circle minus-square minus monitor
moon more-horizontal more-vertical move
music navigation-2 navigation octagon
package paperclip pause-circle pause
percent phone-call phone-forwarded phone-incoming
phone-missed phone-off phone-outgoing phone
pie-chart play-circle play plus-circle
plus-square plus pocket power
printer radio refresh-ccw refresh-cw
repeat rewind rotate-ccw rotate-cw
rss save scissors search
send server settings share-2
share shield-off shield shopping-bag
shopping-cart shuffle sidebar skip-back
skip-forward slash sliders smartphone
speaker square star stop-circle
sun sunrise sunset tablet
tag target terminal thermometer
thumbs-down thumbs-up toggle-left toggle-right
trash-2 trash trending-down trending-up
triangle truck tv type
umbrella underline unlock upload-cloud
upload user-check user-minus user-plus
user-x user users video-off
video voicemail volume-1 volume-2
volume-x volume watch wifi-off
wifi wind x-circle x-square
x zap-off zap zoom-in
zoom-out

action.yml 示例

action.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
name: "social-readme"
author: zylele
description: "Add social feed in your Readme"

inputs:
gh_token:
description: "GitHub access token with Repo scope"
default: {{hbeSeoContent}}#123;{ github.token }}
required: true

repository:
description: "Your GitHub repository"
default: {{hbeSeoContent}}#123;{ github.repository }}
required: false

commit_message:
description: "COMMIT_MESSAGE"
default: "Updated social rss by social-readme"
required: false

blog_rss_link:
description: "Your Blog rss link"
required: false

blog_limit:
description: "Your Blog LIMIT"
default: "5"
required: false

douban_name:
description: "Your Douban name"
required: false

douban_limit:
description: "Your Douban LIMIT"
default: "5"
required: false

runs:
using: "docker"
image: "Dockerfile"

branding:
icon: "aperture"
color: "green"

5. GitHub Actions 中的 Dockerfile 支持

参考: Dockerfile support for GitHub Actions - GitHub Docs

6. 为 GitHub Actions 设置退出代码

参考: Setting exit codes for actions - GitHub Docs

7. 发布到 GitHub Marketplace

参考: 在 GitHub Marketplace 中发布操作 - GitHub Docs 发布 通过tag 创建出 Release 时,勾选 Publish this Action to the GitHub Marketplace, 注意: 会提示需要开启 GitHub 双因素认证,开启后即可 补充: 别忘了在发布前,最后还需要添加图标 action.yml
action.yml
1
2
3
branding:
icon: "cloud"
color: "white"
Release 后

8. Release 和 维护 GitHub Actions

参考: Releasing and maintaining actions - GitHub Docs

9. 开发第三方 CLI GitHub Actions

参考: Developing a third party CLI action - GitHub Docs

10. 补充

10.1 Workflow commands for GitHub Actions

参考: Workflow commands for GitHub Actions - GitHub Docs

设置输出参数

1
::set-output name={name}::{value}
设置动作的输出参数。 或者,您还可以在操作的元数据文件中声明输出参数。更多信息请参阅“ GitHub 操作的元数据语法”。 例子
1
echo "::set-output name=action_fruit::strawberry"

10.2 Contexts

参考: Contexts - GitHub Docs You can access context information in workflows and actions.

Dockerfile 支持

参考: Dockerfile support for GitHub Actions - GitHub Docs

WORKDIR

GitHub 在GITHUB_WORKSPACE环境变量中设置工作目录路径。 建议不要WORKDIR在您的Dockerfile. 在操作执行之前,GitHub 会将GITHUB_WORKSPACE目录挂载到 Docker 映像中该位置的任何内容的顶部,并设置GITHUB_WORKSPACE为工作目录。 有关更多信息,请参阅Docker 文档中的“使用环境变量”和WORKDIR 参考

10.3 GitHub API 操作 Repo

参考: Creating pull request throws "no commits between".. · Issue #879 · octokit/octokit.net Programatically create or update GitHub files | Dennis O'Keeffe Blog 补充

with

with 传递通过 -e 即环境变量, 加前缀 INPUT_,并且字母全大写

结合 .NET 创建 复合型 GitHub Actions

action.yml
action.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
name: "upyun-action"
author: yiyungent
description: "GitHub Actions for upyun | 又拍云"


inputs:
# gh_token:
# description: "GitHub access token with Repo scope"
# default: {{hbeSeoContent}}#123;{ github.token }}
# required: true

# repository:
# description: "Your GitHub repository"
# default: {{hbeSeoContent}}#123;{ github.repository }}
# required: false

upyun_token:
description: "upyun Token"
default: ""
required: true

upyun_refresh_cache_urls:
description: "Refresh Urls"
default: ""
required: false


outputs:
upyun_response:
description: "upyun response"
value: {{hbeSeoContent}}#123;{ steps.docker-action.outputs.upyun_response }}


runs:
using: "composite"
steps:
# 1. The command you want to run. This can be inline or a script in your action repository:
# - name: Inline command
# id: inline-command
# # {{hbeSeoContent}}#123;{ github.action_path }} or $GITHUB_ACTION_PATH
# run: {{hbeSeoContent}}#123;{ github.action_path }}/test/script.sh
# shell: bash

# References a docker public registry action
- name: Docker run
id: docker-action
uses: docker://ghcr.io/yiyungent/upyun-action
with:
upyun_token: {{hbeSeoContent}}#123;{ inputs.upyun_token }}
refresh_cache_urls: {{hbeSeoContent}}#123;{ inputs.refresh_cache_urls }}

成功通过 环境变量 传递参数 程序内输出指定格式字符串向外传递参数
1
::set-output name=upyun_response::strawberry
成功通过在程序内输出指定格式字符串,从而传递参数到外界 (回归 GitHub Actions Workflow Command 中), 而此句输出并没有在 日志中看到,这正是说明这种输出具有特殊作用,GitHub 因此将其忽略在日志 .github/workflows/test-action.yml
test-action.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
name: Test Action

on:
push:
tags:
- 'test-action-v*'

jobs:
build:
runs-on: ubuntu-latest
steps:
# To use this repository's private action,
# you must check out the repository
- name: Checkout
uses: actions/checkout@v2

- name: Test Action
id: test
uses: ./ # Uses an action in the root directory
with:
upyun_token: "weqeqwe"


# Use the output from the `test` step
- name: Get the output upyun_response
run: echo "The output was {{hbeSeoContent}}#123;{ steps.test.outputs.upyun_response }}"

Dockerfile 注意: 这里尤其注意,GitHub 官方推荐不要在 Dockerfile 中使用 WORKDIR, 如果使用了,那你需要尤其注意路径。 例如下方
Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["src/UpyunAction/UpyunAction.csproj", "src/UpyunAction/"]
RUN dotnet restore "src/UpyunAction/UpyunAction.csproj"
COPY . .
WORKDIR "/src/src/UpyunAction"
RUN dotnet build "UpyunAction.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "UpyunAction.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
# 注意: 由于 GitHub Actions 会设置 GITHUB_WORKSPACE 为工作目录, 因此使用绝对路径
ENTRYPOINT ["dotnet", "/app/UpyunAction.dll"]
直接 ENTRYPOINT ["dotnet", "UpyunAction.dll"] 在 GitHub Actions 中会找不到,从而报错 UpyunAction.dll 文件不存在 补充: 参考: ENTRYPOINT | Dockerfile support for GitHub Actions - GitHub Docs 如何不通过环境变量传递参数,其实也可以通过命令行后的 args 参数,对应 action.yml
action.yml
1
2
3
4
5
6
7
8
9
10
runs:
using: "composite"
steps:
# References a docker public registry action
- name: Docker run
id: docker-action
uses: docker://ghcr.io/yiyungent/upyun-action
args:
upyun_token: {{hbeSeoContent}}#123;{ inputs.upyun_token }}
refresh_cache_urls: {{hbeSeoContent}}#123;{ inputs.refresh_cache_urls }}
但此时,Dockerfile 就不能像往常那样写了,因为你需要在 dotnet app.dll 时传递 args, GitHub Actions 文档官方建议,创建一个 entrypoint.sh 文件,在 此文件中运行程序时传递 args 参数
Dockerfile
1
2
3
4
5
6
7
8
# Container image that runs your code
FROM debian:9.5-slim

# Copies your code file from your action repository to the filesystem path `/` of the container
COPY entrypoint.sh /entrypoint.sh

# Executes `entrypoint.sh` when the Docker container starts up
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
entrypoint.sh
1
2
3
4
5
#!/bin/sh

# `$*` expands the `args` supplied in an `array` individually
# or splits `args` in a string separated by whitespace.
sh -c "echo $*"
使用上面的示例 Dockerfile,GitHub 会将args操作的元数据文件中的配置作为参数发送到entrypoint.sh. 在文件顶部添加#!/bin/sh shebangentrypoint.sh以明确使用系统的POSIX兼容 shell。 您的代码必须是可执行的。在工作流中使用该entrypoint.sh文件execute之前,请确保该文件具有权限。您可以使用以下命令从终端修改权限:
1
chmod +x entrypoint.sh

peter-evans/create-pull-request

参考: Error: When the repository is checked out on a commit instead of a branch, the 'base' input must be supplied · Issue #707 · peter-evans/create-pull-request 出现此错误是因为您的 workflow.xml 在您每次发布时执行 标签推送

传递多行字符串

参考: Passing multiple line output for Pull Request body will not display · Issue #614 · peter-evans/create-pull-request Setting the pull request body from a file 解决: 首先在程序输出时, 为将输出value到一行, 因此输出时, 用 \\n, (双斜线n) 然后,为了能在 create-pull-request 中的 body 中解析 markdown 中成功解析 换行符,因此还需要做 get-pr-body 替换 ,经过测试,官方方法不行,完全没有起到替换效果(不知道原因)。最后是本人方法,有效 必须对内容进行转义以保留换行符
1
2
3
4
5
6
7
8
9
10
11
12
13
- id: get-pr-body
run: |
body=$(cat pr-body.txt)
body="{{hbeSeoContent}}#123;body//'%'/'%25'}"
body="{{hbeSeoContent}}#123;body//{{hbeSeoContent}}#x27;\n'/'%0A'}"
body="{{hbeSeoContent}}#123;body//{{hbeSeoContent}}#x27;\r'/'%0D'}"
echo ::set-output name=body::$body
shell: bash

- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
with:
body: {{hbeSeoContent}}#123;{ steps.get-pr-body.outputs.body }}
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- name: Run tool
id: run-tool
run: |
export INPUT_CIA_DEBUG={{hbeSeoContent}}#123;{ inputs.cia_debug }}
coo --version
# coo cimg --github-action -d --ignore-paths='{{hbeSeoContent}}#123;{ inputs.ignore_paths }}' "F:\Com\me\Repos\notebook\source\_posts"
coo cimg --github-action -d --ignore-paths='{{hbeSeoContent}}#123;{ inputs.ignore_paths }}' {{hbeSeoContent}}#123;{ github.action_path }}/{{hbeSeoContent}}#123;{ inputs.scan_directory }}
shell: bash

- name: The content must be escaped to preserve newlines.
id: get-pr-body
run: |
# 注意: 这里要用双引号将其包裹起来, 不然其内容会直接raw绘制出来
body="{{hbeSeoContent}}#123;{ steps.run-tool.outputs.image_report }}"
body="{{hbeSeoContent}}#123;body//'%'/'%25'}"
body="{{hbeSeoContent}}#123;body//{{hbeSeoContent}}#x27;\n'/'%0A'}"
body="{{hbeSeoContent}}#123;body//{{hbeSeoContent}}#x27;\r'/'%0D'}"
echo ::set-output name=body::$body
# 注意: 这里指定 shell, 不知道为什么很多时候, 不指定也不报错, 但这里报错了, 应该是这里用了 bash 语法吧, 但值得注意的是官方文档这里也没写 shell: bash, 但确实加上这句才不报错了
shell: bash
经过测试, 这种替换,不可用,完全没变 body, 不知道为什么
经过测试,使用下方替换可用
1
2
3
4
5
6
7
8
9
10
- name: The content must be escaped to preserve newlines.
id: get-pr-body
run: |
body="{{hbeSeoContent}}#123;{ steps.run-tool.outputs.image_report }}"
# {{hbeSeoContent}}#123;string//substring/replacement} # 使用$replacement, 代替所有匹配的$substring
body="{{hbeSeoContent}}#123;body//'%'/%25}"
body="{{hbeSeoContent}}#123;body//'\n'/%0A}"
body="{{hbeSeoContent}}#123;body//'\r'/%0D}"
echo ::set-output name=body::$body
shell: bash
注意: 仔细观察,替换不一样

常用 GitHub Action

usthe/issues-translate-action: The action for translating Non-English issues content to English. rishabhgupta/git-action-issue: Custom Github Action for Issue actions-cool/issues-helper: 🤖 A GitHub Action easily helps you automatically manage issues. Welcome to try. 参考 感谢帮助! github actions 简易入门及自动部署博客实践 - 知乎 Github actions + Docker实现持续部署_SpectreAlan's blog-CSDN博客 Github actions + Docker实现持续部署 | AlanGrady's blogs 编写自己的 GitHub Action,体验自动化部署 - 张凯强的技术分享 Github Actions 为什么这么香 | CC的部落格 GitHub Action 将构建产物自动推送到另一个仓库 | realwds's blog miniprogram+GitLab CI/CD 实现微信小程序代码自动上传 | realwds's blog 通过 GitHub Actions 将 GitHub 仓库自动备份到 Gitee、GitLab_深刻的博客-CSDN博客