首页 > web前端 > js教程 > 与Docker建造跨平台CI/CD动作

与Docker建造跨平台CI/CD动作

DDD
发布: 2025-01-30 00:31:09
原创
933 人浏览过

上周,我被头痛击中 - 我们完美调整的lingo.dev github Actions Workflow无法在贡献者的gitlab实例上运行。然后,我意识到,无论平台如何,我实际上都想在任何地方运行相同的自动化。

>因此,我进行了一个任务,以构建在Github,Gitlab和Bitbucket上运行的跨平台CI自动化(也可能还有其他!)。该解决方案最初是一种简单的github操作,但在我们需要支持多个代码托管平台时发展成为功能更强大的东西。 Building Cross-Platform CI/CD Actions with Docker

我将带您完成确切的过程:

开始简单,我将展示GitHub Action的工作

升级以构建可重复使用的docker image

>最后,我将向您展示如何在每个平台上运行此操作
  1. >按照步骤构建和运送您的第一个跨平台动作。或为文章添加书签以
  2. tl; dr请参阅模板存储库???

1。启动简单:在github操作中运行javascript

运行github动作

让我们从最简单的github操作开始 - 一个运行JavaScript文件的操作。首先,在您的存储库的根部创建index.js:
>

现在创建一个工作流文件.github/workflows/hello.yml:


这个动作将:

console.log("Hello World");

登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

触发到主要分支

>查看您的存储库
name: Hello World
on:
  push:
    branches:
      - main

jobs:
  hello:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: "20"
      - name: Say Hello
        run: node index.js

登录后复制
登录后复制
登录后复制

>设置node.js环境

    运行脚本
  1. 使其可重复使用
  2. 现在,让我们通过将其移动到单独的存储库来重复使用此操作。使用这些文件创建一个新的github存储库(例如,像我的示例一样hello-world-action):
  3. index.js(与之前相同):

Action.yml:

  1. >现在您可以通过在工作流中引用任何存储库中的此操作:>
console.log("Hello World");

登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
    关键差异是:
动作以自己的存储库生活
name: "Hello World Action"
description: "A simple action that says hello"
runs:
  using: "node20"
  main: "index.js"

登录后复制
登录后复制
Action.yml定义如何运行动作


其他存储库可以使用以下用途来引用它:your-username/hello-world-action@ref

name: Use Hello Action
on:
  push:
    branches:
      - main

jobs:
  hello:
    runs-on: ubuntu-latest
    steps:
      - name: Say Hello
        uses: your-username/hello-world-action@main

登录后复制
登录后复制

2。升级:dockerized打字稿操作

    现在,让我们创建一个更复杂的操作,以运行打字稿代码。我们需要几个文件:
  1. >初始化项目并设置打字稿:

>更新您的软件包。

  1. 然后,将我们的index.js重命名为index.ts使用Typescript代替JavaScript并将其移动到SRC目录。


    pnpm init                # Creates package.json
    pnpm add -D typescript   # Install TypeScript as dev dependency
    
    
    登录后复制
    登录后复制
    >创建tsconfig.json以配置打字稿汇编:>

  2. 创建一个dockerfile:
    {
      "scripts": {
        "build": "tsc"
      }
    }
    
    
    登录后复制
    登录后复制
console.log("Hello World");

登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
  1. >重新定义动作中的动作:yml:
name: Hello World
on:
  push:
    branches:
      - main

jobs:
  hello:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: "20"
      - name: Say Hello
        run: node index.js

登录后复制
登录后复制
登录后复制

在本地运行Docker图像

>要在本地dockerfile中构建并运行图像,您需要Docker Desktop应用程序。然后,假设Docker在本地运行,您可以:

  1. 构建图像:
console.log("Hello World");

登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
  1. >运行它:
name: "Hello World Action"
description: "A simple action that says hello"
runs:
  using: "node20"
  main: "index.js"

登录后复制
登录后复制

3。跨平台支持

现在是最有趣的部分 - 在其他平台上运行您的操作。我们需要:

  1. >构建并将我们的Docker图像推到注册表
  2. >
  3. >用平台特定的配置引用它

建筑和出版Docker图像

首先,创建一个工作流程以在每个版本上构建和推动Docker映像。我们将使用您的github随附的GitHub容器注册表(GHCR)(公共存储库免费,500MB用于免费计划的私人存储库)。
>

name: Use Hello Action
on:
  push:
    branches:
      - main

jobs:
  hello:
    runs-on: ubuntu-latest
    steps:
      - name: Say Hello
        uses: your-username/hello-world-action@main

登录后复制
登录后复制

github动作

要在另一个存储库的github操作中使用此操作,请在.github/workflows/hello..yml中创建一个工作流文件(请参阅GitHub Actions WorkFlow语法文档):
>

pnpm init                # Creates package.json
pnpm add -D typescript   # Install TypeScript as dev dependency

登录后复制
登录后复制

>仅需在github操作上执行此操作,则无需构建和推动Docker映像。 github操作将直接从操作中指定的dockerfile直接构建docker容器。这更有效,因为它避免了推动和从容器注册表中拉出的额外步骤。但是,如果您打算在Gitlab或Bitbucket等其他CI平台上使用此操作,则需要发布如上图所示的Docker映像。

GitHub的免费计划提供了三个平台之间最慷慨的CI/CD分钟分配。它包括:

    >公共存储库的无限分钟
  • >私人存储库的每月2,000分钟
GitLab CI配置

create .gitlab-ci.yml(请参阅Gitlab CI/CD文档):>


>您的gitlab免费计划包括每月400 CI/C的计算分钟,无论存储库是公共的还是私人的。
{
  "scripts": {
    "build": "tsc"
  }
}

登录后复制
登录后复制
>

Bitbucket管道

create bitbucket-pipelines.yml(请参阅Bitbucket Pipeelines文档):


Bitbucket的免费计划每月仅包括50分钟的构建分钟,而不管存储库是公共还是私人,这使其成为所有三个平台中最低的免费层。

其他CI/CD平台
{
  "compilerOptions": {
    "target": "ES2022",
    "module": "commonjs",
    "outDir": "./build",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "exclude": ["node_modules", "build", "**/*.test.ts"]
}

登录后复制

>由于我们在公共Github容器注册表中发布了Docker映像,因此我们可以在支持Docker Images的任何平台上运行此图像。这是由:

支持的

circle ci(docs)

travis ci(docs)
  • >让我知道如果您在其他地方运行,我对您的用例感到好奇!
  • >

    ?你能做什么?

    >我们在任何CI平台上为您的Web和移动应用程序运行自动lingo.DEV本地化。在每个提交中,它都使用lingo.dev本地化引擎更新整个存储库中的翻译 - 作为新提交或通过打开拉请请求(DOCS)。

    github的示例:


console.log("Hello World");

登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

>无论您使用的代码托管平台如何,您都可以构建可重复使用的操作,并轻松地将它们集成到工作流程中。以下是给您的一些想法:

    >跨平台测试记者(编排端到端测试会话)
  • 自定义代码质量检查器(考虑格式,覆盖,测试)
  • >
  • >发行说明生成器(在您的网站上发布更改式?)
  • >
您将使用什么?

>

? 奖励:模板存储库

>如果您不想阅读文章的其余部分,则可以在此处找到带有所有代码的模板入门存储库。它包含动作 - 您可以在github,gitlab和bitbucket上运行它。

>

https://github.com/mathio/awesome-actory-starter

?提示:克隆回购,使其成为您自己动作的起点:

…或者只是从我的模板中创建一个新的存储库。
name: Hello World
on:
  push:
    branches:
      - main

jobs:
  hello:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: "20"
      - name: Say Hello
        run: node index.js

登录后复制
登录后复制
登录后复制
然后,只需在src/index.ts文件中实现自己的操作逻辑。

结论

>我们已经看到了如何从简单的基于壳的github动作发展到可以在任何地方运行的复杂的打字稿动作。关键要点是:

启动Simple从Shell命令开始,以验证您的自动化逻辑

dockerize您的操作以使其可移植
  1. >使用容器注册表在平台上分发您的操作
  2. >在保持docker中的核心逻辑时,调整每个平台的配置
  3. 这种方法使您可以灵活地在维护单个代码库的同时,在任何地方运行自动化。快乐自动化!
  4. >我偶尔在Twitter上发布有关技术内容和新的lingo.dev功能的信息 @Mathio28。让我们保持联系。
>

以上是与Docker建造跨平台CI/CD动作的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板