fix: pipeline_fixes #18

Merged
marcel.henselin merged 7 commits from fix/pipeline_fixes into alpha 2026-01-30 12:48:21 +00:00
6 changed files with 203 additions and 52 deletions

View file

@ -6,14 +6,24 @@ inputs:
description: "Go version to install"
default: '1.25'
required: true
golang-cilint-version:
description: "Golangci-lint version to install"
default: "2.7.2"
required: true
java-distribution:
description: "JAVA distribution to use (default: temurin)"
default: 'temurin'
java-version:
description: "JAVA version to use (default: 21)"
default: '21'
runs:
using: "composite"
steps:
- name: Install needed tools
shell: bash
run: |
set -e
apt-get -y -qq update
apt-get -y -qq install jq python3 python3-pip python-is-python3 s3cmd git make wget
- name: Install Go ${{ inputs.go-version }}
uses: actions/setup-go@v6
with:
@ -21,14 +31,34 @@ runs:
check-latest: true
go-version-file: 'go.mod'
# - name: Run golangci-lint
# uses: golangci/golangci-lint-action@v9
# with:
# version: ${{ inputs.golang-cilint-version }}
- name: Install needed tools
- name: Install go tools
shell: bash
run: |
set -e
go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@${{ inputs.golang-cilint-version }}
go install golang.org/x/tools/cmd/goimports@latest
go install github.com/hashicorp/terraform-plugin-codegen-framework/cmd/tfplugingen-framework@latest
go install github.com/hashicorp/terraform-plugin-codegen-openapi/cmd/tfplugingen-openapi@latest
go install github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs@v0.24.0
- name: Setup JAVA ${{ inputs.java-distribution }} ${{ inputs.go-version }}
uses: actions/setup-java@v5
with:
distribution: ${{ inputs.java-distribution }} # See 'Supported distributions' for available options
java-version: ${{ inputs.java-version }}
- name: Checkout
uses: actions/checkout@v6
- name: Run build pkg directory
shell: bash
run: |
set -e
go run cmd/main.go build
- name: Run make to build app
shell: bash
run: |
set -e
make build

View file

@ -2,10 +2,14 @@ name: CI Workflow
on:
pull_request:
branches:
- alpha
- main
workflow_dispatch:
push:
branches:
- main
- '!main'
- '!alpha'
env:
GO_VERSION: "1.25"
@ -13,9 +17,104 @@ env:
CODE_COVERAGE_ARTIFACT_NAME: "code-coverage"
jobs:
publish_test:
name: "Test readiness for publishing provider"
needs: config
runs-on: ubuntu-latest
permissions:
actions: read # Required to identify workflow run.
checks: write # Required to add status summary.
contents: read # Required to checkout repository.
pull-requests: write # Required to add PR comment.
steps:
- name: Install needed tools
run: |
apt-get -y -qq update
apt-get -y -qq install jq python3 python3-pip python-is-python3 s3cmd git make wget
- name: Setup Go
uses: actions/setup-go@v6
with:
go-version: ${{ env.GO_VERSION }}
- name: Install go tools
run: |
go install golang.org/x/tools/cmd/goimports@latest
go install github.com/hashicorp/terraform-plugin-codegen-framework/cmd/tfplugingen-framework@latest
go install github.com/hashicorp/terraform-plugin-codegen-openapi/cmd/tfplugingen-openapi@latest
- name: Setup JAVA
uses: actions/setup-java@v5
with:
distribution: 'temurin' # See 'Supported distributions' for available options
java-version: '21'
- name: Checkout
uses: actions/checkout@v6
- name: Run build pkg directory
run: |
go run cmd/main.go build
- name: Set up s3cfg
run: |
cat <<'EOF' >> ~/.s3cfg
[default]
host_base = https://object.storage.eu01.onstackit.cloud
host_bucket = https://%(bucket).object.storage.eu01.onstackit.cloud
check_ssl_certificate = False
access_key = ${{ secrets.S3_ACCESS_KEY }}
secret_key = ${{ secrets.S3_SECRET_KEY }}
EOF
- name: Import GPG key
run: |
echo "${{ secrets.PRIVATE_KEY_PEM }}" > ~/private.key.pem
gpg --import ~/private.key.pem
rm ~/private.key.pem
- name: Run GoReleaser with SNAPSHOT
if: github.event_name == 'workflow_dispatch'
id: goreleaser
env:
GITHUB_TOKEN: ${{ env.FORGEJO_TOKEN }}
GPG_FINGERPRINT: ${{ secrets.GPG_FINGERPRINT }}
uses: goreleaser/goreleaser-action@v6
with:
args: release --skip publish --clean --snapshot
- name: Run GoReleaser
if: github.event_name != 'workflow_dispatch'
id: goreleaser
env:
GITHUB_TOKEN: ${{ env.FORGEJO_TOKEN }}
GPG_FINGERPRINT: ${{ secrets.GPG_FINGERPRINT }}
uses: goreleaser/goreleaser-action@v6
with:
args: release --skip publish --clean
- name: Prepare key file
run: |
echo "${{ secrets.PUBLIC_KEY_PEM }}" >public_key.pem
- name: Prepare provider directory structure
run: |
VERSION=$(jq -r .version < dist/metadata.json)
go run cmd/main.go \
publish \
--namespace=mhenselin \
--providerName=stackitprivatepreview \
--repoName=terraform-provider-stackitprivatepreview \
--domain=tfregistry.sysops.stackit.rocks \
--gpgFingerprint=${{ secrets.GPG_FINGERPRINT }} \
--gpgPubKeyFile=public_key.pem \
--version=${VERSION}
main:
name: CI
runs-on: ubuntu-latest
needs: config
steps:
- name: Checkout
uses: actions/checkout@v4
@ -57,10 +156,8 @@ jobs:
name: ${{ env.CODE_COVERAGE_ARTIFACT_NAME }}
path: "stackit/${{ env.CODE_COVERAGE_FILE_NAME }}"
config:
name: Check GoReleaser config
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
steps:
- name: Checkout

View file

@ -3,10 +3,6 @@ name: Publish
run-name: Publish by @${{ github.actor }}
on:
pull_request:
branches:
- alpha
- main
workflow_dispatch:
push:
tags:

View file

@ -8,11 +8,13 @@ import (
"io/fs"
"log"
"os"
"os/exec"
"path"
"strings"
)
type Provider struct {
RootPath string
Namespace string
Provider string
DistPath string
@ -23,6 +25,17 @@ type Provider struct {
Domain string
}
func (p *Provider) GetRoot() error {
cmd := exec.Command("git", "rev-parse", "--show-toplevel")
out, err := cmd.Output()
if err != nil {
return err
}
lines := strings.Split(string(out), "\n")
p.RootPath = lines[0]
return nil
}
func (p *Provider) CreateV1Dir() error {
// Path to semantic version dir
versionPath := p.providerDirs()
@ -127,11 +140,21 @@ func (p *Provider) createVersionsFile() error {
}
// Build the versions file...
version := Version{}
version := Version{
Version: p.Version,
Protocols: []string{"5.1"},
Platforms: nil,
}
for _, sum := range shasums {
// get os and arch from filename
removeFileExtension := strings.Split(sum.Path, ".zip")
if len(removeFileExtension) < 1 {
log.Fatalf("error: %s does not have .zip extension", sum.Path)
}
fileNameSplit := strings.Split(removeFileExtension[0], "_")
if len(fileNameSplit) < 4 {
log.Fatalf("filename does not match our regex: %s", removeFileExtension[0])
}
// Get build target and architecture from the zip file name
target := fileNameSplit[2]
@ -165,9 +188,9 @@ func (p *Provider) createVersionsFile() error {
}
func (p *Provider) providerDirs() string {
log.Println("* Creating release/v1/providers/[namespace]/[repo]/[version] directories")
log.Println("* Creating release/v1/providers/[namespace]/[provider]/[version] directories")
target := path.Join("release", "v1", "providers", p.Namespace, p.RepoName, p.Version)
target := path.Join("release", "v1", "providers", p.Namespace, p.Provider, p.Version)
err := CreateDir(target)
if err != nil {
@ -176,6 +199,28 @@ func (p *Provider) providerDirs() string {
return target
}
func (p *Provider) CreateWellKnown() error {
log.Println("* Creating .well-known directory")
pathString := path.Join(p.RootPath, "release", ".well-known")
err := os.MkdirAll(pathString, os.ModePerm)
if err != nil && !errors.Is(err, fs.ErrExist) {
return fmt.Errorf("error creating '%s' dir: %w", pathString, err)
}
log.Println(" - Writing to .well-known/terraform.json file")
err = os.WriteFile(
fmt.Sprintf("%s/terraform.json", pathString),
[]byte(`{"providers.v1": "/v1/providers/"}`),
0644,
)
if err != nil {
return err
}
return nil
}
func CreateDir(path string) error {
log.Printf("* Creating %s directory", path)
err := os.MkdirAll(path, os.ModePerm)

View file

@ -33,7 +33,7 @@ func GetShaSumContents(distPath, repoName, version string) (ShaSums, error) {
slog.Warn("unable to parse SHA sum line", "line", line)
continue
}
shaSums = append(shaSums, ShaSum{Sum: matches[0][0], Path: matches[0][1]})
shaSums = append(shaSums, ShaSum{Sum: matches[0][1], Path: matches[0][2]})
}
return shaSums, nil
}

View file

@ -6,6 +6,7 @@ import (
"io/fs"
"log"
"os"
"path"
"path/filepath"
publish2 "github.com/mhenselin/terraform-provider-stackitprivatepreview/cmd/cmd/publish"
@ -27,7 +28,7 @@ var publishCmd = &cobra.Command{
Use: "publish",
Short: "Publish terraform provider",
Long: `...`,
RunE: func(cmd *cobra.Command, args []string) error {
RunE: func(_ *cobra.Command, args []string) error {
return publish()
},
}
@ -96,47 +97,29 @@ func publish() error {
GpgPubKeyFile: gpgPubKeyFile,
Domain: domain,
}
err := p.GetRoot()
if err != nil {
return err
}
// Create release dir - only the contents of this need to be uploaded to S3
log.Printf("* Creating reelase directory")
err := os.Mkdir("release", os.ModePerm)
if !errors.Is(err, fs.ErrExist) {
return fmt.Errorf("error creating 'release' dir: %w", err)
log.Printf("* Creating release directory")
err = os.MkdirAll(path.Join(p.RootPath, "release"), os.ModePerm)
if err != nil && !errors.Is(err, fs.ErrExist) {
return fmt.Errorf("error creating '%s' dir: %w", path.Join(p.RootPath, "release"), err)
}
// Create .wellKnown directory and terraform.json file
err = wellKnown()
err = p.CreateWellKnown()
if err != nil {
return fmt.Errorf("error creating '.wellKnown' dir: %s", err)
return fmt.Errorf("error creating '.well-known' dir: %w", err)
}
err = p.CreateV1Dir()
if err != nil {
return fmt.Errorf("error creating 'v1' dir: %s", err)
return fmt.Errorf("error creating 'v1' dir: %w", err)
}
log.Println("📦 Packaged Terraform Provider for private registry.")
return nil
}
// This establishes the "API" as a TF provider by responding with the correct JSON payload, by using static files
func wellKnown() error {
log.Println("* Creating .well-known directory")
err := os.Mkdir("release/.well-known", os.ModePerm)
if !errors.Is(err, fs.ErrExist) {
return fmt.Errorf("error creating 'release' dir: %w", err)
}
log.Println(" - Writing to .well-known/terraform.json file")
err = os.WriteFile(
"release/.well-known/terraform.json",
[]byte(`{"providers.v1": "/v1/providers/"}`),
0644,
)
if err != nil {
return err
}
return nil
}