Skip to content

Commit 9b8f984

Browse files
janiszdhaus67
andauthoredMar 27, 2023
ROX-11371: Run E2E tests on GHA GKE (#234)
Co-authored-by: dhaus67 <dhaus@redhat.com>
1 parent 694769b commit 9b8f984

15 files changed

+156
-671
lines changed
 

‎.circleci/check-workflow-live.sh

-20
This file was deleted.

‎.circleci/config.yml

-367
This file was deleted.

‎.circleci/create-cluster.sh

-107
This file was deleted.

‎.circleci/mirror-repository

-39
This file was deleted.

‎.circleci/setUpJenkinsPlugin.sh

-48
This file was deleted.

‎.circleci/waitForJenkinService.sh

-20
This file was deleted.

‎.github/workflows/tests.yaml

+102-1
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,24 @@ name: Tests
22

33
on:
44
push:
5+
schedule:
6+
- cron: '0 5 * * *'
57

68
jobs:
7-
build:
9+
style:
810
runs-on: ubuntu-latest
11+
steps:
12+
- uses: actions/checkout@v3
13+
- uses: actions/setup-java@v3
14+
with:
15+
distribution: 'temurin'
16+
java-version: '11'
17+
cache: 'gradle'
18+
- name: Check style
19+
run: make -C functionaltest-jenkins-plugin style
920

21+
build:
22+
runs-on: ubuntu-latest
1023
steps:
1124
- uses: actions/checkout@v3
1225
- uses: actions/setup-java@v3
@@ -16,3 +29,91 @@ jobs:
1629
cache: 'maven'
1730
- name: Build with Maven
1831
run: cd stackrox-container-image-scanner && ./mvnw -B verify package hpi:hpi cyclonedx:makeAggregateBom
32+
- uses: actions/upload-artifact@v3
33+
with:
34+
name: stackrox-container-image-scanner.hpi
35+
path: stackrox-container-image-scanner/target/stackrox-container-image-scanner.hpi
36+
37+
e2e:
38+
runs-on: ubuntu-latest
39+
needs: build
40+
steps:
41+
- uses: actions/checkout@v3
42+
- uses: actions/checkout@v3
43+
with:
44+
repository: stackrox/stackrox
45+
path: stackrox
46+
- uses: docker/setup-buildx-action@v2
47+
- uses: actions/setup-java@v3
48+
with:
49+
distribution: 'temurin'
50+
java-version: '11'
51+
cache: 'gradle'
52+
- name: Install kubectl
53+
run: sudo snap install kubectl --classic
54+
- name: Install gcloud
55+
run: |
56+
sudo snap install google-cloud-cli --classic
57+
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
58+
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -
59+
sudo apt-get update
60+
sudo apt-get install google-cloud-sdk-gke-gcloud-auth-plugin
61+
- uses: actions/download-artifact@v3
62+
with:
63+
name: stackrox-container-image-scanner.hpi
64+
path: jenkins
65+
- name: Build jenkins image
66+
uses: docker/build-push-action@v4
67+
with:
68+
tags: jenkins-test
69+
context: jenkins
70+
push: false
71+
load: true
72+
- name: Run jenkins in background
73+
run: docker run -d --add-host host.docker.internal:host-gateway -p 8080:8080 jenkins-test
74+
- name: Create GKE cluster
75+
id: create-cluster
76+
env:
77+
GCLOUD_SERVICE_ACCOUNT_OPENSHIFT_CI_ROX: ${{ secrets.GCLOUD_SERVICE_ACCOUNT_OPENSHIFT_CI_ROX }}
78+
run: |
79+
cd stackrox
80+
source "scripts/ci/gke.sh"
81+
provision_gke_cluster "jenkins-plugin-e2e" 3 e2-standard-4
82+
echo "CLUSTER_NAME=${CLUSTER_NAME}" >> $GITHUB_OUTPUT
83+
wait_for_cluster
84+
- name: Deploy Stackrox
85+
id: deploy
86+
env:
87+
MAIN_IMAGE_TAG: latest
88+
MONITORING_SUPPORT: false
89+
run: |
90+
cd stackrox
91+
./deploy/k8s/central.sh
92+
pass=$(cat deploy/k8s/central-deploy/password)
93+
echo "ROX_PASSWORD=$(cat deploy/k8s/central-deploy/password)" >> $GITHUB_OUTPUT
94+
- name: Run proxy
95+
env:
96+
port: 8000
97+
run: |
98+
pid="$(lsof -n -i "tcp:${port}" | grep kubectl | awk '{print $2}' | uniq)"
99+
[[ -n "${pid}" ]] || { einfo "No kubectl port-forward is running on port ${port}."; exit 0; }
100+
kill "${pid}" || die "Kill failed"
101+
kubectl port-forward -n 'stackrox' svc/central "8000:443" --address='0.0.0.0' &
102+
- name: Wait for API
103+
run: |
104+
cd stackrox
105+
source "tests/e2e/lib.sh"
106+
wait_for_api
107+
- name: Run tests
108+
env:
109+
ROX_PASSWORD: ${{ steps.deploy.outputs.ROX_PASSWORD }}
110+
ROX_ENDPOINT: https://localhost:8000
111+
JENKINS_ROX_ENDPOINT: https://host.docker.internal:8000
112+
run: make -C functionaltest-jenkins-plugin test
113+
- name: Teardown GKE cluster
114+
if: always() && steps.create-cluster.outputs.CLUSTER_NAME != ''
115+
env:
116+
CLUSTER_NAME: ${{ steps.create-cluster.outputs.CLUSTER_NAME }}
117+
run: |
118+
source "stackrox/scripts/ci/gke.sh"
119+
teardown_gke_cluster

‎README.md

+13-17
Original file line numberDiff line numberDiff line change
@@ -12,37 +12,33 @@ Please take a look at [plugin README](stackrox-container-image-scanner/README.md
1212

1313
0. Requirements
1414

15-
- K8s cluster to run Jenkins
16-
- kubectl
17-
- Maven
15+
- Podman/Docker
1816
- Java 8
19-
- curl
20-
- jq
2117

22-
1. Deploy Jenkins
18+
1. Create HPI file
2319

2420
```
25-
kubectl create namespace jenkins
26-
kubectl apply -f jenkins/jenkins-app-deployment.yaml
27-
kubectl apply -f jenkins/jenkins-service.yaml
28-
nohup kubectl port-forward -n jenkins svc/jenkins 8080:8080 &
21+
cd stackrox-container-image-scanner
22+
./mvnw package && ./mvnw hpi:hpi
2923
```
3024

31-
2. Create HPI file
25+
2. Run Jenkins with plugin installed
3226

3327
```
34-
cd stackrox-container-image-scanner
35-
./mvnw package && ./mvnw hpi:hpi
28+
cp stackrox-container-image-scanner/target/stackrox-container-image-scanner.hpi jenkins/
29+
docker build -t jenkins-test jenkins
30+
docker run -d --add-host host.docker.internal:host-gateway -p 8080:8080 jenkins-test
3631
```
3732

38-
3. Install Plugin
33+
4. Run the E2E tests
3934

4035
```
41-
export JENKIS_CRUMB=`curl --cookie-jar cookies.txt -s http://localhost:8080/crumbIssuer/api/json | jq .crumb -r`
42-
curl -b cookies.txt -i -F file=@stackrox-container-image-scanner/target/stackrox-container-image-scanner.hpi http://localhost:8080/pluginManager/uploadPlugin\?Jenkins-Crumb=$JENKIS_CRUMB
36+
export JENKINS_ROX_ENDPOINT='https://host.docker.internal:8000' # endpoint accessed by jenkins
37+
export ROX_ENDPOINT='https://localhost:8000' # endpoint accessed from local machine
38+
export ROX_PASSWORD=... # stackrox admin password
39+
make -C functionaltest-jenkins-plugin test
4340
```
4441

45-
4. Create a new job with the plugin
4642
5. This project uses [Lombok](https://projectlombok.org/) so you may need to [enable Annotation Processing](https://stackoverflow.com/q/9424364/1387612)
4743

4844
### Updating API Schema

‎functionaltest-jenkins-plugin/src/main/groovy/RestApiClient.groovy

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import com.stackrox.model.StoragePolicy
1010
import com.stackrox.model.V1GenerateTokenRequest
1111
import com.stackrox.model.V1Metadata
1212

13+
import util.Config
14+
1315
@CompileStatic
1416
class RestApiClient {
1517

@@ -18,13 +20,11 @@ class RestApiClient {
1820
ApiTokenServiceApi tokenApi
1921

2022
RestApiClient() {
21-
def env = System.getenv()
22-
2323
OkHttpClient client = UnsafeOkHttpClient.getUnsafeOkHttpClient()
2424
ApiClient apiClient = new ApiClient(client)
25-
apiClient.setBasePath("https://localhost:8000")
25+
apiClient.setBasePath(Config.roxEndpoint)
2626
apiClient.setUsername("admin")
27-
apiClient.setPassword(env['ROX_PASSWORD'])
27+
apiClient.setPassword(Config.roxPassword)
2828

2929
policyServiceApi = new PolicyServiceApi(apiClient)
3030
metadataApi = new MetadataServiceApi(apiClient)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package util
2+
3+
import groovy.transform.CompileStatic
4+
5+
@CompileStatic
6+
class Config {
7+
static String getCentralUri() {
8+
return getEnv("JENKINS_ROX_ENDPOINT")
9+
}
10+
11+
static String getRoxEndpoint() {
12+
return getEnv("ROX_ENDPOINT")
13+
}
14+
15+
static String getRoxPassword() {
16+
return getEnv("ROX_PASSWORD")
17+
}
18+
19+
static String getEnv(String name) {
20+
String val = System.getenv(name)
21+
if (val == null) {
22+
throw new IllegalArgumentException(name + " is not specified!")
23+
}
24+
return val
25+
}
26+
}

‎functionaltest-jenkins-plugin/src/test/groovy/ImageScanningTest.groovy

+3-1
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ import com.stackrox.model.StorageListPolicy
1313
import com.stackrox.model.StoragePolicy
1414
import com.stackrox.model.StoragePolicyFields
1515

16+
import util.Config
17+
1618
import spock.lang.Unroll
1719

1820
class ImageScanningTest extends BaseSpecification {
1921

20-
protected static final String CENTRAL_URI = "https://central.stackrox:443"
22+
protected static final String CENTRAL_URI = Config.centralUri
2123

2224
@Unroll
2325
def "image scanning test with toggle enforcement(#imageName, #policyName, #enforcements, #endStatus)"() {

‎jenkins/Dockerfile

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
FROM jenkins/jenkins:2.395-alpine
2+
ENV JAVA_OPTS -Djenkins.install.runSetupWizard=false
3+
COPY --chown=jenkins:jenkins stackrox-container-image-scanner.hpi /var/jenkins_home/plugins/stackrox-container-image-scanner.hpi
4+
COPY config.xml /var/jenkins_home/

‎jenkins/config.xml

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version='1.1' encoding='UTF-8'?>
2+
<hudson>
3+
<useSecurity>false</useSecurity>
4+
</hudson>

‎jenkins/jenkins-app-deployment.yaml

-35
This file was deleted.

‎jenkins/jenkins-service.yaml

-12
This file was deleted.

0 commit comments

Comments
 (0)
Please sign in to comment.