Skip to content
This repository has been archived by the owner on Nov 11, 2020. It is now read-only.

Commit

Permalink
fix: allow a build pack to include a resource dir
Browse files Browse the repository at this point in the history
so that pipelines can release kubernetes resources for easy consumption via tools like kubectl, kustomise, kpt
  • Loading branch information
jstrachan committed Jun 5, 2020
1 parent 4245262 commit 77e4f83
Show file tree
Hide file tree
Showing 4 changed files with 201 additions and 4 deletions.
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ require (
github.com/Azure/draft v0.15.0
github.com/cenkalti/backoff v2.1.1+incompatible
github.com/denormal/go-gitignore v0.0.0-20180713143441-75ce8f3e513c
github.com/jenkins-x-labs/trigger-pipeline v0.0.4
github.com/jenkins-x-labs/trigger-pipeline v0.0.5
github.com/jenkins-x/golang-jenkins v0.0.0-20180919102630-65b83ad42314
github.com/jenkins-x/jx v0.0.0-20200519124520-3889239234cd
github.com/jenkins-x/jx v1.3.981-0.20200605070345-2c10fe601319
github.com/pkg/errors v0.8.1
github.com/spf13/cobra v0.0.5
github.com/stretchr/testify v1.4.0
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,8 @@ github.com/jenkins-x-labs/trigger-pipeline v0.0.0-20200221170624-ad1e693a8fcd h1
github.com/jenkins-x-labs/trigger-pipeline v0.0.0-20200221170624-ad1e693a8fcd/go.mod h1:aiqfUuZO2rFP/v7mI4l6dNWh4Gj4pzn54gY/Qkdtpzo=
github.com/jenkins-x-labs/trigger-pipeline v0.0.4 h1:JvZG2VPB9+VRk8Rqa0dcVPHNc7dVPuCldUDp0UnTKH0=
github.com/jenkins-x-labs/trigger-pipeline v0.0.4/go.mod h1:aiqfUuZO2rFP/v7mI4l6dNWh4Gj4pzn54gY/Qkdtpzo=
github.com/jenkins-x-labs/trigger-pipeline v0.0.5 h1:g8E4W/qOx04juigpdsXwe/fbZdWIsy4mQLz0kEMUPDk=
github.com/jenkins-x-labs/trigger-pipeline v0.0.5/go.mod h1:QdF7jKPwZlJRklgsE9/vKy+KAbbWWi/Wyi6Tr9XhX74=
github.com/jenkins-x/draft-repo v0.0.0-20180417100212-2f66cc518135 h1:3zy/Nvdi9V95Jfu6+W4NAJrHDeypB58FSLyzI3XfO/4=
github.com/jenkins-x/draft-repo v0.0.0-20180417100212-2f66cc518135/go.mod h1:K/L25ViEpDx196rOZyjn433tAM5zr2F/IouK+3g+DkE=
github.com/jenkins-x/golang-jenkins v0.0.0-20180919102630-65b83ad42314 h1:kyBMx/ucSV92S+umX/V6DDaPNynlFFOM9MGJWApltoU=
Expand All @@ -421,6 +423,8 @@ github.com/jenkins-x/jx v0.0.0-20200421152447-4d416a432901 h1:nEaH0yobbDQboQHIKv
github.com/jenkins-x/jx v0.0.0-20200421152447-4d416a432901/go.mod h1:dMUw5aJ5km/5kr6cAE0mpKZ0StUeh9cweUUFWMjKfbw=
github.com/jenkins-x/jx v0.0.0-20200519124520-3889239234cd h1:c9o7FSGHr6WoA2JLZAIGk300tWqEcvj8Ayd+kC31yLQ=
github.com/jenkins-x/jx v0.0.0-20200519124520-3889239234cd/go.mod h1:dMUw5aJ5km/5kr6cAE0mpKZ0StUeh9cweUUFWMjKfbw=
github.com/jenkins-x/jx v1.3.981-0.20200605070345-2c10fe601319 h1:ac6uSBIdf1XIenufKd2Y3sWTb/237AAHmMVantZMUoo=
github.com/jenkins-x/jx v1.3.981-0.20200605070345-2c10fe601319/go.mod h1:dMUw5aJ5km/5kr6cAE0mpKZ0StUeh9cweUUFWMjKfbw=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jetstack/cert-manager v0.5.2 h1:qs74mdAprZ5kcCYF3arzmEAZtbt+9HneldSJrk21tKs=
github.com/jetstack/cert-manager v0.5.2/go.mod h1:nbddmhjWxYGt04bxvwVGUSeLhZ2PCyNvd7MpXdq+yWY=
Expand Down
110 changes: 110 additions & 0 deletions pkg/cmd/importcmd/import_kube_resources_integration_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
// +build integration

package importcmd_test

import (
"github.com/jenkins-x-labs/jwizard/pkg/cmd/fakejxfactory"
"github.com/jenkins-x-labs/jwizard/pkg/cmd/importcmd"
"github.com/jenkins-x/jx/pkg/cmd/testhelpers"
"github.com/jenkins-x/jx/pkg/config"
"github.com/jenkins-x/jx/pkg/kube/naming"

"io/ioutil"
"os"
"path"
"path/filepath"
"testing"

"github.com/stretchr/testify/require"
"k8s.io/apimachinery/pkg/runtime"

v1 "github.com/jenkins-x/jx/pkg/apis/jenkins.io/v1"
fake_clients "github.com/jenkins-x/jx/pkg/cmd/clients/fake"
"github.com/jenkins-x/jx/pkg/cmd/opts"
"github.com/jenkins-x/jx/pkg/gits"
"github.com/jenkins-x/jx/pkg/helm"
resources_test "github.com/jenkins-x/jx/pkg/kube/resources/mocks"
"github.com/jenkins-x/jx/pkg/tests"
"github.com/jenkins-x/jx/pkg/util"
"github.com/stretchr/testify/assert"
)

func TestImportKubeResourcesProject(t *testing.T) {
originalJxHome, tempJxHome, err := testhelpers.CreateTestJxHomeDir()
assert.NoError(t, err)
defer func() {
err := testhelpers.CleanupTestJxHomeDir(originalJxHome, tempJxHome)
assert.NoError(t, err)
}()
originalKubeCfg, tempKubeCfg, err := testhelpers.CreateTestKubeConfigDir()
assert.NoError(t, err)
defer func() {
err := testhelpers.CleanupTestKubeConfigDir(originalKubeCfg, tempKubeCfg)
assert.NoError(t, err)
}()

tempDir, err := ioutil.TempDir("", "test-import-jx-gha-")
assert.NoError(t, err)

testData := path.Join("test_data", "import_projects")
_, err = os.Stat(testData)
assert.NoError(t, err)

name := "nodejs"
srcDir := filepath.Join(testData, name)
assert.DirExists(t, srcDir, "source dir does not exist")

buildPackURL := "https://github.com/jenkins-x/jxr-packs-kubernetes.git"

testDir := tempDir

util.CopyDir(srcDir, testDir, true)
_, dirName := filepath.Split(testDir)
dirName = naming.ToValidName(dirName)
o := &importcmd.ImportOptions{
CommonOptions: &opts.CommonOptions{},
}

o.SetFactory(fake_clients.NewFakeFactory())
o.JXFactory = fakejxfactory.NewFakeFactory()
o.GitProvider = createFakeGitProvider()

k8sObjects := []runtime.Object{}
jxObjects := []runtime.Object{}
helmer := helm.NewHelmCLI("helm", helm.V3, dirName, true)
testhelpers.ConfigureTestOptionsWithResources(o.CommonOptions, k8sObjects, jxObjects, gits.NewGitCLI(), nil, helmer, resources_test.NewMockInstaller())
if o.Out == nil {
o.Out = tests.Output()
}
if o.Out == nil {
o.Out = os.Stdout
}
o.Dir = testDir
o.DryRun = true
o.DisableMaven = true
o.UseDefaultGit = true

o.Destination.JenkinsX.Enabled = true
callback := func(env *v1.Environment) error {
env.Spec.TeamSettings.ImportMode = v1.ImportModeTypeYAML
if buildPackURL != "" {
env.Spec.TeamSettings.BuildPackURL = buildPackURL
}
return nil
}
err = o.ModifyDevEnvironment(callback)
require.NoError(t, err, "failed to modify Dev Environment")

err = o.Run()
require.NoError(t, err, "Failed %s with %s", dirName, err)

assert.FileExists(t, filepath.Join(testDir, "Dockerfile"))
assert.FileExists(t, filepath.Join(testDir, "charts", dirName, "Chart.yaml"))
assert.FileExists(t, filepath.Join(testDir, "charts", dirName, "resources", "README.md"))
assert.FileExists(t, filepath.Join(testDir, config.ProjectConfigFileName))

projectConfig, projectFileName, err := config.LoadProjectConfig(testDir)
require.NoError(t, err, "could not load jenkins configuration at %s", testDir)

assert.Equal(t, "javascript", projectConfig.BuildPack, "buildPack property in file %s", projectFileName)
}
87 changes: 85 additions & 2 deletions pkg/cmd/importcmd/pack.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,22 @@ func (p *Pack) SaveDir(dest string) error {
}
}
for _, chart := range p.Charts {
if err := chartutil.SaveDir(chart, chartPath); err != nil {
// lets make any new directories we need
for _, f := range chart.Files {
path := f.TypeUrl
if path != "" {
fullPath := filepath.Join(chartPath, chart.Metadata.Name, path)
dir := filepath.Dir(fullPath)

// lets ensure the dir exists
err = os.MkdirAll(dir, util.DefaultWritePermissions)
if err != nil {
return errors.Wrapf(err, "failed to create dir %s", dir)
}
}
}

if err := SaveDir(chart, chartPath); err != nil {
return err
}
}
Expand Down Expand Up @@ -80,6 +95,60 @@ func (p *Pack) SaveDir(dest string) error {
return nil
}

// SaveDir saves a chart as files in a directory.
func SaveDir(c *kchart.Chart, dest string) error {
// Create the chart directory
outdir := filepath.Join(dest, c.Metadata.Name)
if err := os.MkdirAll(outdir, 0755); err != nil {
return err
}

// Save the chart file.
if err := chartutil.SaveChartfile(filepath.Join(outdir, chartutil.ChartfileName), c.Metadata); err != nil {
return err
}

// Save values.yaml
if c.Values != nil && len(c.Values.Raw) > 0 {
vf := filepath.Join(outdir, chartutil.ValuesfileName)
if err := ioutil.WriteFile(vf, []byte(c.Values.Raw), 0755); err != nil {
return err
}
}

for _, d := range []string{chartutil.TemplatesDir, ChartsDir} {
if err := os.MkdirAll(filepath.Join(outdir, d), 0755); err != nil {
return err
}
}

// Save templates
for _, f := range c.Templates {
n := filepath.Join(outdir, f.Name)
if err := ioutil.WriteFile(n, f.Data, 0755); err != nil {
return err
}
}

// Save files
for _, f := range c.Files {
n := filepath.Join(outdir, f.TypeUrl)
if err := ioutil.WriteFile(n, f.Value, 0755); err != nil {
return err
}
}

// Save dependencies
base := filepath.Join(outdir, ChartsDir)
for _, dep := range c.Dependencies {
// Here, we write each dependency as a tar file.
if _, err := chartutil.Save(dep, base); err != nil {
return err
}
}
return nil
}

// CREDIT https://github.com/Azure/draft/blob/9705e36dc23c27c9ef54dc2469dd86ac6093f0f4/pkg/draft/pack/pack.go
// FromDir takes a string name, tries to resolve it to a file or directory, and then loads it.
//
Expand Down Expand Up @@ -108,12 +177,26 @@ func loadDirectory(pack *Pack, dir string, relPath string) error {
if fInfo.IsDir() {
// assume root folders not starting with dot are chart folders
// could replace this logic with checking for charts / preview strings instead?
if relPath == "" && !strings.HasPrefix(name, ".") {
if relPath == "" && !(strings.HasPrefix(name, ".")) {
localChart, err := chartutil.LoadDir(filepath.Join(dir, name))
if err != nil {
continue
}
pack.Charts = append(pack.Charts, localChart)

// lets see if there's a nested resources folder
resourceDir := filepath.Join(dir, name, "resources")
exists, err := util.DirExists(resourceDir)
if err != nil {
return errors.Wrapf(err, "checking if resources dir exists %s", resourceDir)
}
if exists {
_, packName := filepath.Split(dir)
err = loadDirectory(pack, resourceDir, filepath.Join(relPath, name, packName, "resources"))
if err != nil {
return err
}
}
} else {
// allow other directories to copy across
err = loadDirectory(pack, filepath.Join(dir, name), filepath.Join(relPath, name))
Expand Down

0 comments on commit 77e4f83

Please sign in to comment.