Github Actions学习: 定义一个 gh action

一步一步实现一个 gh actions
更新于: 2023-03-10 16:44:42

一图胜千言

原理图

创建一个 只有 action.yml 的 action

  • 基本目录结构
  • 核心代码
  • 安装 cli 原理展开
  • Makefile 用于发布

基本目录

使用命令: tree -a -L 4 -I .git -I .idea

.
├── .github
│   └── workflows
│       └── main.yml
├── .gitignore
├── Makefile
├── README.md
└── action.yml

action.yml 核心代码

name: 'AliyunCli Action'
description: 'Action for aliyun cli.'
inputs:
  version:
    description: 'The version number of aliyun-cli to download'
    required: false
    default: '3.0.121'
outputs: {}

runs:
  using: "composite"
  steps:
    - name: Install aliyun cli
      shell: bash
      run: |
        # install aliyun-cli
        curl -sL https://github.com/aliyun/aliyun-cli/releases/download/v${{ inputs.version }}/aliyun-cli-linux-${{ inputs.version }}-amd64.tgz | tar -xzf - -C /usr/local/bin --strip-components=1 aliyun
        aliyun --version

安装 cli 原理展开

  • curl 下载文件
    • -s:静默方式,不显示进度
    • -L: 采用重定向方式,不用生成文件
  • 后面 tar 接收参数
这行代码是将之前通过 curl 命令下载的 aliyun-cli 压缩包文件解压,并将其中的 aliyun 文件安装到 /usr/local/bin 目录中。
具体地,tar 命令的 -xzf 选项表示解压该文件,并指定压缩包文件的输入来源是标准输入(因为 - 符号表示标准输入),-C 选项表示在解压文件前
先切换到指定的目录中,这里是 /usr/local/bin,--strip-components=1 选项表示解压时去除文件路径前缀,仅保留文件名。
最后的 aliyun 参数表示只解压文件中名为 aliyun 的文件,而忽略其他的文件。
因此,该命令的作用是将 aliyun-cli 的 aliyun 可执行文件安装到了系统的可执行文件目录中,以便于在任意路径下执行该命令。

Makefile 用于发布

  • 定义变量: VERSION := 1.0.0
  • 定义内部任务: .PHONY: release publish check 而不是文件,因为 make 后面可以编译文件名
  • @ 开头的命令,屏蔽消息回显
  • 指定 default 任务:
    • 方式1: .DEFAULT_GOAL := publish
    • 方式2: default: publish
# 定义项目名称和初始版本号
PROJECT_NAME := action-aliyun-cli
VERSION := 1.0.0

# 定义发布相关变量
RELEASE_BRANCH := master
RELEASE_TAG := $(shell echo $(VERSION) | awk -F. '{print $$1"."$$2"."$$3+1}')
RELEASE_COMMIT_MSG := Release $(RELEASE_TAG)
RELEASE_TAG_MSG := Release $(RELEASE_TAG)

.PHONY: release publish check

# 创建新的 git tag 并将其推送到 GitHub
release:
	@echo "Creating git tag and pushing to GitHub..."
	@git checkout $(RELEASE_BRANCH)
	@git tag -a $(RELEASE_TAG) -m "$(RELEASE_TAG_MSG)"
	@git commit -m "$(RELEASE_COMMIT_MSG)" --allow-empty
	@git push origin $(RELEASE_TAG)

	@echo "Creating GitHub Release..."
	@gh release create $(RELEASE_TAG) \
	--title "$(RELEASE_TAG_MSG)" \
	--notes "$(RELEASE_COMMIT_MSG)"


# 递增版本号并发布新版本
publish:
	@echo "Publishing $(VERSION)"
	$(eval VERSION=$(shell echo $(VERSION) | awk -F. '{print $$1"."$$2"."$$3+1}'))
	$(MAKE) release

# 打印版本信息以进行 check
check:
	@echo "PROJECT_NAME=$(PROJECT_NAME)"
	@echo "VERSION=$(VERSION)"
	@echo "RELEASE_BRANCH=$(RELEASE_BRANCH)"
	@echo "RELEASE_TAG=$(RELEASE_TAG)"
	@echo "RELEASE_COMMIT_MSG=$(RELEASE_COMMIT_MSG)"
	@echo "RELEASE_TAG_MSG=$(RELEASE_TAG_MSG)"

# 设置默认目标
default: publish

参考