这是一个常见问题解答,我已将解决方案放入答案中。
我是GitHub Actions beta和GitHub Package Registry beta的一部分。由于我很懒惰,所以我不仅自动化了npm软件包的构建过程,而且还希望自动化其发布。
为此,我不得不面对一些问题:
答案 0 :(得分:1)
注意:所有这些步骤的结果都可以在我实际用于包装的工作流文件中here中找到。
我发现的最简单的方法是将两个作业放在同一工作流程中,并在每个push
事件中同时触发它们:然后,发布作业被限制为仅在{{1} }分支,并在第一个分支之后。
它需要先构建软件包的新版本,然后将其提交到存储库:提交非常重要,因为这允许其他工作选择构建的版本。要提交在工作流运行过程中所做的更改,可以使用我的操作之一,add-and-commit
:它将使用“伪” git用户将更改推送到GitHub存储库。
您的工作流作业应如下所示:
master
我们希望它在jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v1.0.0
- name: Set up Node.js
uses: actions/setup-node@v1.2.0
with:
node-version: '10.x'
- name: Install dependencies
run: npm install
- name: Compile build
run: npm run build # This can be whatever command you use to build your package
- name: Commit changes
uses: EndBug/add-and-commit@v2.1.0
with: # More info about the arguments on the action page
author_name: Displayed name
author_email: Displayed email
message: "Message for the commit"
path: local/path/to/built/version
pattern: "*.js" # Pattern that matches the files to commit
force: true # Whether to use the --force flag
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This gets generated automatically
完成后仅在master
分支中运行,因此我们可以这样设置:
build
我没有找到一种好的方法,所以我做了另一个动作,version-check
:该动作会扫描每次推送的提交,并试图找出它们是否包含版本更改。
您需要设置以下两个步骤:
publish:
name: Publish to NPM & GitHub Package Registry
runs-on: ubuntu-latest
if: contains(github.ref, 'master') # This sets the branch
needs: build # This makes it wait for the build job
version-check
提供两个输出:steps:
- name: Checkout repository
uses: actions/checkout@v1.0.0
with:
ref: master
- name: Check version changes
uses: EndBug/version-check@v1.0.0 # More info about the arguments on the action page
id: check # This will be the reference for later
(是否有更新)和changed
(更新的类型,例如“ patch”,“ minor”,...) 。
可以通过steps
context访问这些输出,您可以使用if
property使用它们来决定是否运行某个步骤。这是一个示例:
type
将软件包发布到NPM非常简单:只需设置Node.js,然后使用# check is the id we gave to the check step in the previous paragraph
- name: Version update detected
if: steps.check.outputs.changed == 'true'
run: 'echo "Version change! -> ${{ steps.check.outputs.type }}"'
,就像在您自己的计算机上一样。唯一的区别是,您将需要令牌来进行身份验证:您可以在npmjs.com上创建一个令牌。创建它之后,请勿将其放在工作流本身中:可以将其存储为“秘密”,可以找到有关here的更多信息。
在此示例中,我假设您的秘密称为npm publish
:
NPM_TOKEN
就目前而言,如果您想继续将现有软件包发布到npm,则GitHub Package Registry并不十分友好:这就是为什么它要求对软件包进行范围划分,并且这可能使事情搞砸(您的软件包可能不是作用域或以其他名称作用域。)
我发现解决此问题的最简单方法是执行以下解决方法:
- name: Set up Node.js for NPM
if: steps.check.outputs.changed == 'true'
uses: actions/setup-node@v1.2.0
with:
registry-url: 'https://registry.npmjs.org' # This is just the default registry URL
- name: Install dependencies
if: steps.check.outputs.changed == 'true'
run: npm install
- name: Publish the package to NPM
if: steps.check.outputs.changed == 'true'
run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} # NPM will automatically authenticate with this
,但是这次使用内置的npm publish
作为GITHUB_TOKEN
。NODE_AUTH_TOKEN
{
"name": "YourPackageName",
...
"scripts": {
"gpr-setup": "node scripts/gpr.js"
}
}
// scripts/gpr.js
const fs = require('fs')
const { join } = require('path')
// Get the package obejct and change the name
const pkg = require('../package.json')
pkg.name = '@yourscope/YourPackageName'
// Update package.json with the udpated name
fs.writeFileSync(join(__dirname, '../package.json'), JSON.stringify(pkg))
您的软件包现在同时发布到NPM和GPR(不过,需要手动将说明添加到GPR)。 您可以在uptime-monitor的4.0.3版本中找到我所指的所有内容: