GitHub在CI / CD和工件管理中启动了触角

GitHub在2019年5月宣布发布Package Registry服务。 此后,已经在8月宣布了对Actions中CI / CD的支持。


在本文中,我将告诉您什么是服务,以及如何在GitHub上的一个小型宠物项目的示例中使用这些服务。



这些是什么服务?


GitHub Actions是一个平台,可让您管理软件生命周期,其源代码托管在GitHub上。 实际上,TravisCI,CircleCI和许多其他免费的CI / CD平台在Actions方面获得了新的竞争对手。


GitHub Package Registry是工件的中央存储库;当前支持五种不同类型的工件。


动作中受支持的工件类型


行动支持类比语言能力
NPM软件包https://www.npmjs.com/Java脚本
Docker映像https://hub.docker.com/--
Maven工件https://mvnrepository.com/爪哇
Nuget软件包https://www.nuget.org/.NET
红宝石宝石https://rubygems.org/红宝石

这是将所有工件放在一起的便利机会,因为并非总是建议部署Nexus或Artifactory服务器。


GitHub与GitLab越来越相似,并且在某个地方它已经超越了对手,例如,GitLab 尚不支持NuGet包和Ruby gem。 实际上,如果更早地进行开源项目,则必须将外部集成连接到GitHub,那么现在所有的问题都集中在一个篮子里。 在这里,让每个人决定它的好坏,但至少很方便。


怎么尝试?


目前这两种服务都处于beta模式,您可以在这些 页面上注册进行beta测试。


从其他服务的迁移非常简单,我将几个宠物项目分别从TravisCI和DockerHub迁移到了Actions和Package Registry。


我将在一个示例中向您展示它的外观。 该项目是最常见的,我在本文中对此进行了介绍。 没什么复杂的,通常的LaTeX代码,借助其收集的工件(2个PDF文件),将它们发布在GitHub版本中。 为了不下载一堆LaTeX软件包,我编写了一个Dockerfile,以便您可以在任何操作系统下方便地工作。


包注册表


为了开始使用Package Registry而不是DockerHub,您只需要执行两个简单步骤。
在GitHub设置中创建一个令牌(令牌必须具有读写工件权限)。



代币创建页面


然后,我们可以使用创建的令牌进行身份验证并推送工件,这很简单:


docker login docker.pkg.github.com --username amet13 docker tag docker-latex:0.0.1 docker.pkg.github.com/amet13/master-thesis/docker-latex:0.0.1 docker push docker.pkg.github.com/amet13/master-thesis/docker-latex:0.0.1 

请注意,我在GitHub上小写了我的昵称,否则您将从Docker得到错误:


 Error parsing reference: "docker.pkg.github.com/Amet13/master-thesis/docker-latex:0.0.1" is not a valid repository/tag: invalid reference format: repository name must be lowercase 

这是GitHub Web界面中的外观:



Docker映像的软件包注册表页面


除了下载最新映像的说明之外,还提供下载统计信息,还可以通过Web界面下载单独的Docker层,还提供映像下载历史记录。


动作


动作稍微复杂一点,但是对于那些曾经使用过任何其他CI / CD系统的人来说,这并不难理解。 尽管以前使用 HCL,但声明式YAML描述了“操作”中的配置。


一些基本概念(我不会故意翻译这些定义,我认为这里很清楚):


  • 工作流程-管理存储库的软件生命周期(构建,测试,打包,发布,部署)的过程
  • 工作流文件-描述工作流的文件,位于目录.github/workflows/存储库的根目录中。
  • Job是工作流的每一次运行,都会触发Job,在某个时间点可以启动很多Job
  • 步骤-每个作业都有一个步骤,您可以在每个步骤运行命令或操作
  • Action-由某人编写的“插件”,在awesome-actions存储库中可以找到许多Action的列表
  • 虚拟环境-作业运行的环境(实际上,它是Windows,macOS或Linux上的虚拟机)
  • Runner是用于启动Job的已部署环境,一次只能在Runner上运行一个Job
  • 事件-触发工作流的事件,例如,推,拉请求,Webhook,Cron作业等。
  • 工件-工件(二进制文件,图像,日志等)


这就是工作流程中的“工作列表”页面。


限制和禁止:


  • 每个存储库20个工作流
  • 每小时1000个API请求,用于存储库中的所有操作
  • 最长工作时间-6小时
  • 20个作业可以在存储库中并行工作(对于所有工作流程)
  • 禁止将操作用于加密货币挖掘和无服务器计算

此链接提供了最新文档。



这是约伯记之一的日志


例子


让我们回到示例, 这是我的配置,我们将分部分对其进行详细分析。


为工作流指定一个名称,并描述应该在哪个触发器上触发( 文档中描述了所有触发器的列表):


 name: master-thesis on: [push] 

在哪个虚拟环境上运行作业:


 jobs: build: # ubuntu-latest, ubuntu-18.04, or ubuntu-16.04 # windows-latest, windows-2019, or windows-2016 # macOS-latest or macOS-10.14 runs-on: ubuntu-latest 

第一步,在name:指定Step的名称(可选),在uses:我们要使用哪个Action,在这种情况下,请克隆存储库:


  steps: - name: Checkout repo uses: actions/checkout@v1 

在下一步中,我们不使用Action,而仅使用我们的一组命令登录到Package Registry,收集Docker映像并将其推入映像存储库。 在env:块中env:设置环境变量,我们从秘密中获取其中之一:


  - name: Build docker image and push it to the registry env: GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} DOCKER_IMAGE_ORIGIN: "docker.pkg.github.com/amet13/master-thesis/docker-latex" run: | # Pull submodules git submodule init git submodule update --remote # Login to GitHub Packages and build Docker image docker login docker.pkg.github.com -u amet13 -p ${GITHUB_TOKEN} docker pull ${DOCKER_IMAGE_ORIGIN}:latest docker build -t ${DOCKER_IMAGE_ORIGIN}:${GITHUB_SHA} . # Generate PDF artifacts docker run --rm -i \ -v ${PWD}:/master-thesis:Z ${DOCKER_IMAGE_ORIGIN}:${GITHUB_SHA} \ bash -c "latexmk -xelatex -synctex=1 -jobname=master-thesis main.tex" docker run --rm -i \ -v ${PWD}:/master-thesis:Z ${DOCKER_IMAGE_ORIGIN}:${GITHUB_SHA} \ bash -c "cd presentation/ && latexmk -xelatex -synctex=1 -jobname=presentation main.tex" # Publish Docker image to GitHub Packages (with latest tag) docker tag ${DOCKER_IMAGE_ORIGIN}:${GITHUB_SHA} ${DOCKER_IMAGE_ORIGIN}:latest docker push ${DOCKER_IMAGE_ORIGIN}:${GITHUB_SHA} docker push ${DOCKER_IMAGE_ORIGIN}:latest 

我确信不久的将来会出现一个Action,它将自动标记和推送图像,而不是手动编写Docker命令。



添加包含github令牌的机密


构建PDF之后的下一步是在GitHub上创建一个发行版,并将收集的工件包括在此发行版中。 为了自动创建发行版,我们使用了第三方 Action,其中在if:块中,您可以指定启动步骤的条件-仅在创建标记时:


  - name: Create GitHub release with artifacts uses: softprops/action-gh-release@v1 if: startsWith(github.ref, 'refs/tags/') with: files: | master-thesis.pdf presentation/presentation.pdf name: "Build ${GITHUB_SHA}" env: GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} 

总结


尽管处于测试版状态,但两种服务都能正常运行,我敢肯定,很多事情都将完成。
在某些时候可能很不方便,没有全局变量,但是可以用拐杖完成。


我喜欢GitHub放弃HCL而使用YAML的方法。 我还喜欢对许多类型主机的支持,这些主机的限制非常小(目前),让我们看看它是如何进行的。 通常,对于GitHub上公共存储库中的简单管道,这样的组合将非常有效。


本文的翻译已经在媒体上进行

Source: https://habr.com/ru/post/zh-CN468345/


All Articles