我有一个私有存储库,我正在尝试将 python-semantic-release 添加到 GitHub Actions 中。
当尝试增加版本号时,我收到错误消息,指出我没有对存储库的写访问权限。我已经使用了 Github Classic PAT 和 Finegrained PAT,但两者都不起作用。我授予了所有回购权限只是为了确保我没有搞砸任何事情。
我还在 GitHub Actions 中回应了我的 Secrets.TOKEN,以确保它们也被正确调用。
即使我已生成具有存储库所有权限的访问令牌,为什么我仍会收到写入错误?
主.ymlname: Semantic Release
on:
push:
branches:
- main
jobs:
release:
runs-on: ubuntu-latest
concurrency: release
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Step 1 - Echo out a GitHub Actions Secret to the logs
run: |
echo "The GitHub Action Secret will be masked: "
echo ${{ secrets.TOKEN }}
echo "Trick to echo GitHub Actions Secret: …Run Code Online (Sandbox Code Playgroud) 通过矩阵策略和如下两个作业,第一个作业并行运行可能配置的“矩阵”,当所有配置都成功时,它会转移到第二个作业。
jobs:
job1:
runs-on: ubuntu-latest
strategy:
matrix:
version: [10, 12, 14]
steps:
# etc
job2:
runs-on: ubuntu-latest
needs: job1
strategy:
matrix:
version: [10, 12, 14]
steps:
# etc
Run Code Online (Sandbox Code Playgroud)
最好的是在整个工作流程中本质上有一个矩阵,其中对于每个矩阵值,整个作业工作流程不受阻碍地并行运行。这意味着特定配置job2可以在该配置完成后立即继续job1,无论job1另一个配置是否仍在进行中或已失败。
在下图中,第一种情况是当前将发生的情况,第二种情况是期望的情况:
我觉得这可以通过在不同的上下文中多次启动工作流程来“模拟”。但如何才能做到这一点,例如通过触发器?以某种方式指定on: push工作流程的 3 个版本必须同时运行?
dotnet 发布工作流任务的工作方式发生了一些变化。我们使用这个非常简单的 yaml 脚本已经有一段时间了。
name: Publish to staging server
env:
AZURE_WEBAPP_NAME: 'my-dotnet-webapp'
AZURE_SLOT_NAME: 'staging'
GITHUB_PUBLISH_SECRET: ${{ secrets.AZURE_DEPLOYMENTSLOT_STAGING }}
AZURE_WEBAPP_PACKAGE_PATH: '.'
DOTNET_VERSION: '7.0.0'
on:
push:
branches:
- staging
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up .NET Core
uses: actions/setup-dotnet@v3
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Set up dependency caching for faster builds
uses: actions/cache@v3
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Build with dotnet
run: …Run Code Online (Sandbox Code Playgroud) 我发现编辑 yml 文件,然后再次推送新的提交,并重复该过程数百次直到正确为止,效率很低。我开始思考如何自动化这个繁琐的过程。
我尝试了 GitHub Actions 日志记录,但没有多大帮助。
我在 .NET 解决方案中有一组 .NET 6.0 项目,其中一个是测试数据提供程序。我正在使用LiteDB来存储测试数据记录。该解决方案在本地构建良好并成功完成所有测试。我已经使用 GitHub Actions 在 GitHub 上设置了标准 CI 构建管道;构建完成时没有出现任何问题,并且不依赖于测试数据库的测试运行良好。
但是依赖于 LiteDb 数据库的测试无法运行,因为构建服务器在查找 LiteDb 程序集时似乎存在问题:
源“/home/runner/work/MyProject.Core/MyProject.Core/test/MyProject.Testing.Data/bin/Release/net6.0/MyProject.Testing.Data.dll”的测试主机进程退出并出现错误:错误:找不到应用程序依赖项清单 (MyProject.Testing.Data.deps.json) 中指定的程序集:包:'LiteDB',版本:'5.0.16' 路径:'lib/netstandard2.0/LiteDB。 DLL'
大多数具有类似错误消息的文章都与 ASP.NET Core 相关,例如,未找到应用程序依赖项清单 (...) 中指定的程序集,但抓住了救命稻草,我尝试将以下内容添加到测试数据项目中:
<PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
Run Code Online (Sandbox Code Playgroud)
这没有什么区别。另一个SO答案(How do I get .NET Core items to copy NuGetreferences to the buildoutput?)建议将以下内容添加到.csproj:
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
Run Code Online (Sandbox Code Playgroud)
这解决了缺少的依赖项,但引入了一个新的依赖项:
源“/home/runner/work/MyProject/MyProject/test/MyProject.Testing.Data/bin/Release/net6.0/MyProject.Testing.Data.dll”的测试主机进程退出并出现错误:错误:An找不到应用程序依赖项清单 (testhost.deps.json) 中指定的程序集:包:'Microsoft.TestPlatform.CommunicationUtilities',版本:'15.0.0.0' 路径:'Microsoft.TestPlatform.CommunicationUtilities.dll'
(当然,我尝试添加 Microsoft.TestPlatform 作为依赖项,但这没有任何区别。)
为了完整起见,我确认 Linux 上支持 LiteDb,因为 GitHub Actions 服务在 Ubuntu 上运行 - 看起来那里没有任何问题。应用程序和所有程序集(和测试)都以 .NET 6.0 为目标,并且所有项目都设置为构建 AnyCPU。这是我的ci.yml文件,如果有帮助的话:
name: …Run Code Online (Sandbox Code Playgroud) 我已经在 Windows 服务器上设置了一个自托管运行器,并且设置了在服务器上自动部署/构建存储库所需的必要工作流程。在设置运行器时,我将工作文件夹配置为repos同一目录中调用的文件夹。
我想要的是我的跑步者的文件夹结构是:
C:\deploy
- ...other runner files & folders
- config.cmd
- run.cmd
- repos/
- ..."_actions/", "_temp/" etc.
- <my repo name>/
- ...the content of my repo...
Run Code Online (Sandbox Code Playgroud)
但我看到运行程序在彼此内部创建了 2 个文件夹,并以我的存储库的名称命名。因此,就我而言,构建文件的路径是C:\deploy\repos\<repo name>\<repo name>\build. 有没有办法防止这种双文件夹结构?
我正在使用 GitHub Actions 来构建简单的 docker 映像并将其推送到 GitHub 容器注册表。我的存储库位于组织内部,并且我已在组织级别配置了机密。
该作业成功登录到 ghcr,但是当它尝试将其推送到 ghcr 时,会出现以下错误:
错误:buildx 失败,原因:错误:无法解决:无法推送 ghcr.io/:意外状态:403 禁止。
github-actions.yml
name: Build and Push Freeradius proxy
on:
push:
branches:
- '*'
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
packages: write
steps:
- name: Checkout Code
uses: actions/checkout@v2
with:
token: ${{ secrets.GCR_TOKEN}}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf
- name: Login to GHCR
uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c
with:
registry: ghcr.io
username: ${{ secrets.REPO_OWNER }}
password: ${{ secrets.GCR_TOKEN }}
- name: Build and Push Docker Image
uses: …Run Code Online (Sandbox Code Playgroud) 我想找到一种方法将环境:语句从可重用工作流程移动到调用工作流程。可重用工作流程的开始是:
name: Reusable Terraform Action
on:
workflow_call:
inputs:
working-folder:
description: The name of the client folder to process
required: true
type: string
jobs:
Terraform:
***environment: Development***
env:
ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }}
ARM_CLIENT_SECRET: ${{ secrets.ARM_CLIENT_SECRET }}
ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }}
ARM_SUBSCRIPTION_ID: ${{ secrets.ARM_SUBSCRIPTION_ID }}
runs-on: ubuntu-latest
defaults:
run:
shell: bash
working-directory: ${{ inputs.working-folder }}
Run Code Online (Sandbox Code Playgroud)
调用流程为:
name: Deployment TF Reuse
on:
workflow_dispatch:
jobs:
walm:
uses: ./.github/workflows/reuse-terraform.yml
with:
working-folder: r3us-walm
Run Code Online (Sandbox Code Playgroud)
无论我尝试将环境:开发行放在调用工作流程中的何处,它都会使解析步骤失败。
如果我能找到一种方法来像这样获取它们,我不介意将这 4 个秘密作为参数传递给可重用工作流程,但它仍然抱怨“uses:”语句。
name: Deployment TF Reuse
on:
workflow_dispatch:
jobs:
walm:
environment: …Run Code Online (Sandbox Code Playgroud) 我不断取消 GitHub Actions 工作流程运行,并显示以下消息:
Canceling since a higher priority waiting request for 'your-project' exists
查看 GitHub Actions 文档,我看到:
When a concurrent job or workflow is queued, if another job or workflow using the same
concurrency group in the repository is in progress, the queued job or workflow will be
pending. Any previously pending job or workflow in the concurrency group will be canceled.
Run Code Online (Sandbox Code Playgroud)
因此,这意味着只允许运行一个挂起的工作流程。有没有一种方法可以让我在不使用某种外部排队机制的情况下对多个队列进行排队?
我有一个“工作流程 B”,当“工作流程 A”完成时会自动触发。工作流 A 由每个新的 Pull 请求触发,因此分支会动态变化。
name: Workflow B
on:
workflow_run:
workflows: ['Workflow A']
types:
- completed
workflow_dispatch:
jobs:
first-workflow-job:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Use Node.js
uses: actions/setup-node@v3
with:
cache: 'npm'
Run Code Online (Sandbox Code Playgroud)
我希望工作流程 B 与工作流程 A 在同一分支上运行。但是,工作流程 B 在 master 上运行。如何在这些工作流程之间共享分支值?
github-actions ×10
github ×5
.net-core ×1
access-token ×1
asp.net-core ×1
c# ×1
docker ×1
git ×1
gitlab ×1