Skip to content

Commit

Permalink
Adding acceptance tests through Codeship (#2)
Browse files Browse the repository at this point in the history
* Initial work on acceptance tests

* Adding Terraform CCI2 dependency

* CircleCI's Docker support still lacking. Trying Codeship

* Formatting

* Still going to need networking

* Further Codeship work

* Hmm, trying more stuff

* These mistakes are all me

* More

* And more

* Optimizing

* Cleaning up
  • Loading branch information
Ryan Nixon committed Dec 25, 2018
1 parent 83f00e9 commit 062b4a0
Show file tree
Hide file tree
Showing 15 changed files with 259 additions and 43 deletions.
12 changes: 0 additions & 12 deletions .circleci/config.yml

This file was deleted.

2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
.DS_Store
example.tf
terraform.tfplan
terraform.tfstate
terraform.tfstate*
./*.tfstate
.terraform/
*.test
24 changes: 12 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@

This is a community provider and is not supported by Hashicorp.

## Requirements

- [Terraform](https://www.terraform.io/downloads.html) 0.10+
- [Go](https://golang.org/doc/install) 1.11 (to build the provider plugin)

## Installation

Install the provider with:
Expand All @@ -20,18 +25,7 @@ Then copy or link the resulting binary to your [terraform.d plugins folder](http
ln -s "$(go env GOPATH)/bin/terraform-provider-jenkins" "$HOME/.terraform.d/plugins/terraform-provider-jenkins"
```

## Building the Provider

### Requirements

- [Terraform](https://www.terraform.io/downloads.html) 0.10+
- [Go](https://golang.org/doc/install) 1.11 (to build the provider plugin)

### Using the Provider

If you're building the provider, follow the instructions to [install it as a plugin.](https://www.terraform.io/docs/plugins/basics.html#installing-a-plugin) The `make install` target will work for most use cases. After placing it into your plugins directory, run `terraform init` to initialize it. Documentation about the provider specific configuration options can be found on the [provider's website](https://www.terraform.io/docs/providers/aws/index.html).

### Developing the Provider
## Developing the Provider

If you wish to work on the provider, you'll first need [Go](http://www.golang.org) installed on your machine (version 1.11+ is *required*). You'll also need to correctly setup a [GOPATH](http://golang.org/doc/code.html#GOPATH), as well as adding `$GOPATH/bin` to your `$PATH`.

Expand All @@ -43,6 +37,12 @@ In order to test the provider, you can simply run `make test`.
$ make test
```

In order to run the full suite of Acceptance tests, run `make testacc`. These tests require Docker installed on the machine that run them, and do not create any remote resources.

```sh
$ make testacc
```

## Attribution

This provider design was originally inspired from the work at [dihedron/terraform-provider-jenkins](https://github.com/dihedron/terraform-provider-jenkins).
17 changes: 17 additions & 0 deletions codeship-services.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
version: '2'

services:
runner:
build:
image: codeship
dockerfile: codeship.dockerfile
depends_on: [ jenkins-provider-acc ]
cached: true

jenkins-provider-acc:
build:
image: jenkins-provider-acc
dockerfile: jenkins/test-fixtures/Dockerfile
cached: true
environment:
JAVA_OPTS: "-Djenkins.install.runSetupWizard=false"
3 changes: 3 additions & 0 deletions codeship-steps.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
- name: Run Acceptance Tests
service: runner
command: make testacc ACC_USE_DOCKER=false ACC_DOCKER_URL=jenkins-provider-acc
7 changes: 7 additions & 0 deletions codeship.dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
FROM circleci/golang:1.11

WORKDIR /app
COPY go.mod go.sum /app/
RUN go mod download

COPY . /app
37 changes: 37 additions & 0 deletions jenkins/provider_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package jenkins

import (
"os"
"testing"

"github.com/hashicorp/terraform/helper/schema"
"github.com/hashicorp/terraform/terraform"
)

var testAccProvider *schema.Provider
var testAccProviders map[string]terraform.ResourceProvider

func init() {
testAccProvider = Provider().(*schema.Provider)
testAccProviders = map[string]terraform.ResourceProvider{
"jenkins": testAccProvider,
}
}

func TestProvider(t *testing.T) {
if err := testAccProvider.InternalValidate(); err != nil {
t.Fatalf("err: %s", err)
}
}

func testAccPreCheck(t *testing.T) {
if v := os.Getenv("JENKINS_URL"); v == "" {
t.Fatal("JENKINS_URL must be set for acceptance tests")
}
if v := os.Getenv("JENKINS_USERNAME"); v == "" {
t.Fatal("JENKINS_USERNAME must be set for acceptance tests")
}
if v := os.Getenv("JENKINS_PASSWORD"); v == "" {
t.Fatal("JENKINS_PASSWORD must be set for acceptance tests")
}
}
52 changes: 52 additions & 0 deletions jenkins/resource_jenkins_folder_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package jenkins

import (
"fmt"
"testing"

jenkins "github.com/bndr/gojenkins"
"github.com/hashicorp/terraform/helper/acctest"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"
)

func TestAccJenkinsFolder_basic(t *testing.T) {
randString := acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckJenkinsFolderDestroy,
Steps: []resource.TestStep{
{
Config: testAccJenkinsFolderConfig(randString),
},
},
})
}

func testAccCheckJenkinsFolderDestroy(s *terraform.State) error {
client := testAccProvider.Meta().(*jenkins.Jenkins)

for _, rs := range s.RootModule().Resources {
if rs.Type != "jenkins_folder" {
continue
}

_, err := client.GetJob(rs.Primary.ID)
if err == nil {
return fmt.Errorf("Folder %s still exists", rs.Primary.ID)
}
}

return nil
}

func testAccJenkinsFolderConfig(randString string) string {
return fmt.Sprintf(`
resource "jenkins_folder" "foo" {
name = "tf-acc-test-%s"
description = "Terraform acceptance tests %s"
}
`, randString, randString)
}
26 changes: 13 additions & 13 deletions jenkins/resource_jenkins_job.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,16 @@ func resourceJenkinsJobExists(d *schema.ResourceData, meta interface{}) (b bool,
client := meta.(*jenkins.Jenkins)
name := d.Id()

log.Printf("[DEBUG] jenkins::exists - checking if job %q exists", name)
log.Printf("[DEBUG] jenkins::exists - Checking if job %q exists", name)

_, err := client.GetJob(name)
if err != nil {
log.Printf("[DEBUG] jenkins::exists - job %q does not exist: %v", name, err)
log.Printf("[DEBUG] jenkins::exists - Job %q does not exist: %v", name, err)
d.SetId("")
return false, nil
}

log.Printf("[DEBUG] jenkins::exists - job %q exists", name)
log.Printf("[DEBUG] jenkins::exists - Job %q exists", name)
return true, nil
}

Expand All @@ -61,13 +61,13 @@ func resourceJenkinsJobCreate(d *schema.ResourceData, meta interface{}) (err err

xml, err := renderTemplate(d.Get("template").(string), d)
if err != nil {
log.Printf("[ERROR] jenkins::create - error binding config.xml template to %q: %v", name, err)
log.Printf("[ERROR] jenkins::create - Error binding config.xml template to %q: %v", name, err)
return err
}

_, err = client.CreateJobInFolder(xml, baseName, folders...)
if err != nil {
log.Printf("[ERROR] jenkins::create - error creating job for %q: %v", name, err)
log.Printf("[ERROR] jenkins::create - Error creating job for %q: %v", name, err)
return err
}

Expand All @@ -81,21 +81,21 @@ func resourceJenkinsJobRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*jenkins.Jenkins)
name := d.Id()

log.Printf("[DEBUG] jenkins::read - looking for job %q", name)
log.Printf("[DEBUG] jenkins::read - Looking for job %q", name)

job, err := client.GetJob(name)
if err != nil {
log.Printf("[DEBUG] jenkins::read - job %q does not exist: %v", name, err)
log.Printf("[DEBUG] jenkins::read - Job %q does not exist: %v", name, err)
return err
}

config, err := job.GetConfig()
if err != nil {
log.Printf("[DEBUG] jenkins::read - job %q could not extract configuration: %v", name, err)
log.Printf("[DEBUG] jenkins::read - Job %q could not extract configuration: %v", name, err)
return err
}

log.Printf("[DEBUG] jenkins::read - job %q exists", name)
log.Printf("[DEBUG] jenkins::read - Job %q exists", name)
d.Set("template", config)

return nil
Expand All @@ -110,13 +110,13 @@ func resourceJenkinsJobUpdate(d *schema.ResourceData, meta interface{}) error {

xml, err := renderTemplate(d.Get("template").(string), d)
if err != nil {
log.Printf("[ERROR] jenkins::update - error binding config.xml template to %q: %v", name, err)
log.Printf("[ERROR] jenkins::update - Error binding config.xml template to %q: %v", name, err)
return err
}

err = job.UpdateConfig(xml)
if err != nil {
log.Printf("[ERROR] jenkins::update - error updating job %q configuration: %v", name, err)
log.Printf("[ERROR] jenkins::update - Error updating job %q configuration: %v", name, err)
return err
}

Expand All @@ -127,10 +127,10 @@ func resourceJenkinsJobDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*jenkins.Jenkins)
name := d.Id()

log.Printf("[DEBUG] jenkins_pipeline::delete - removing %q", name)
log.Printf("[DEBUG] jenkins::delete - Removing %q", name)

ok, err := client.DeleteJob(name)

log.Printf("[DEBUG] jenkins_pipeline::delete - %q removed: %t", name, ok)
log.Printf("[DEBUG] jenkins::delete - %q removed: %t", name, ok)
return err
}
57 changes: 57 additions & 0 deletions jenkins/resource_jenkins_job_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package jenkins

import (
"fmt"
"testing"

jenkins "github.com/bndr/gojenkins"
"github.com/hashicorp/terraform/helper/acctest"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"
)

func TestAccJenkinsJob_basic(t *testing.T) {
randString := acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckJenkinsJobDestroy,
Steps: []resource.TestStep{
{
Config: testAccJenkinsJobConfig(randString),
},
},
})
}

func testAccCheckJenkinsJobDestroy(s *terraform.State) error {
client := testAccProvider.Meta().(*jenkins.Jenkins)

for _, rs := range s.RootModule().Resources {
if rs.Type != "jenkins_job" {
continue
}

_, err := client.GetJob(rs.Primary.ID)
if err == nil {
return fmt.Errorf("Job %s still exists", rs.Primary.ID)
}
}

return nil
}

func testAccJenkinsJobConfig(randString string) string {
return fmt.Sprintf(`
resource "jenkins_job" "foo" {
name = "tf-acc-test-%s"
template = "${file("resource_jenkins_job_test.xml")}"
parameters = {
description = "Acceptance testing Jenkins provider"
}
}
`, randString)
}
29 changes: 29 additions & 0 deletions jenkins/resource_jenkins_job_test.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<flow-definition plugin="workflow-job@2.25">
<actions/>
<description>{{ .Parameters.description }}</description>
<keepDependencies>false</keepDependencies>
<properties/>
<definition class="org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition" plugin="workflow-cps@2.59">
<scm class="hudson.plugins.git.GitSCM" plugin="git@3.9.1">
<configVersion>2</configVersion>
<userRemoteConfigs>
<hudson.plugins.git.UserRemoteConfig>
<url>https://github.com/taiidani/terraform-provider-jenkins.git</url>
<credentialsId>github</credentialsId>
</hudson.plugins.git.UserRemoteConfig>
</userRemoteConfigs>
<branches>
<hudson.plugins.git.BranchSpec>
<name>*/master</name>
</hudson.plugins.git.BranchSpec>
</branches>
<doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
<submoduleCfg class="list"/>
<extensions/>
</scm>
<scriptPath>Jenkinsfile</scriptPath>
<lightweight>true</lightweight>
</definition>
<triggers/>
<disabled>false</disabled>
</flow-definition>
8 changes: 4 additions & 4 deletions jenkins/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ type job struct {
}

func renderTemplate(data string, d *schema.ResourceData) (string, error) {
log.Printf("[DEBUG] jenkins::xml - binding template:\n%s", data)
log.Printf("[DEBUG] jenkins::xml - Binding template:\n%s", data)

// create and parse the config.xml template
tpl, err := template.New("template").Parse(data)
if err != nil {
log.Printf("[ERROR] jenkins::xml - error parsing template: %v", err)
log.Printf("[ERROR] jenkins::xml - Error parsing template: %v", err)
return "", err
}

Expand Down Expand Up @@ -53,11 +53,11 @@ func renderTemplate(data string, d *schema.ResourceData) (string, error) {
var buffer bytes.Buffer
err = tpl.Execute(&buffer, j)
if err != nil {
log.Printf("[ERROR] jenkis::xml - error executing template: %v", err)
log.Printf("[ERROR] jenkis::xml - Error executing template: %v", err)
return "", err
}

xml := buffer.String()
log.Printf("[DEBUG] jenkins::xml - bound template:\n%s", xml)
log.Printf("[DEBUG] jenkins::xml - Bound template:\n%s", xml)
return xml, nil
}
Loading

0 comments on commit 062b4a0

Please sign in to comment.