chore: refactor pipelines (#97)
## Description
<!-- **Please link some issue here describing what you are trying to achieve.**
In case there is no issue present for your PR, please consider creating one.
At least please give us some description what you are trying to achieve and why your change is needed. -->
relates to #1234
## Checklist
- [ ] Issue was linked above
- [ ] Code format was applied: `make fmt`
- [ ] Examples were added / adjusted (see `examples/` directory)
- [x] Docs are up-to-date: `make generate-docs` (will be checked by CI)
- [ ] Unit tests got implemented or updated
- [ ] Acceptance tests got implemented or updated (see e.g. [here](f5f99d1709/stackit/internal/services/dns/dns_acc_test.go))
- [x] Unit tests are passing: `make test` (will be checked by CI)
- [x] No linter issues: `make lint` (will be checked by CI)
Co-authored-by: Marcel S. Henselin <marcel.henselin@stackit.cloud>
Reviewed-on: #97
This commit is contained in:
parent
2893a11c0a
commit
7b2dfaea44
5 changed files with 145 additions and 50 deletions
26
.github/actions/acc_test/action.yaml
vendored
26
.github/actions/acc_test/action.yaml
vendored
|
|
@ -67,9 +67,13 @@ inputs:
|
|||
|
||||
outputs:
|
||||
result:
|
||||
value: ${{ steps.testrun.result }}
|
||||
value: "${{ steps.testrun.result }}"
|
||||
description: "the output of the tests"
|
||||
|
||||
status:
|
||||
value: "${{ steps.status.status }}"
|
||||
description: "the status of the tests"
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
|
|
@ -213,6 +217,8 @@ runs:
|
|||
fi
|
||||
|
||||
testfile="${{ inputs.test_file }}"
|
||||
|
||||
echo "result=no result before run" >> "$GITHUB_OUTPUT"
|
||||
|
||||
echo "Running acceptance tests for the terraform provider"
|
||||
set +e
|
||||
|
|
@ -230,11 +236,14 @@ runs:
|
|||
echo "::endgroup::"
|
||||
set -e
|
||||
echo "::group::go test result"
|
||||
if [ $? -ne 0 ]; then
|
||||
|
||||
if [[ $(cat acc_test_run.log | grep "FAIL") ]]; 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"
|
||||
echo "result=FAIL: ${res}" >> "$GITHUB_OUTPUT"
|
||||
exit 1
|
||||
else
|
||||
echo "result=no FAIL detected" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
echo "::endgroup::"
|
||||
env:
|
||||
|
|
@ -246,10 +255,12 @@ runs:
|
|||
TF_ACC_KEK_KEY_VERSION: ${{ inputs.tf_acc_kek_key_version }}
|
||||
TF_ACC_KEK_SERVICE_ACCOUNT: ${{ inputs.tf_acc_kek_service_account }}
|
||||
|
||||
- name: Artifact upload start
|
||||
- name: Set status output variable
|
||||
if: always()
|
||||
id: status
|
||||
shell: bash
|
||||
run: |
|
||||
echo "::group::artifact upload"
|
||||
echo "status=${{ steps.testrun.outcome == 'success' && 'SUCCESS' || 'FAILURE' }}" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Upload test log artifact
|
||||
if: always()
|
||||
|
|
@ -257,8 +268,3 @@ runs:
|
|||
with:
|
||||
name: acc_test.log
|
||||
path: "stackit/acc_test_run.log"
|
||||
|
||||
- name: Artifact upload finish
|
||||
shell: bash
|
||||
run: |
|
||||
echo "::endgroup::"
|
||||
|
|
|
|||
44
.github/actions/clean_up/action.yaml
vendored
44
.github/actions/clean_up/action.yaml
vendored
|
|
@ -41,6 +41,14 @@ outputs:
|
|||
description: "stackit cli version"
|
||||
value: ${{ steps.stackit_version.outputs.version }}
|
||||
|
||||
pre_count:
|
||||
description: "number of resources found"
|
||||
value: ${{ steps.retrieve_pre.outputs.count }}
|
||||
|
||||
post_count:
|
||||
description: "number of resources found"
|
||||
value: ${{ steps.retrieve_post.outputs.count }}
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
|
|
@ -115,7 +123,8 @@ runs:
|
|||
exit 1
|
||||
fi
|
||||
|
||||
- name: Retrieve resources
|
||||
- name: Retrieve resources before
|
||||
id: retrieve_pre
|
||||
run: |
|
||||
echo "::group::retrieve resources"
|
||||
set -e
|
||||
|
|
@ -125,11 +134,15 @@ runs:
|
|||
stackit auth activate-service-account --service-account-key-path .svc_acc.json
|
||||
|
||||
echo "SQL Server Flex resources:"
|
||||
stackit --verbosity ${{ inputs.log_level }} --project-id "${{ inputs.project_id }}" beta sqlserverflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))'
|
||||
sql_res=$(stackit --verbosity ${{ inputs.log_level }} --project-id "${{ inputs.project_id }}" beta sqlserverflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))')
|
||||
sql_count=$(echo "$sql_res" | jq -r '.id' | wc -l)
|
||||
|
||||
echo "PostgreSQL Flex resources:"
|
||||
stackit --verbosity ${{ inputs.log_level }} --project-id "${{ inputs.project_id }}" postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))'
|
||||
pg_res=$(stackit --verbosity ${{ inputs.log_level }} --project-id "${{ inputs.project_id }}" postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))')
|
||||
pg_count=$(echo "$pg_res" | jq -r '.id' | wc -l)
|
||||
|
||||
echo "Number of resources found: ${sql_count} SQL Server Flex, ${pg_count} PostgreSQL Flex"
|
||||
echo "count=$(( ${pg_count} + ${sql_count} ))" >> $GITHUB_OUTPUT
|
||||
echo "::endgroup::"
|
||||
shell: bash
|
||||
|
||||
|
|
@ -156,7 +169,7 @@ runs:
|
|||
echo "::group::delete PostgreSQL Flex resources"
|
||||
set -e
|
||||
stackit auth activate-service-account --service-account-key-path .svc_acc.json
|
||||
for s in $(stackit --verbosity ${{ inputs.log_level }} --project-id ${{ inputs.project_id }} postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}")) | .id'); do stackit --verbosity ${{ inputs.log_level }} -y --project-id ${{ inputs.project_id }} postgresflex instance delete $s; done
|
||||
for s in $(stackit --verbosity ${{ inputs.log_level }} --project-id ${{ inputs.project_id }} postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}")) | .id'); do stackit --verbosity ${{ inputs.log_level }} -y --project-id ${{ inputs.project_id }} postgresflex instance delete "$s" --force; done
|
||||
echo "::endgroup::"
|
||||
shell: bash
|
||||
|
||||
|
|
@ -166,3 +179,26 @@ runs:
|
|||
set -e
|
||||
echo "Skip deleting: list only mode"
|
||||
shell: bash
|
||||
|
||||
- name: Retrieve resources after
|
||||
id: retrieve_post
|
||||
run: |
|
||||
echo "::group::retrieve resources"
|
||||
set -e
|
||||
echo "authenticating api"
|
||||
STACKIT_SERVICE_ACCOUNT_KEY_PATH="${PWD}/.svc_acc.json"
|
||||
export STACKIT_SERVICE_ACCOUNT_KEY_PATH
|
||||
stackit auth activate-service-account --service-account-key-path .svc_acc.json
|
||||
|
||||
echo "SQL Server Flex resources:"
|
||||
sql_res=$(stackit --verbosity ${{ inputs.log_level }} --project-id "${{ inputs.project_id }}" beta sqlserverflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))')
|
||||
sql_count=$(echo "$sql_res" | jq -r '.id' | wc -l)
|
||||
|
||||
echo "PostgreSQL Flex resources:"
|
||||
pg_res=$(stackit --verbosity ${{ inputs.log_level }} --project-id "${{ inputs.project_id }}" postgresflex instance list --output-format json | jq -r '.[] | select(.name | startswith("${{ inputs.tf_resource_prefix }}"))')
|
||||
pg_count=$(echo "$pg_res" | jq -r '.id' | wc -l)
|
||||
|
||||
echo "Number of resources found: ${sql_count} SQL Server Flex, ${pg_count} PostgreSQL Flex"
|
||||
echo "count=$(( ${pg_count} + ${sql_count} ))" >> $GITHUB_OUTPUT
|
||||
echo "::endgroup::"
|
||||
shell: bash
|
||||
|
|
|
|||
63
.github/actions/notify/action.yaml
vendored
63
.github/actions/notify/action.yaml
vendored
|
|
@ -9,11 +9,17 @@ inputs:
|
|||
title:
|
||||
description: "The title of the notification."
|
||||
required: true
|
||||
default: 'no title provided'
|
||||
|
||||
subtitle:
|
||||
description: "The subtitle of the notification."
|
||||
default: 'no subtitle provided'
|
||||
|
||||
image_slug:
|
||||
description: "The slug of the image to be included in the notification."
|
||||
default: 'git'
|
||||
|
||||
event_author:
|
||||
description: "The author of the event."
|
||||
required: true
|
||||
default: 'unknown'
|
||||
|
||||
event_title:
|
||||
|
|
@ -22,35 +28,23 @@ inputs:
|
|||
|
||||
event_body:
|
||||
description: "The body of the event."
|
||||
required: true
|
||||
default: 'no body provided'
|
||||
|
||||
event_number:
|
||||
description: "The number of the event."
|
||||
required: true
|
||||
default: 'no number provided'
|
||||
|
||||
event_url:
|
||||
description: "The url of the event."
|
||||
required: true
|
||||
default: 'none'
|
||||
|
||||
status:
|
||||
description: "The status of the event."
|
||||
default: 'UNKNOWN'
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
# - name: event list
|
||||
# shell: bash
|
||||
# run: |
|
||||
# cat <<'EOF'
|
||||
# ${{ toJSON(github) }}
|
||||
# EOF
|
||||
#
|
||||
# - name: print env
|
||||
# shell: bash
|
||||
# run: |
|
||||
# env
|
||||
# exit 1
|
||||
|
||||
- name: Install prerequisites
|
||||
shell: bash
|
||||
run: |
|
||||
|
|
@ -60,6 +54,27 @@ runs:
|
|||
apt install -y curl jq
|
||||
echo "::endgroup::"
|
||||
|
||||
- name: Determine status color
|
||||
id: status
|
||||
shell: bash
|
||||
run: |
|
||||
case "${{ inputs.status }}" in
|
||||
SUCCESS)
|
||||
STATUS_COLOR="006400/228b22"
|
||||
ADD='{"decoratedText": {"startIcon": {"materialIcon": {"name": "check_circle"}},"text": "<b style=\"color: green;\">SUCCESS</b>"}},'
|
||||
;;
|
||||
FAILURE)
|
||||
STATUS_COLOR="8b0000/dc143c"
|
||||
ADD='{"decoratedText": {"startIcon": {"materialIcon": {"name": "stop_circle"}},"text": "<b style=\"color: red;\">FAILURE</b>"}},'
|
||||
;;
|
||||
*)
|
||||
STATUS_COLOR="483d8b/6495ed"
|
||||
ADD=''
|
||||
;;
|
||||
esac
|
||||
echo "color=${STATUS_COLOR}" >> "$GITHUB_OUTPUT"
|
||||
echo "status_add=${ADD}" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Notify via Google Chat Webhook
|
||||
shell: bash
|
||||
env:
|
||||
|
|
@ -69,7 +84,8 @@ runs:
|
|||
|
||||
PAYLOAD=$(jq -n -r \
|
||||
--arg header "${{ inputs.title }}" \
|
||||
--arg repo "${{ github.repository || '' }}" \
|
||||
--arg subtitle "${{ inputs.subtitle }}" \
|
||||
--arg imgurl "https://cdn.simpleicons.org/${{ inputs.image_slug }}/${{ steps.status.outputs.color }}" \
|
||||
--arg title "${{ inputs.event_title || 'no event title given' }}" \
|
||||
--arg body "${{ inputs.event_body || 'no event body given' }}" \
|
||||
--arg author "${{ inputs.event_author || 'no event author given' }}" \
|
||||
|
|
@ -77,8 +93,8 @@ runs:
|
|||
'{ "cardsV2": [ { "cardId": "notify-${{ github.run_id }}", "card": {
|
||||
"header": {
|
||||
"title": "\($header)",
|
||||
"subtitle": "Repo: \($repo)",
|
||||
"imageUrl": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/git.png",
|
||||
"subtitle": "\($subtitle)",
|
||||
"imageUrl": "\($imgurl)",
|
||||
"imageType": "SQUARE"
|
||||
},
|
||||
"sections": [
|
||||
|
|
@ -86,12 +102,13 @@ runs:
|
|||
"header": "\($title)",
|
||||
"collapsible": false,
|
||||
"widgets": [
|
||||
${{ steps.status.outputs.status_add }}
|
||||
{
|
||||
"decoratedText": {
|
||||
"icon": {
|
||||
"startIcon": {
|
||||
"knownIcon": "PERSON"
|
||||
},
|
||||
"text": "<b>Opened by:</b> \($author)"
|
||||
"text": "<b>\($author)</b>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
|||
20
.github/workflows/clean_up.yaml
vendored
20
.github/workflows/clean_up.yaml
vendored
|
|
@ -38,14 +38,16 @@ jobs:
|
|||
uses: ./.github/actions/notify
|
||||
with:
|
||||
webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }}
|
||||
title: CLEAN UP pipeline started
|
||||
title: "[START] CLEAN UP pipeline"
|
||||
subtitle: "${{ forgejo.repository }}"
|
||||
event_title: ${{ forgejo.event_name }}
|
||||
event_author: ${{ forgejo.actor }}
|
||||
event_body: "Filter: ${{ inputs.res_prefix }}"
|
||||
event_body: "try to remove all resources with prefix <b>${{ inputs.res_prefix }}</b>"
|
||||
event_number: ${{ forgejo.run_number }}
|
||||
event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ forgejo.run_number }}"
|
||||
|
||||
- name: Clean
|
||||
id: clean
|
||||
uses: ./.github/actions/clean_up
|
||||
with:
|
||||
project_id: ${{ vars.TF_ACC_PROJECT_ID }}
|
||||
|
|
@ -54,3 +56,17 @@ jobs:
|
|||
service_account_json_content_b64: "${{ secrets.TF_ACC_SERVICE_ACCOUNT_JSON_B64 }}"
|
||||
list_only: ${{ inputs.list_only }}
|
||||
log_level: ${{ inputs.log_level }}
|
||||
|
||||
- name: Notify
|
||||
if: always()
|
||||
uses: ./.github/actions/notify
|
||||
with:
|
||||
webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }}
|
||||
title: "[END] CLEAN UP pipeline"
|
||||
subtitle: "${{ forgejo.repository }}"
|
||||
event_title: ${{ forgejo.event_name }}
|
||||
event_author: ${{ forgejo.actor }}
|
||||
event_body: "count before cleaning: ${{ steps.clean.outputs.pre_count }} <br /> count after cleaning: ${{ steps.clean.outputs.post_count }}"
|
||||
event_number: ${{ forgejo.run_number }}
|
||||
event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ forgejo.run_number }}"
|
||||
status: ${{ steps.clean.outcome == 'success' && 'SUCCESS' || 'FAILURE' }}
|
||||
|
|
|
|||
42
.github/workflows/tf-acc-test.yaml
vendored
42
.github/workflows/tf-acc-test.yaml
vendored
|
|
@ -40,19 +40,26 @@ jobs:
|
|||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: set start time
|
||||
id: start_time
|
||||
run: |
|
||||
echo "time=$(date --rfc-3339=ns)" >> ${GITHUB_ENV}
|
||||
echo "start=$(date +%s%N)" >> ${GITHUB_ENV}
|
||||
|
||||
- name: Notify
|
||||
uses: ./.github/actions/notify
|
||||
with:
|
||||
webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }}
|
||||
title: Terraform Acceptance Tests started
|
||||
event_title: ${{ github.event_name }}
|
||||
event_author: ${{ github.actor }}
|
||||
title: "[START] Terraform Acceptance Tests"
|
||||
subtitle: "${{ forgejo.event_name }} on branch ${{ forgejo.ref }}"
|
||||
event_title: "started: ${{ steps.start_time.outputs.time }}"
|
||||
event_author: ${{ forgejo.actor }}
|
||||
event_body: ${{ inputs.test_file }}
|
||||
event_number: ${{ github.run_id }}
|
||||
event_number: ${{ forgejo.run_number }}
|
||||
event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ forgejo.run_number }}"
|
||||
|
||||
- name: Run Test (workflow dispatch)
|
||||
if: ${{ github.event_name == 'workflow_dispatch' }}
|
||||
if: ${{ forgejo.event_name == 'workflow_dispatch' }}
|
||||
id: manual_run
|
||||
uses: ./.github/actions/acc_test
|
||||
with:
|
||||
|
|
@ -70,7 +77,7 @@ jobs:
|
|||
test_file: ${{ inputs.test_file }}
|
||||
|
||||
- name: Run Test (automatic)
|
||||
if: ${{ github.event_name != 'workflow_dispatch' }}
|
||||
if: ${{ forgejo.event_name != 'workflow_dispatch' }}
|
||||
id: automatic_run
|
||||
uses: ./.github/actions/acc_test
|
||||
with:
|
||||
|
|
@ -84,13 +91,26 @@ jobs:
|
|||
tf_acc_kek_key_version: ${{ vars.TF_ACC_KEK_KEY_VERSION }}
|
||||
tf_acc_kek_service_account: ${{ vars.TF_ACC_KEK_SERVICE_ACCOUNT }}
|
||||
|
||||
- name: set end time
|
||||
id: end_time
|
||||
run: |
|
||||
echo "time=$(date --rfc-3339=ns)" >> ${GITHUB_ENV}
|
||||
end=$(date +%s%N)
|
||||
echo "end=${end}" >> ${GITHUB_ENV}
|
||||
start=${{ steps.start_time.outputs.start }}
|
||||
diff=$((end-start))
|
||||
duration=$(printf "%s.%s" "${diff:0: -9}" "${diff: -9:3}")
|
||||
echo "duration=${duration}" >> ${GITHUB_ENV}
|
||||
|
||||
- name: Notify
|
||||
uses: ./.github/actions/notify
|
||||
with:
|
||||
webhook_url: ${{ secrets.GOOGLE_WEBHOOK_URL }}
|
||||
title: Terraform Acceptance Tests finished
|
||||
event_title: ${{ github.event_name }}
|
||||
event_author: ${{ github.actor }}
|
||||
event_body: "${{ steps.automatic_run.outputs.result || steps.manual_run.outputs.result }}"
|
||||
event_number: ${{ github.event.id }}
|
||||
title: "[END] Terraform Acceptance Tests"
|
||||
subtitle: "${{ forgejo.event_name }} on branch ${{ forgejo.ref }} with status: ${{ forgejo.event_name == 'workflow_dispatch' && steps.manual_run.outputs.status || steps.automatic_run.outputs.status }}"
|
||||
event_title: "run ended: ${{ steps.end_time.outputs.time }}, duration: ${{ steps.end_time.outputs.duration }} seconds"
|
||||
event_author: ${{ forgejo.actor }}
|
||||
event_body: "${{ forgejo.event_name == 'workflow_dispatch' && steps.manual_run.outputs.result || steps.automatic_run.outputs.result }}"
|
||||
event_number: ${{ forgejo.event.id }}
|
||||
event_url: "https://tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/actions/runs/${{ forgejo.run_number }}"
|
||||
status: "${{ forgejo.event_name == 'workflow_dispatch' && steps.manual_run.outputs.status || steps.automatic_run.outputs.status }}"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue