name: Acceptance Testing description: "Acceptance Testing pipeline" inputs: tf_debug: description: "enable terraform debug logs" default: 'false' required: true test_timeout_string: description: "string that determines the timeout (default: 45m)" default: '90m' required: true go-version: description: "go version to install" default: '1.25' required: true project_id: description: "STACKIT project ID for tests" required: true project_user_email: required: true description: "project user email for acc testing" tf_acc_kek_key_id: description: "KEK key ID" required: true tf_acc_kek_key_ring_id: description: "KEK key ring ID" required: true tf_acc_kek_key_version: description: "KEK key version" required: true tf_acc_kek_service_account: description: "KEK service account email" required: true region: description: "STACKIT region for tests" default: 'eu01' required: true service_account_json_content: description: "STACKIT service account JSON file contents" required: true default: "" service_account_json_content_b64: description: "STACKIT service account JSON file contents" required: true default: "" service_account_json_file_path: description: "STACKIT service account JSON file contents" required: true default: 'service_account.json' test_file: description: "testfile to run" default: '' outputs: result: value: ${{ steps.testrun.result }} description: "the output of the tests" runs: using: "composite" steps: - name: Install needed tools shell: bash run: | echo "::group::apt install" set -e apt-get -y -qq update >apt_update.log 2>apt_update_err.log if [ $? -ne 0 ]; then cat apt_update.log apt_update_err.log fi apt-get -y -qq install jq python3 python3-pip python-is-python3 s3cmd git make wget >apt_get.log 2>apt_get_err.log if [ $? -ne 0 ]; then cat apt_get.log apt_get_err.log fi echo "::endgroup::" # Install latest version of Terraform - uses: hashicorp/setup-terraform@v4 with: terraform_wrapper: false - uses: actions/setup-node@v6 with: node-version: '24.x' - name: Setup JAVA uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' - name: Install Go ${{ inputs.go-version }} uses: actions/setup-go@v6 with: # go-version: ${{ inputs.go-version }} check-latest: true go-version-file: 'go.mod' - name: Determine GOMODCACHE shell: bash id: goenv run: | set -e echo "gomodcache=$(go env GOMODCACHE)" >> "$GITHUB_OUTPUT" - name: Restore cached GO pkg id: cache-gopkg uses: actions/cache/restore@v5 with: path: "${{ steps.goenv.outputs.gomodcache }}" key: ${{ runner.os }}-gopkg - name: Install go tools if: steps.cache-gopkg.outputs.cache-hit != 'true' shell: bash run: | echo "::group::go install" set -e go mod download 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@latest go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest echo "::endgroup::" - name: Run go mod tidy shell: bash run: go mod tidy - name: Save GO package Cache id: cache-gopkg-save uses: actions/cache/save@v5 with: path: | ${{ steps.goenv.outputs.gomodcache }} key: ${{ runner.os }}-gopkg - name: Define service account file path variable id: service_account shell: bash run: | echo "safilepath=${PWD}/stackit/${{ inputs.service_account_json_file_path }}" >> "$GITHUB_OUTPUT" - name: Creating service_account file from json input if: inputs.service_account_json_content != '' shell: bash run: | echo "::group::create service account file" set -e set -o pipefail jsonFile="${{ inputs.service_account_json_file_path }}" jsonFile="${jsonFile:-x}" if [ "${jsonFile}" == "x" ]; then echo "no service account file path provided" exit 1 fi if [ ! -f "${jsonFile}" ]; then echo "creating service account file '${{ inputs.service_account_json_file_path }}'" echo "${{ inputs.service_account_json_content }}" > stackit/"${{ inputs.service_account_json_file_path }}" fi ls -l stackit/"${{ inputs.service_account_json_file_path }}" echo "::endgroup::" - name: Creating service_account file from base64 json input if: inputs.service_account_json_content_b64 != '' shell: bash run: | echo "::group::create service account file" set -e set -o pipefail jsonFile="${{ inputs.service_account_json_file_path }}" jsonFile="${jsonFile:-x}" if [ "${jsonFile}" == "x" ]; then echo "no service account file path provided" exit 1 fi if [ ! -f "${jsonFile}" ]; then echo "creating service account file '${{ inputs.service_account_json_file_path }}'" echo "${{ inputs.service_account_json_content_b64 }}" | base64 -d > stackit/"${{ inputs.service_account_json_file_path }}" fi ls -l stackit/"${{ inputs.service_account_json_file_path }}" echo "::endgroup::" - name: Run acceptance tests id: testrun shell: bash run: | echo "::group::go test file" set -e set -o pipefail if [[ "${{ inputs.tf_debug }}" == "true" ]]; then TF_LOG=INFO export TF_LOG fi testfile="${{ inputs.test_file }}" echo "Running acceptance tests for the terraform provider" set +e cd stackit || exit 1 TF_ACC=1 \ TF_ACC_PROJECT_ID=${TF_ACC_PROJECT_ID} \ TF_ACC_REGION=${TF_ACC_REGION} \ TF_ACC_TEST_PROJECT_USER_EMAIL=${TF_ACC_TEST_PROJECT_USER_EMAIL} \ TF_ACC_SERVICE_ACCOUNT_FILE="${PWD}/${{ inputs.service_account_json_file_path }}" \ TF_ACC_KEK_KEY_ID=${TF_ACC_KEK_KEY_ID} \ TF_ACC_KEK_KEY_RING_ID=${TF_ACC_KEK_KEY_RING_ID} \ TF_ACC_KEK_KEY_VERSION=${TF_ACC_KEK_KEY_VERSION} \ TF_ACC_KEK_SERVICE_ACCOUNT=${TF_ACC_KEK_SERVICE_ACCOUNT} \ go test -v ${testfile} -timeout=${{ inputs.test_timeout_string }} | tee -a acc_test_run.log echo "::endgroup::" set -e echo "::group::go test result" if [ $? -ne 0 ]; then echo "Test failed, see acc_test_run.log for details" res=$(cat acc_test_run.log | grep -v "=== RUN" | grep -v "\-\-\- PASS" | grep -v "=== CONT" | grep -v "=== PAUSE") echo "result=${res}" >> "$GITHUB_OUTPUT" exit 1 fi echo "::endgroup::" env: TF_ACC_PROJECT_ID: ${{ inputs.project_id }} TF_ACC_REGION: ${{ inputs.region }} TF_ACC_TEST_PROJECT_USER_EMAIL: ${{ inputs.project_user_email }} TF_ACC_KEK_KEY_ID: ${{ inputs.tf_acc_kek_key_id }} TF_ACC_KEK_KEY_RING_ID: ${{ inputs.tf_acc_kek_key_ring_id }} TF_ACC_KEK_KEY_VERSION: ${{ inputs.tf_acc_kek_key_version }} TF_ACC_KEK_SERVICE_ACCOUNT: ${{ inputs.tf_acc_kek_service_account }} - name: Upload test log artifact if: always() uses: actions/upload-artifact@v3 with: name: acc_test.log path: "stackit/acc_test_run.log"