Github Actions学习: 定义一个 gh action
一步一步实现一个 gh actions
一图胜千言
创建一个 只有 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
- 方式1:
# 定义项目名称和初始版本号
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