如何为过时的Docker依赖包创建拉取请求

41次阅读
没有评论

问题描述

在使用GitHub平台和GitHub Actions进行CI/CD时,遇到了一个问题。他正在创建一个Dockerfile,并且需要安装一个依赖包(比如Terraform)。每当”https://checkpoint-api.hashicorp.com/v1/check/terraform“中的’current_version’发生变化时,他希望自动创建一个拉取请求(用于更改包含版本信息的JSON文件)。
他已经研究了Dependabot和Renovate等选项。也考虑过创建一个Cron job来实现。他希望能够得到一些建议,了解如何实现这个需求。
以下是他的高级代码示例:

FROM ubuntu:18.04
RUN apt-get install # install packages such as curl and wget
wget -O terraform.zip https://releases.hashicorp.com/terraform/${JSON_FILE.TF_VERSION}/terraform_${JSON_FILE.TF_VERSION}_linux_amd64.zip

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

假设你的Dockerfile如下所示:

FROM ubuntu:18.04
ARG TF_VERSION=0.12.25
RUN apt-get install wget -y
RUN wget -O terraform.zip https://releases.hashicorp.com/terraform/${TF_VERSION}/terraform_${TF_VERSION}_linux_amd64.zip

在你的GitHub Action中,你需要从Dockerfile中获取当前版本:

export CURRENT_TF_VERSION=$(grep -Eo '[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*' Dockerfile)

然后获取最新的Terraform版本:

export LATEST_TF_VERSION=$(curl -s 'https://checkpoint-api.hashicorp.com/v1/check/terraform' | jq -r .current_version)

现在,在bash中或使用GitHub Actions中的ifoutputs,比较这两个值。如果它们不相同,则在Dockerfile中查找并替换当前版本为最新版本:

sed -i "s/${CURRENT_TF_VERSION}/${LATEST_TF_VERSION}/" Dockerfile

然后,你可以使用create-pull-request GitHub Action来创建一个拉取请求。
create-pull-request的文档中没有提到如果没有任何更改会发生什么,我在这里提了一个问题。如果没有更改时不会抛出错误,那么你可以简单地获取最新值并运行sed命令:

sed "s/[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*/${LATEST_TF_VERSION}/" Dockerfile

方案2

使用脚本或工具来管理拉取请求可能会增加复杂性,并且需要确保正确设置Dockerfile中的版本信息。
另一种方法是编写脚本或使用工具来控制拉取请求的创建。你可以使用GitHub Actions中的create-pull-request来创建拉取请求,但需要确保在Dockerfile中正确设置版本信息。
以下是一个简单的bash脚本示例,可以在Dockerfile中的版本信息发生更改时创建拉取请求:

#!/bin/bash
# 获取当前版本
CURRENT_TF_VERSION=$(grep -Eo '[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*' Dockerfile)
# 获取最新版本
LATEST_TF_VERSION=$(curl -s 'https://checkpoint-api.hashicorp.com/v1/check/terraform' | jq -r .current_version)
# 比较版本
if [[ "$CURRENT_TF_VERSION" != "$LATEST_TF_VERSION" ]]; then
  # 在Dockerfile中替换版本
  sed -i "s/${CURRENT_TF_VERSION}/${LATEST_TF_VERSION}/" Dockerfile
  # 创建拉取请求
  # 使用create-pull-request工具或GitHub Actions来创建拉取请求
fi

在这个示例中,我们首先使用grep命令从Dockerfile中获取当前版本,并使用curljq命令获取最新版本。然后,我们比较这两个版本。如果它们不相同,我们使用sed命令在Dockerfile中替换当前版本为最新版本,并使用create-pull-request工具或GitHub Actions来创建拉取请求。
请注意,这只是一个示例,你需要根据你的实际需求进行适当的修改和配置。

正文完