如何设置 GitHub 操作以发布 Lerna Monorepo
Posted
技术标签:
【中文标题】如何设置 GitHub 操作以发布 Lerna Monorepo【英文标题】:How To Set Up GitHub Actions to Publish a Lerna Monorepo 【发布时间】:2019-12-27 01:43:00 【问题描述】:我维护一个 lerna/yarn monorepo。我正在将 CI/CD 从 circle 迁移到新的 GitHuba Actions 发布测试版。我创建了以下工作流程:
name: CD
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Checkout master
run: git checkout master
- name: Install rsync
run: sudo apt install rsync
- name: Install yarn
run: |
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update
sudo apt-get install yarn
- name: Install Packages
run: yarn install
- name: Test
run: yarn test
- name: Upload coverage results to Code Climate
run: sh ./scripts/upload-coverage.sh
env:
CC_TEST_REPORTER_ID: $ secrets.CC_TEST_REPORTER_ID
- name: Authenticate with Registry
run: echo "registry=//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc
env:
NPM_TOKEN: $ secrets.NPM_TOKEN
- name: Configure CI Git User
run: |
git config --global user.email octobot@github.com
git config --global user.name GitHub Actions
- name: Publish package
run: yarn deploy --yes
env:
GITHUB_TOKEN: $ secrets.GITHUB_TOKEN
- name: Build Docs
run: yarn docs
- name: Deploy Docs
run: |
echo "apolloelements.dev" > docs/CNAME
npx gh-pages --dist docs
在发布包步骤失败并显示以下消息:
lerna info git Pushing tags...
lerna ERR! Error: Command failed: git push --follow-tags --no-verify origin master
lerna ERR! fatal: could not read Username for 'https://github.com': No such device or address
lerna ERR!
lerna ERR! at makeError (/home/runner/work/apollo-elements/apollo-elements/node_modules/execa/index.js:174:9)
lerna ERR! at Promise.all.then.arr (/home/runner/work/apollo-elements/apollo-elements/node_modules/execa/index.js:278:16)
lerna ERR! Error: Command failed: git push --follow-tags --no-verify origin master
lerna ERR! fatal: could not read Username for 'https://github.com': No such device or address
lerna ERR!
lerna ERR! at makeError (/home/runner/work/apollo-elements/apollo-elements/node_modules/execa/index.js:174:9)
lerna ERR! at Promise.all.then.arr (/home/runner/work/apollo-elements/apollo-elements/node_modules/execa/index.js:278:16)
lerna ERR! lerna Command failed: git push --follow-tags --no-verify origin master
lerna ERR! lerna fatal: could not read Username for 'https://github.com': No such device or address
lerna ERR! lerna
error Command failed with exit code 128.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
将遥控器更改为使用 HTTPS 并且 github 令牌没有帮助:
git remote rm origin
git remote add origin "https://$USER_NAME:$GITHUB_PERSONAL_ACCESS_TOKEN@github.com/apollo-elements/apollo-elements.git"
其中GITHUB_PERSONAL_ACCESS_TOKEN
是通过秘密传递的 PAT。
在那种情况下,我收到了这个错误:
lerna ERR! ENOREMOTEBRANCH Branch 'master' doesn't exist in remote 'origin'.
我应该如何设置项目以便能够将标签和提交从 CD 推送回存储库?
【问题讨论】:
developer.github.com/actions/managing-workflows/storing-secrets 文档说“每个存储库都包含一个 GITHUB_TOKEN 密码,但默认情况下它不可用于操作。您必须将 GITHUB_TOKEN 密码添加到每个需要访问权限的操作。”我不知道“将令牌秘密添加到操作中”意味着什么,因为我在文档中找不到详细信息,而且我还没有进入测试版,所以我无法自己测试。但如果这涉及 GitHub GUI 中的某些配置步骤,请检查您是否已完成。 或者,由于“无法读取用户名”出现在错误中,您只需要编辑 Lerna 配置以使 repo URL 为https://USERNAME:GITHUB_TOKEN@github.com/yourorg/yourrepo
或其他内容。可能就是这么简单。
谢谢,我已经编辑了问题以反映我在这些方面所做的尝试
啊……现在我们到了某个地方。我们似乎已经连接到 repo,但是我们得到了一个不同的错误,可能是因为 lerna 的本地副本不知道 origin
repo 包含哪些分支(因为自从你创建以来它从未在它上面做过 fetch
遥控器)。所以在git remote add origin $URL
步骤之后立即执行git fetch origin
,然后lerna 的repo 本地副本应该知道origin
repo 包含哪些分支,并且应该能够推送到origin
的master` 分支。
【参考方案1】:
更新:
此配置实际上是端到端工作的。该配置的主要特点是:
用git remote set-url origin https://$GITHUB_ACTOR:$GITHUB_PAT@github.com/bennypowers/apollo-elements
设置遥控器
GITHUB_ACTOR
由运行者提供,GITHUB_PAT
是存储库机密中设置的 Github 个人访问令牌。
用git checkout "$GITHUB_REF:11" && git pull
重新检查和拉取
退出纱线,因为lerna
无法处理纱线。
使用下面显示的特定的、挑剔的 .npmrc
设置,因为这是一个作用域包。
在设置身份验证后运行npm whoami
。
如果身份验证被破坏,这将抛出
lerna publish
将为您的每个包推送标签,并且可能还会写入 CHANGELOG.md 和 package.json 文件,即使它由于身份验证错误而没有发布。
在此处运行npm whoami
以检查您是否真的可以在运行lerna
之前发布,从而避免手动恢复存储库状态的麻烦。
将GITHUB_TOKEN
、GH_TOKEN
和NPM_TOKEN
传递给lerna publish
name: CD
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v1
- name: Configure CI Git User
run: |
git config --global user.name '@bennypowers'
git config --global user.email 'bennypowers@users.noreply.github.com'
git remote set-url origin https://$GITHUB_ACTOR:$GITHUB_PAT@github.com/bennypowers/apollo-elements
env:
GITHUB_PAT: $ secrets.GITHUB_PAT
- name: Checkout and pull branch
run: git checkout "$GITHUB_REF:11" && git pull
- name: Install Packages
run: yarn install
- name: Authenticate with Registry
run: |
yarn logout
echo "@apollo-elements:registry=http://registry.npmjs.org/" > .npmrc
echo "registry=http://registry.npmjs.org/" >> .npmrc
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> .npmrc
npm whoami
env:
NPM_TOKEN: $ secrets.NPM_TOKEN
- name: Publish package
run: lerna publish --yes --message 'chore: release new versions'
env:
GH_TOKEN: $ secrets.GITHUB_PAT
GITHUB_TOKEN: $ secrets.GITHUB_PAT
NPM_TOKEN: $ secrets.NPM_TOKEN
请注意,上面的配置编辑了一些不相关的步骤。未编辑的版本见the complete workflow
原始答案:
在 *** 用户 @rmunn 的帮助下,我找到了这个解决方案:
- name: Configure CI Git User
run: |
git remote rm origin
git remote add origin "https://$USER_NAME:$GITHUB_PAT@github.com/apollo-elements/apollo-elements.git"
git fetch
git config --global user.email octobot@github.com
git config --global user.name GitHub Actions
env:
USER_NAME: $ secrets.DEPLOYING_USER_NAME
GITHUB_PAT: $ secrets.GITHUB_PAT
其中GITHUB_PAT
是具有repo
范围的个人访问令牌,保存在机密中。
git fetch
需要在更改后的遥控器上设置本地分支。需要个人访问令牌才能推送回存储库。
【讨论】:
有趣的是,我正在查看您的存储库,以相同的方式设置我的,我得到了 'lerna ERR! ENOGIT 分离的 git HEAD,请签出一个分支来选择版本。使用这种方法,将查看并报告回 在提取后添加了一个结帐主步骤,似乎已经修复了它 您应该使用:actions/checkout@v2
和 fetch-depth: 0
和 token: $ secrets.GITHUB_PAT
,而不是使用 actions/checkout@v1
现在可以简化吗? docs.github.com/en/actions/language-and-framework-guides/…
GITHUB_PAT
是所有 Github 存储库中现有/已知的秘密吗?当我尝试创建一个名为 GITHUB_PAT
的存储库密码时,我得到一个 Failed to add secret。名称无效 错误。我可以创建其他没有问题的。【参考方案2】:
现在可以通过使用checkout@v2
和setup-node@v2
来使用更简单的配置
jobs:
build:
runs-on: ubuntu-latest
env:
NODE_AUTH_TOKEN: $ secrets.NPM_TOKEN
steps:
# 1. provide Personal Access Token for checkout@v2
- name: Checkout
uses: actions/checkout@v2
with:
submodules: recursive
token: $ secrets.PUBLISH_PAT
# 2. setup .npmrc it uses NODE_AUTH_TOKEN
- name: Setup .npmrc file for publish
uses: actions/setup-node@v2
with:
node-version: '12.x'
registry-url: 'https://registry.npmjs.org'
# 3. configure git user used to push tag
- name: Configure Git User
run: |
git config --global user.email "ci@your-site.com"
git config --global user.name "ci@$GITHUB_ACTOR"
- name: Install dependencies
run: yarn install
- name: Publish
run: |
lerna publish --yes
设置repository secret 如下:
NPM_TOKEN
是具有publish
权限的 NPM 令牌,more info
PUBLISH_PAT
是具有repo
权限的github 个人访问令牌,more info
【讨论】:
这实际上为我解决了它。只是一个小提示:您可以使用已经可用的secrets.GITHUB_TOKEN
而不是secrets.PUBLISH_PAT
【参考方案3】:
在@JeroenKnoops 评论的基础上,使用checkout@v2
,可以有一个更简单的方法:
name: lerna publish
on:
push:
branches:
- master
jobs:
publish:
runs-on: ubuntu-latest
env:
NPM_TOKEN: $ secrets.GITHUB_TOKEN
GITHUB_TOKEN: $ secrets.GITHUB_TOKEN
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Read node version
run: echo ::set-output name=nodever::$(cat .nvmrc)
id: nvm
- name: Setup node
uses: actions/setup-node@v1
with:
node-version: '$ steps.nvm.outputs.nodever '
registry-url: https://npm.pkg.github.com/
- name: Configure Git User
run: |
git config --global user.email "ci@example.com"
git config --global user.name "@$GITHUB_ACTOR"
- run: npx lerna publish --conventional-commits --yes
请注意,在此示例中,我配置了一个 .npmrc
,它引用 NPM_TOKEN
环境变量进行身份验证:
@myco:registry=https://npm.pkg.github.com/
//npm.pkg.github.com/:always-auth=true
//npm.pkg.github.com/:_authToken=$NPM_TOKEN
【讨论】:
能否请您也显示npmrc?这两个答案都是不完整的。 ?以上是关于如何设置 GitHub 操作以发布 Lerna Monorepo的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 TypeScript 设置 Lerna monorepo
应该如何配置 VSCode 以支持 Lerna Monorepo?