使用GitHub Actions(和GitHub Package Registry)自动化构建和发布过程

时间:2019-10-11 19:58:44

标签: github npm github-actions github-package-registry

这是一个常见问题解答,我已将解决方案放入答案中。

我是GitHub Actions beta和GitHub Package Registry beta的一部分。由于我很懒惰,所以我不仅自动化了npm软件包的构建过程,而且还希望自动化其发布。
为此,我不得不面对一些问题:

  1. 如何确保在刚构建的版本上执行“发布”作业?
  2. 如何检测GitHub Actions中软件包的版本何时更新?
  3. 如何使用检查结果来编辑Actions工作流程的行为?
  4. 如何从工作流程中将软件包发布到npm?
  5. 发布到npm后,如何将相同的确切版本发布到GitHub Package Registry?

1 个答案:

答案 0 :(得分:1)

注意:所有这些步骤的结果都可以在我实际用于包装的工作流文件中here中找到。

1。确保在刚刚构建的版本上执行“发布”作业

我发现的最简单的方法是将两个作业放在同一工作流程中,并在每个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

2。检测版本更改

我没有找到一种好的方法,所以我做了另一个动作,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

3。使用检查结果来编辑工作流程的行为

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

4。将程序包发布到NPM

将软件包发布到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

5。将软件包发布到GitHub Package Registry

就目前而言,如果您想继续将现有软件包发布到npm,则GitHub Package Registry并不十分友好:这就是为什么它要求对软件包进行范围划分,并且这可能使事情搞砸(您的软件包可能不是作用域或以其他名称作用域。)
我发现解决此问题的最简单方法是执行以下解决方法:

  • 在您的工作流程中,重新设置Node.js,但添加GPR的注册表URL和您的名称范围
  • 创建一个npm脚本来编辑package.json,以便将包的原始名称更改为您需要发布到GPR的名称(包括范围)
  • 在工作流程中调用该脚本之后,像以前一样使用- 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版本中找到我所指的所有内容: