我该如何在Github Actions中指定架构?

6

我该如何在Github Actions中指定体系结构(例如x86arm64)?


为什么?是为了运行器?编译器?还是您的应用程序? - jessehouwing
对于跑步者。 - mingpepe
4个回答

5

不,您不能设置GitHub托管的runner架构。这些虚拟机运行x64。目前没有办法指定或请求其他结构。

如果您需要在arm64或x86上使用runner,则需要设置自己的主机/虚拟机并将runner与构建过程需要的任何其他工具一起安装。

您可以使用GitHub/virtual-environments存储库借用设置脚本,但需要进行适当的调整以支持您选择的架构。


看起来有一个支持arm64的Alpha版本(仅限于Linux操作系统)。 - David Wer
2
@DavidWer,该链接指向TravesCI而非GitHub Actions。我在未来几个月的路线图中没有看到ARM的计划。 - jessehouwing

0

我相信你可以将架构指定为环境变量。

- name: Set up Python 3.8.5
  uses: actions/setup-python@v3
  with:
    architecture: 'x64'
    python-version: 3.8.5

0

正如@jessehouwing所说,您需要使用自托管的运行程序。GitHub托管的运行程序尚不支持arm64。您可以通过启动一个arm64虚拟机并安装actions/runner来创建运行程序。您还可以使用一个更完整的分离式解决方案,在 fly 上创建这些运行程序。您有三个可靠的选择:

import { aws_codebuild as codebuild } from 'aws-cdk-lib';
import { Architecture, CodeBuildRunnerProvider } from '@cloudsnorkel/cdk-github-runners';

new GitHubRunners(this, 'runners', {
  providers: [
    new CodeBuildRunnerProvider(this, 'CodeBuild ARM64', {
      labels: ['codebuild', 'arm64'],
      computeType: codebuild.ComputeType.SMALL,
      imageBuilder: CodeBuildRunnerProvider.imageBuilder(this, 'Runner Image Builder', {
        architecture: Architecture.ARM64,
      }),
    }),
  ],
});

你的工作流应该使用runs-on: [自托管, codebuild, arm64]


0
你可以使用qemu和跨平台的docker镜像来实现这个结果。有一个名为run-on-architecture的GH工作流操作,试图为您打包这个。
您还可以将构建操作打包到一个dockerfile中,构建该dockerfile,并(如果需要)将输出复制到主机运行程序。我将尝试提供一个小例子:
Dockerfile:
FROM debian:bullseye

ENV project myproject
ENV DEBIAN_FRONTEND noninteractive
ENV LC_ALL en_US.UTF-8
ENV LANG ${LC_ALL}

RUN echo "#log: ${project}: Setup system" \
  && set -x \
  && apt-get update -y \
  && apt-get install -y \
    build-essential \
    python3 \
  && apt-get clean \
  && sync

ADD . /usr/local/opt/${project}
WORKDIR /usr/local/opt/${project}

RUN echo "#log: ${project}: Running build" \
  && set -x \
  && ./configure \
  && make \
  && make dist

CMD /bin/bash -l

这是一个纯粹的Dockerfile。现在的关键是借助quemu-user在多个架构上运行它。还有一个GitHub操作可以设置这个。
首先,这是如何在本地跨平台运行的:
docker build --name --tag my-builder --platform linux/arm64
docker build --name --tag my-builder --platform linux/arm

然后,您可以使用docker createdocker cp命令来复制这些构件:
CONTAINER=$docker create --platform "linux/arm64" my-builder)
docker cp "$CONTAINER:/usr/local/opt/myproject/*.tar.gz" .
docker rm "$CONTAINER"

CONTAINER=$docker create --platform "linux/arm" my-builder)
docker cp "$CONTAINER:/usr/local/opt/myproject/*.tar.gz" .
docker rm "$CONTAINER"

从这里开始,有几种方法可以在 GitHub Action 中运行此操作。一种方法是使用 setup-qemu-action。然后在工作流程中运行构建和复制步骤。类似于这样:
jobs:
  build:
    runs-on: ubuntu-22.04
    strategy:
      matrix:
        platform: [linux/amd64, linux/arm64, linux/arm]
    steps:
      - uses: actions/checkout@v4
      - uses: docker/setup-qemu-action@v3
        with:
          image: tonistiigi/binfmt:latest
          platforms: arm,arm64
      - run: >
          docker build .
          --tag my-builder
          --platform ${{ matrix.platform }}
      - run: >
          docker create
          --name node-bcryptjs-builder
          --platform ${{ matrix.platform }}
          my-builder
      - run: docker cp "my-builder:/usr/local/opt/myproject/*.tar.gz .

另请参阅:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接