Compare commits

..

3 Commits

Author SHA1 Message Date
Aman Singh cd3745b3ca fix: [CI-8113]: added kaniko 1.9.2 support (#83)
* fix: [CI-8113]: added kaniko 1.9.2 support

* fix: [CI-8113]: added kaniko 1.9.2 support
2023-05-24 15:52:18 +05:30
Dan Home 13a217a4af ECR: Add assume-role support for create-repository, *-policy (#79)
* ECR: Add assume-role support for create-repository, *-policy

* Rearrange imports
2023-05-19 16:55:09 +01:00
Aman Singh 481ee9f624 incremented-drone-version (#82) 2023-05-17 13:06:17 +05:30
21 changed files with 166 additions and 105 deletions
+17 -17
View File
@@ -4,7 +4,7 @@ name: default
steps:
- name: build
image: golang:1.18
image: golang:1.19
commands:
- go test ./...
- sh scripts/build.sh
@@ -82,9 +82,9 @@ steps:
settings:
repo: plugins/kaniko
auto_tag: true
auto_tag_suffix: linux-amd64-kaniko1.9.1
auto_tag_suffix: linux-amd64-kaniko1.9.2
daemon_off: false
dockerfile: docker/docker/Dockerfile.linux.amd64.kaniko1.9.1
dockerfile: docker/docker/Dockerfile.linux.amd64.kaniko1.9.2
username:
from_secret: docker_username
password:
@@ -99,9 +99,9 @@ steps:
settings:
repo: plugins/kaniko-gcr
auto_tag: true
auto_tag_suffix: linux-amd64-kaniko1.9.1
auto_tag_suffix: linux-amd64-kaniko1.9.2
daemon_off: false
dockerfile: docker/gcr/Dockerfile.linux.amd64.kaniko1.9.1
dockerfile: docker/gcr/Dockerfile.linux.amd64.kaniko1.9.2
username:
from_secret: docker_username
password:
@@ -117,9 +117,9 @@ steps:
settings:
repo: plugins/kaniko-ecr
auto_tag: true
auto_tag_suffix: linux-amd64-kaniko1.9.1
auto_tag_suffix: linux-amd64-kaniko1.9.2
daemon_off: false
dockerfile: docker/ecr/Dockerfile.linux.amd64.kaniko1.9.1
dockerfile: docker/ecr/Dockerfile.linux.amd64.kaniko1.9.2
username:
from_secret: docker_username
password:
@@ -138,7 +138,7 @@ pool:
steps:
- name: build
image: golang:1.18
image: golang:1.19
commands:
- go test ./...
- sh scripts/build.sh
@@ -216,9 +216,9 @@ steps:
settings:
repo: plugins/kaniko
auto_tag: true
auto_tag_suffix: linux-arm64-kaniko1.9.1
auto_tag_suffix: linux-arm64-kaniko1.9.2
daemon_off: false
dockerfile: docker/docker/Dockerfile.linux.arm64.kaniko1.9.1
dockerfile: docker/docker/Dockerfile.linux.arm64.kaniko1.9.2
username:
from_secret: docker_username
password:
@@ -233,9 +233,9 @@ steps:
settings:
repo: plugins/kaniko-gcr
auto_tag: true
auto_tag_suffix: linux-arm64-kaniko1.9.1
auto_tag_suffix: linux-arm64-kaniko1.9.2
daemon_off: false
dockerfile: docker/gcr/Dockerfile.linux.arm64.kaniko1.9.1
dockerfile: docker/gcr/Dockerfile.linux.arm64.kaniko1.9.2
username:
from_secret: docker_username
password:
@@ -251,9 +251,9 @@ steps:
settings:
repo: plugins/kaniko-ecr
auto_tag: true
auto_tag_suffix: linux-arm64-kaniko1.9.1
auto_tag_suffix: linux-arm64-kaniko1.9.2
daemon_off: false
dockerfile: docker/ecr/Dockerfile.linux.arm64.kaniko1.9.1
dockerfile: docker/ecr/Dockerfile.linux.arm64.kaniko1.9.2
username:
from_secret: docker_username
password:
@@ -347,7 +347,7 @@ steps:
ignore_missing: true
password:
from_secret: docker_password
spec: docker/docker/manifest-kaniko1.9.1.tmpl
spec: docker/docker/manifest-kaniko1.9.2.tmpl
username:
from_secret: docker_username
@@ -359,7 +359,7 @@ steps:
ignore_missing: true
password:
from_secret: docker_password
spec: docker/gcr/manifest-kaniko1.9.1.tmpl
spec: docker/gcr/manifest-kaniko1.9.2.tmpl
username:
from_secret: docker_username
@@ -371,7 +371,7 @@ steps:
ignore_missing: true
password:
from_secret: docker_password
spec: docker/ecr/manifest-kaniko1.9.1.tmpl
spec: docker/ecr/manifest-kaniko1.9.2.tmpl
username:
from_secret: docker_username
+1 -1
View File
@@ -2,7 +2,7 @@
Drone kaniko plugin uses [kaniko](https://github.com/GoogleContainerTools/kaniko) to build and publish Docker images to a container registry.
Plugin images are published with 1.6.0 as well as 1.9.1 kaniko version from 1.5.1 release tag. `plugins/kaniko:<release-tag>` uses 1.6.0 version while `plugins/kaniko:<release-tag>-kaniko1.9.1` uses 1.9.1 version. Similar convention is used for plugins/kaniko-ecr & plugins/kaniko-gcr images as well.
Plugin images are published with 1.6.0 as well as 1.9.2 kaniko version from 1.5.1 release tag. `plugins/kaniko:<release-tag>` uses 1.6.0 version while `plugins/kaniko:<release-tag>-kaniko1.9.2` uses 1.9.2 version. Similar convention is used for plugins/kaniko-ecr & plugins/kaniko-gcr images as well.
## Build
+110 -49
View File
@@ -17,6 +17,7 @@ import (
"github.com/aws/aws-sdk-go/aws/credentials/stscreds"
"github.com/aws/aws-sdk-go/aws/session"
ecrv1 "github.com/aws/aws-sdk-go/service/ecr"
ecrpublicv1 "github.com/aws/aws-sdk-go/service/ecrpublic"
"github.com/aws/smithy-go"
"github.com/hashicorp/go-version"
"github.com/joho/godotenv"
@@ -245,6 +246,8 @@ func run(c *cli.Context) error {
registry := c.String("registry")
region := c.String("region")
noPush := c.Bool("no-push")
assumeRole := c.String("assume-role")
externalId := c.String("external-id")
dockerConfig, err := createDockerConfig(
c.String("docker-registry"),
@@ -253,8 +256,8 @@ func run(c *cli.Context) error {
c.String("access-key"),
c.String("secret-key"),
registry,
c.String("assume-role"),
c.String("external-id"),
assumeRole,
externalId,
region,
noPush,
)
@@ -273,7 +276,7 @@ func run(c *cli.Context) error {
// only create repository when pushing and create-repository is true
if !noPush && c.Bool("create-repository") {
if err := createRepository(region, repo, registry); err != nil {
if err := createRepository(region, repo, registry, assumeRole, externalId); err != nil {
return err
}
}
@@ -283,7 +286,7 @@ func run(c *cli.Context) error {
if err != nil {
logrus.Fatal(err)
}
if err := uploadLifeCyclePolicy(region, repo, string(contents)); err != nil {
if err := uploadLifeCyclePolicy(region, repo, string(contents), assumeRole, externalId); err != nil {
logrus.Fatal(fmt.Sprintf("error uploading ECR lifecycle policy: %v", err))
}
}
@@ -293,7 +296,7 @@ func run(c *cli.Context) error {
if err != nil {
logrus.Fatal(err)
}
if err := uploadRepositoryPolicy(region, repo, registry, string(contents)); err != nil {
if err := uploadRepositoryPolicy(region, repo, registry, string(contents), assumeRole, externalId); err != nil {
logrus.Fatal(fmt.Sprintf("error uploading ECR lifecycle policy: %v", err))
}
}
@@ -383,7 +386,7 @@ func createDockerConfig(dockerRegistry, dockerUsername, dockerPassword, accessKe
return dockerConfig, nil
}
func createRepository(region, repo, registry string) error {
func createRepository(region, repo, registry, assumeRole, externalId string) error {
if registry == "" {
return fmt.Errorf("registry must be specified")
}
@@ -392,22 +395,29 @@ func createRepository(region, repo, registry string) error {
return fmt.Errorf("repo must be specified")
}
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(region))
if err != nil {
return errors.Wrap(err, "failed to load aws config")
}
var createErr error
//create public repo
//if registry string starts with public domain (ex: public.ecr.aws/example-registry)
if isRegistryPublic(registry) {
svc := ecrpublic.NewFromConfig(cfg)
_, createErr = svc.CreateRepository(context.TODO(), &ecrpublic.CreateRepositoryInput{RepositoryName: &repo})
//create private repo
if assumeRole != "" {
if isRegistryPublic(registry) {
_, createErr = getAssumeRoleEcrPublicSvc(region, assumeRole, externalId).CreateRepository(&ecrpublicv1.CreateRepositoryInput{RepositoryName: &repo})
} else {
_, createErr = getAssumeRoleEcrSvc(region, assumeRole, externalId).CreateRepository(&ecrv1.CreateRepositoryInput{RepositoryName: &repo})
}
} else {
svc := ecr.NewFromConfig(cfg)
_, createErr = svc.CreateRepository(context.TODO(), &ecr.CreateRepositoryInput{RepositoryName: &repo})
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(region))
if err != nil {
return errors.Wrap(err, "failed to load aws config")
}
//create public repo
//if registry string starts with public domain (ex: public.ecr.aws/example-registry)
if isRegistryPublic(registry) {
svc := ecrpublic.NewFromConfig(cfg)
_, createErr = svc.CreateRepository(context.TODO(), &ecrpublic.CreateRepositoryInput{RepositoryName: &repo})
//create private repo
} else {
svc := ecr.NewFromConfig(cfg)
_, createErr = svc.CreateRepository(context.TODO(), &ecr.CreateRepositoryInput{RepositoryName: &repo})
}
}
var apiError smithy.APIError
@@ -418,46 +428,67 @@ func createRepository(region, repo, registry string) error {
return nil
}
func uploadLifeCyclePolicy(region, repo, lifecyclePolicy string) (err error) {
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(region))
if err != nil {
return errors.Wrap(err, "failed to load aws config")
}
func uploadLifeCyclePolicy(region, repo, lifecyclePolicy, assumeRole, externalId string) (err error) {
if assumeRole != "" {
input := &ecrv1.PutLifecyclePolicyInput{
LifecyclePolicyText: aws.String(lifecyclePolicy),
RepositoryName: aws.String(repo),
}
_, err = getAssumeRoleEcrSvc(region, assumeRole, externalId).PutLifecyclePolicy(input)
} else {
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(region))
if err != nil {
return errors.Wrap(err, "failed to load aws config")
}
svc := ecr.NewFromConfig(cfg)
svc := ecr.NewFromConfig(cfg)
input := &ecr.PutLifecyclePolicyInput{
LifecyclePolicyText: aws.String(lifecyclePolicy),
RepositoryName: aws.String(repo),
input := &ecr.PutLifecyclePolicyInput{
LifecyclePolicyText: aws.String(lifecyclePolicy),
RepositoryName: aws.String(repo),
}
_, err = svc.PutLifecyclePolicy(context.TODO(), input)
}
_, err = svc.PutLifecyclePolicy(context.TODO(), input)
return err
}
func uploadRepositoryPolicy(region, repo, registry, repositoryPolicy string) (err error) {
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(region))
if err != nil {
return errors.Wrap(err, "failed to load aws config")
}
if isRegistryPublic(registry) {
svc := ecrpublic.NewFromConfig(cfg)
input := &ecrpublic.SetRepositoryPolicyInput{
PolicyText: aws.String(repositoryPolicy),
RepositoryName: aws.String(repo),
func uploadRepositoryPolicy(region, repo, registry, repositoryPolicy, assumeRole, externalId string) (err error) {
if assumeRole != "" {
if isRegistryPublic(registry) {
input := &ecrpublicv1.SetRepositoryPolicyInput{
PolicyText: aws.String(repositoryPolicy),
RepositoryName: aws.String(repo),
}
_, err = getAssumeRoleEcrPublicSvc(region, assumeRole, externalId).SetRepositoryPolicy(input)
} else {
input := &ecrv1.SetRepositoryPolicyInput{
PolicyText: aws.String(repositoryPolicy),
RepositoryName: aws.String(repo),
}
_, err = getAssumeRoleEcrSvc(region, assumeRole, externalId).SetRepositoryPolicy(input)
}
_, err = svc.SetRepositoryPolicy(context.TODO(), input)
} else {
svc := ecr.NewFromConfig(cfg)
input := &ecr.SetRepositoryPolicyInput{
PolicyText: aws.String(repositoryPolicy),
RepositoryName: aws.String(repo),
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(region))
if err != nil {
return errors.Wrap(err, "failed to load aws config")
}
if isRegistryPublic(registry) {
svc := ecrpublic.NewFromConfig(cfg)
input := &ecrpublic.SetRepositoryPolicyInput{
PolicyText: aws.String(repositoryPolicy),
RepositoryName: aws.String(repo),
}
_, err = svc.SetRepositoryPolicy(context.TODO(), input)
} else {
svc := ecr.NewFromConfig(cfg)
input := &ecr.SetRepositoryPolicyInput{
PolicyText: aws.String(repositoryPolicy),
RepositoryName: aws.String(repo),
}
_, err = svc.SetRepositoryPolicy(context.TODO(), input)
}
_, err = svc.SetRepositoryPolicy(context.TODO(), input)
}
return err
@@ -507,6 +538,36 @@ func getAuthInfo(svc *ecrv1.ECR) (username, password, registry string, err error
return
}
func getAssumeRoleEcrSvc(region, assumeRole, externalId string) *ecrv1.ECR {
sess, err := session.NewSession(&awsv1.Config{Region: &region})
if err != nil {
logrus.Fatal(err, "failed to create aws session")
}
return ecrv1.New(sess, &awsv1.Config{
Credentials: stscreds.NewCredentials(sess, assumeRole, func(p *stscreds.AssumeRoleProvider) {
if externalId != "" {
p.ExternalID = &externalId
}
}),
})
}
func getAssumeRoleEcrPublicSvc(region, assumeRole, externalId string) *ecrpublicv1.ECRPublic {
sess, err := session.NewSession(&awsv1.Config{Region: &region})
if err != nil {
logrus.Fatal(err, "failed to create aws session")
}
return ecrpublicv1.New(sess, &awsv1.Config{
Credentials: stscreds.NewCredentials(sess, assumeRole, func(p *stscreds.AssumeRoleProvider) {
if externalId != "" {
p.ExternalID = &externalId
}
}),
})
}
func isRegistryPublic(registry string) bool {
return strings.HasPrefix(registry, ecrPublicDomain)
}
+2 -2
View File
@@ -1,5 +1,5 @@
FROM gcr.io/kaniko-project/executor:v1.9.1
FROM gcr.io/kaniko-project/executor:v1.9.2
ENV KANIKO_VERSION=1.9.1
ENV KANIKO_VERSION=1.9.2
ADD release/linux/amd64/kaniko-acr /kaniko/
ENTRYPOINT ["/kaniko/kaniko-acr"]
+2 -2
View File
@@ -1,8 +1,8 @@
FROM gcr.io/kaniko-project/executor:v1.9.1
FROM gcr.io/kaniko-project/executor:v1.9.2
ENV HOME /root
ENV USER root
ENV KANIKO_VERSION=1.9.1
ENV KANIKO_VERSION=1.9.2
ADD release/linux/arm64/kaniko-acr /kaniko/
ENTRYPOINT ["/kaniko/kaniko-acr"]
+2 -2
View File
@@ -1,5 +1,5 @@
FROM gcr.io/kaniko-project/executor:v1.9.1
FROM gcr.io/kaniko-project/executor:v1.9.2
ENV KANIKO_VERSION=1.9.1
ENV KANIKO_VERSION=1.9.2
ADD release/linux/amd64/kaniko-docker /kaniko/
ENTRYPOINT ["/kaniko/kaniko-docker"]
@@ -1,5 +1,5 @@
FROM gcr.io/kaniko-project/executor:v1.9.1
FROM gcr.io/kaniko-project/executor:v1.9.2
ENV KANIKO_VERSION=1.9.1
ENV KANIKO_VERSION=1.9.2
ADD release/linux/amd64/kaniko-docker /kaniko/
ENTRYPOINT ["/kaniko/kaniko-docker"]
+2 -2
View File
@@ -1,8 +1,8 @@
FROM gcr.io/kaniko-project/executor:v1.9.1
FROM gcr.io/kaniko-project/executor:v1.9.2
ENV HOME /root
ENV USER root
ENV KANIKO_VERSION=1.9.1
ENV KANIKO_VERSION=1.9.2
ADD release/linux/arm64/kaniko-docker /kaniko/
ENTRYPOINT ["/kaniko/kaniko-docker"]
@@ -1,5 +1,5 @@
FROM gcr.io/kaniko-project/executor:v1.9.1
FROM gcr.io/kaniko-project/executor:v1.9.2
ENV KANIKO_VERSION=1.9.1
ENV KANIKO_VERSION=1.9.2
ADD release/linux/arm64/kaniko-docker /kaniko/
ENTRYPOINT ["/kaniko/kaniko-docker"]
@@ -1,4 +1,4 @@
image: plugins/kaniko:{{#if build.tag}}{{trimPrefix "v" build.tag}}-kaniko1.9.1{{else}}latest-kaniko1.9.1{{/if}}
image: plugins/kaniko:{{#if build.tag}}{{trimPrefix "v" build.tag}}-kaniko1.9.2{{else}}latest-kaniko1.9.2{{/if}}
{{#if build.tags}}
tags:
{{#each build.tags}}
@@ -7,12 +7,12 @@ tags:
{{/if}}
manifests:
-
image: plugins/kaniko:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64-kaniko1.9.1
image: plugins/kaniko:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64-kaniko1.9.2
platform:
architecture: amd64
os: linux
-
image: plugins/kaniko:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm64-kaniko1.9.1
image: plugins/kaniko:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm64-kaniko1.9.2
platform:
architecture: arm64
os: linux
+2 -2
View File
@@ -1,5 +1,5 @@
FROM gcr.io/kaniko-project/executor:v1.9.1
FROM gcr.io/kaniko-project/executor:v1.9.2
ENV KANIKO_VERSION=1.9.1
ENV KANIKO_VERSION=1.9.2
ADD release/linux/amd64/kaniko-ecr /kaniko/
ENTRYPOINT ["/kaniko/kaniko-ecr"]
@@ -1,5 +1,5 @@
FROM gcr.io/kaniko-project/executor:v1.9.1
FROM gcr.io/kaniko-project/executor:v1.9.2
ENV KANIKO_VERSION=1.9.1
ENV KANIKO_VERSION=1.9.2
ADD release/linux/amd64/kaniko-ecr /kaniko/
ENTRYPOINT ["/kaniko/kaniko-ecr"]
+2 -2
View File
@@ -1,8 +1,8 @@
FROM gcr.io/kaniko-project/executor:v1.9.1
FROM gcr.io/kaniko-project/executor:v1.9.2
ENV HOME /root
ENV USER root
ENV KANIKO_VERSION=1.9.1
ENV KANIKO_VERSION=1.9.2
ADD release/linux/arm64/kaniko-ecr /kaniko/
ENTRYPOINT ["/kaniko/kaniko-ecr"]
@@ -1,5 +1,5 @@
FROM gcr.io/kaniko-project/executor:v1.9.1
FROM gcr.io/kaniko-project/executor:v1.9.2
ENV KANIKO_VERSION=1.9.1
ENV KANIKO_VERSION=1.9.2
ADD release/linux/arm64/kaniko-ecr /kaniko/
ENTRYPOINT ["/kaniko/kaniko-ecr"]
@@ -1,4 +1,4 @@
image: plugins/kaniko-ecr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-kaniko1.9.1{{else}}latest-kaniko1.9.1{{/if}}
image: plugins/kaniko-ecr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-kaniko1.9.2{{else}}latest-kaniko1.9.2{{/if}}
{{#if build.tags}}
tags:
{{#each build.tags}}
@@ -7,12 +7,12 @@ tags:
{{/if}}
manifests:
-
image: plugins/kaniko-ecr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64-kaniko1.9.1
image: plugins/kaniko-ecr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64-kaniko1.9.2
platform:
architecture: amd64
os: linux
-
image: plugins/kaniko-ecr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm64-kaniko1.9.1
image: plugins/kaniko-ecr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm64-kaniko1.9.2
platform:
architecture: arm64
os: linux
+2 -2
View File
@@ -1,5 +1,5 @@
FROM gcr.io/kaniko-project/executor:v1.9.1
FROM gcr.io/kaniko-project/executor:v1.9.2
ENV KANIKO_VERSION=1.9.1
ENV KANIKO_VERSION=1.9.2
ADD release/linux/amd64/kaniko-gcr /kaniko/
ENTRYPOINT ["/kaniko/kaniko-gcr"]
@@ -1,5 +1,5 @@
FROM gcr.io/kaniko-project/executor:v1.9.1
FROM gcr.io/kaniko-project/executor:v1.9.2
ENV KANIKO_VERSION=1.9.1
ENV KANIKO_VERSION=1.9.2
ADD release/linux/amd64/kaniko-gcr /kaniko/
ENTRYPOINT ["/kaniko/kaniko-gcr"]
+2 -2
View File
@@ -1,8 +1,8 @@
FROM gcr.io/kaniko-project/executor:v1.9.1
FROM gcr.io/kaniko-project/executor:v1.9.2
ENV HOME /root
ENV USER root
ENV KANIKO_VERSION=1.9.1
ENV KANIKO_VERSION=1.9.2
ADD release/linux/arm64/kaniko-gcr /kaniko/
ENTRYPOINT ["/kaniko/kaniko-gcr"]
@@ -1,5 +1,5 @@
FROM gcr.io/kaniko-project/executor:v1.9.1
FROM gcr.io/kaniko-project/executor:v1.9.2
ENV KANIKO_VERSION=1.9.1
ENV KANIKO_VERSION=1.9.2
ADD release/linux/arm64/kaniko-gcr /kaniko/
ENTRYPOINT ["/kaniko/kaniko-gcr"]
@@ -1,4 +1,4 @@
image: plugins/kaniko-gcr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-kaniko1.9.1{{else}}latest-kaniko1.9.1{{/if}}
image: plugins/kaniko-gcr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-kaniko1.9.2{{else}}latest-kaniko1.9.2{{/if}}
{{#if build.tags}}
tags:
{{#each build.tags}}
@@ -7,12 +7,12 @@ tags:
{{/if}}
manifests:
-
image: plugins/kaniko-gcr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64-kaniko1.9.1
image: plugins/kaniko-gcr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64-kaniko1.9.2
platform:
architecture: amd64
os: linux
-
image: plugins/kaniko-gcr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm64-kaniko1.9.1
image: plugins/kaniko-gcr:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm64-kaniko1.9.2
platform:
architecture: arm64
os: linux
+1 -1
View File
@@ -43,4 +43,4 @@ require (
golang.org/x/text v0.3.7 // indirect
)
go 1.18
go 1.19