使用Docker自定义GitHub操作

2020-11-12 17:39:28

最近,我终于决定尝试GitHub的行动,只为一个相对简单的任务:构建和部署我的个人网站。该网站是与左拉一起建造的,并被部署成网络。

然后,我只需确保我的站点源代码已签出,并运行Build和Deploy命令。

动作是可以在更大的工作流程中执行的单个步骤,它将多个动作串在一起,并在响应各种事件(如GIT推送或公关)时启动。您可以使用调用单个操作的工作流,但如果不在工作流中调用操作,则不能使用该操作。

我首先注意到了市场方法,以及对行动的强调,这些行动完成了你们共同撰写的一件小事。这绝对是一种很好的方法,但我更喜欢这样处理CI任务的方式是访问Docker容器,在那里我可以更好地控制我的环境,并可以将其编码到熟悉的Dockerfile中。

我的想法是,如果我能用这种方法工作,我对GitHub操作所需的领域知识就会少一些,而只需依靠我在Docker上的知识就可以设置我可能需要的任何操作。

不用说,我只是避开了市场,找到了使用Docker的文档,谢天谢地,这是一个有效的选择!🎉。

我跌跌撞撞地经历了这一点,但最终还是对这种方法感到满意。我能够拥有Dockerfile和自定义entry ypoint.sh文件,它们可以通过环境变量接收来自操作配置的输入。我还能够通过管道将存储在GitHub资源库中的秘密从工作流文件传送到操作中。

#.github/action/build-and-ploy/action.yml名称:';构建和部署';描述:';使用Zola构建站点并部署到Netlify;输入:AUTH_TOKEN:Description:';Netlify auth Token';必需:true site_id:Description:';Netlify要部署到';的Netlify站点ID;必需:True Deploy_dir:Description:';要部署到Netlify的目录。必需:True Zola_Version:描述:';要获取的Zola版本;必需:True默认:';0.12.2';运行:使用:';docker';图像:';Dockerfile';环境:ZOLA_VERSION:${{inputs.zola_Version}}NETLIFY_AUTH_TOKEN:${{inputs.auth_Token}}NETLIFY_SITE_ID:${{inputs.site_id}}NETLIFY_Deploy_DIR:${inputs.Deploy_dir}}

此文件定义我们的操作,该操作将从我们稍后配置的工作流中调用。这里需要注意的主要问题是我们如何接受输入,并通过环境变量将这些输入传递给我们的Docker容器。

这是我偶然发现的事情之一。目前不支持将构建参数传递到Dockerfile,并且我们提供的环境变量在构建阶段不可用,只有在调用入口点之后才能使用。

在意识到runs.args和docker不是构建参数,它们是发送到入口点的参数之前,我被困在这一点上有相当长的一段时间。不要重蹈我的覆辙!

这里的意思是,您的操作中需要这些输入之一的任何步骤都必须发生在通过env提供的入口点中。我很快就会再次提到这一点。

Docker文件非常小,只需设置我想要的基本环境(在本例中为NODE:lts),然后复制我的自定义[Entrypoint.sh](http://entrypoint.sh)脚本)。

小费!不要设置工作目录。该操作将workdir设置为$GITHUB_WORKSPACE变量,该变量是您的项目源代码所在的位置。

#.github/actions/build-and-deploy/entrypoint.sh#!/usr/bin/env bash ZOLA_URL=https://github.com/getzola/zola/releases/download/v${ZOLA_VERSION}/zola-v${ZOLA_VERSION}-x86_64-unknown-linux-gnu.tar.gzcurl-L$ZOLA_URL|tar XZ-C/USR/LOCAL/BIN#安装netlify npm i-g netlify-cli#启动构建和部署Zola Buildnetlify部署\--产品\--目录=$NETLIFY_DEPLOY_。目录\--AUTH=$NETLIFY_AUTH_TOKEN\--SITE=$NETLIFY_SITE_ID。

您可以在这里看到,我们正在引用我们在操作文件中定义的环境变量。最初,我在Dockerfile中执行了Zola和netlify安装步骤,但由于无法将构建参数传递给镜像,所以我无法传入$Zola_Version。一旦我意识到这一点,将所有内容都放在entry ypoint.sh中似乎同样可行。

#.github/workworks/build-and-ploye.yml名称:Build-and-Deploy on:Push:Branch:[master]Jobs:Build-and-Deploy:Running-On:Ubuntu-最新步骤:-用法:Actions/Checkout@v2-用法:./.github/Actions/Build-Deploy with:Zola_Version:';0.12.2';Zola_Version:';0.12.2';AUTH_TOKEN:${secs.NETLIFY_AUTH_TOKEN}}site_id:${secs.NETLIFY_SITE_ID}}Deploy_dir:';public';

这是我们的最终配置文件,将新的自定义操作转换为工作流。我们首先在ON块中设置工作流触发器。在本例中,我们只想在推送到MASTER上运行此工作流。

下一步是我们的工作区块。我们可以定义多个并行运行的作业。如果我们需要任何连续的东西,它应该发生在一个单一的任务。在我们的例子中,我们只有一个作业和两个动作。

作业本身以签出操作开始,该操作处理将存储库的源签出到作业工作区,然后我们通过提供操作文件夹的路径来调用自定义操作。

在With块中,我们为我们在操作上定义的输入提供值。您会注意到其中两个值是通过Secret提供的,这是我在此之前不知道的GitHub的一个功能。使用它非常容易!

我认为这里的主要缺点是作业运行时间可能很慢,因为我们每次都要安装依赖项。根据实际缓慢程度的不同,有很多方法可以解决这个问题。

总而言之,找到一个基本的Docker图像会有所帮助,它可以尽可能多地满足您的需求(而不会过于臃肿)。在某个注册表中维护您自己的图像会带来自己的开销,但这也是一种选择。

我确信使用Marketplace方法也可能是解决性能问题的一种方法,假设您找到的操作都安装了依赖项并进行了适当的配置,但本文的目标是探索最小的操作配置,同时利用Docker😄的强大功能。