Skip to content

CI

CI #1306

Workflow file for this run

name: CI
on:
push:
paths-ignore:
- '.github/**'
- '*.md'
- '.gitignore'
- 'roles/settings/**'
pull_request:
paths-ignore:
- '*.md'
- '.gitignore'
- 'roles/settings/**'
workflow_dispatch:
jobs:
ansible-lint:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install packages
run: pip install "ansible>=9.0.0,<10.0.0" ansible-lint==6.22.2 jmespath
- name: Run ansible linter
run: ansible-lint
- name: Run salty linter
run: python3 ./scripts/salty-linter.py ./roles
check-entries:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Check Missing Entries
run: ./scripts/check_missing_entries.sh
add-contributors:
runs-on: ubuntu-22.04
if: github.ref == 'refs/heads/master'
steps:
- uses: actions/checkout@v4
- uses: BobAnkh/add-contributors@master
with:
REPO_NAME: 'saltyorg/Sandbox'
CONTRIBUTOR: '### Contributors'
COLUMN_PER_ROW: '6'
ACCESS_TOKEN: ${{ secrets.GH_TOKEN }}
IMG_WIDTH: '100'
FONT_SIZE: '14'
PATH: '/README.md'
COMMIT_MESSAGE: 'docs(README): update contributors'
AVATAR_SHAPE: 'square'
find-roles:
runs-on: ubuntu-22.04
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- uses: actions/checkout@v4
- id: set-matrix
run: echo "matrix={\"roles\":[$(awk '/# Apps Start/{flag=1;next}/# Apps End/{flag=0}flag' sandbox.yml | awk '!/#/' | awk -F'[][]' '{print $2}' | tr '\n' ',' | sed 's/,*$//' | awk -F',' '{ for( i=1; i<=NF; i++ ) print $i }' | awk '{ gsub(/ /,""); print }'| sort -u | awk -vORS=, '{ print $1 }' | sed 's/,$/\n/')]}" >> $GITHUB_OUTPUT
install:
name: '${{ matrix.roles }}'
needs: [ansible-lint, check-entries, find-roles]
runs-on: ubuntu-22.04
strategy:
matrix: ${{ fromJson(needs.find-roles.outputs.matrix) }}
fail-fast: false
steps:
- uses: actions/checkout@v4
- name: Install Dependencies
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 3
shell: bash
command: curl https://raw.githubusercontent.com/saltyorg/sb/master/sb_install.sh --output sb_install.sh && sudo bash sb_install.sh -v && ansible --version
- name: Chown /srv/git
run: sudo chown -R runner:runner /srv/git
- name: Edit accounts.yml
run: cd /srv/git/saltbox && sed -i 's/seed/runner/g' accounts.yml
- name: Create, chown and chmod /tmp/ansible
run: sudo mkdir /tmp/ansible && sudo chown -R runner:runner /tmp/ansible && chmod 0777 /tmp/ansible
- name: Syntax Check
run: cd /srv/git/saltbox && sudo ansible-playbook saltbox.yml --syntax-check
- name: Install Saltbox Core
uses: nick-fields/retry@v3
with:
timeout_minutes: 30
max_attempts: 3
shell: bash
command: cd /srv/git/saltbox && sudo ansible-playbook saltbox.yml --tags "core" --skip-tags "settings" --extra-vars '{"continuous_integration":true}'
- name: Copy default configuration
run: cp -n defaults/ansible.cfg.default ansible.cfg && cp -n defaults/settings.yml.default settings.yml
- name: Install ${{ matrix.roles }}
uses: nick-fields/retry@v3
with:
timeout_minutes: 30
max_attempts: 3
shell: bash
command: sudo ansible-playbook sandbox.yml --tags "${{ matrix.roles }}" --skip-tags "settings" --extra-vars '{"continuous_integration":true}'
webhook:
name: 'webhook'
runs-on: self-hosted
needs: install
if: always() && github.event_name != 'pull_request' && github.event.repository.fork == false
steps:
- name: Determine Workflow Conclusion
run: |
max_attempts=5
page=1
success_count=0
failure_count=0
cancelled_count=0
skipped_count=0
null_count=0
while :; do
success=false
for attempt in $(seq 1 $max_attempts); do
echo "Attempt $attempt of $max_attempts for page $page"
echo "Fetching job conclusions for page: $page"
response=$(curl -sS -H "Authorization: token ${{ secrets.GH_TOKEN }}" \
"https://api.github.com/repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/jobs?page=$page&per_page=100")
if [ $? -eq 0 ]; then
echo "API Request successful."
echo "Processing job conclusions..."
job_conclusions=$(echo "$response" | jq -r '.jobs[].conclusion')
echo "Job conclusions: $job_conclusions"
IFS=$'\n'
for conclusion in $job_conclusions; do
echo "Processing conclusion: $conclusion"
case $conclusion in
success) ((success_count++)) ;;
failure) ((failure_count++)) ;;
cancelled) ((cancelled_count++)) ;;
skipped) ((skipped_count++)) ;;
null) ((null_count++)) ;;
esac
done
unset IFS
echo "Conclusion counts processed successfully."
success=true
break
else
echo "API Request failed, retrying in $((attempt * 2)) seconds..."
sleep $((attempt * 2))
fi
done
if [ "$success" = false ]; then
echo "Failed to fetch job conclusions after $max_attempts attempts."
echo "WORKFLOW_CONCLUSION=failure" >> $GITHUB_ENV
exit 0
fi
response_with_headers=$(curl -sS -I -H "Authorization: token ${{ secrets.GH_TOKEN }}" \
"https://api.github.com/repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/jobs?page=$((page+1))&per_page=100")
link_header=$(echo "$response_with_headers" | grep -i '^Link:' | tr -d '\r')
if echo "$link_header" | grep -q 'rel="next"'; then
echo "Found next page, proceeding..."
page=$((page + 1))
else
echo "No more pages to fetch, finalizing..."
break
fi
done
echo "Determining overall workflow conclusion..."
echo "Success: $success_count, Failure: $failure_count, Cancelled: $cancelled_count, Skipped: $skipped_count, Null: $null_count"
if [ $cancelled_count -gt 0 ]; then
echo "Some jobs were cancelled."
WORKFLOW_CONCLUSION="cancelled"
elif [ $failure_count -gt 0 ]; then
echo "Some jobs failed."
WORKFLOW_CONCLUSION="failure"
elif [ $success_count -gt 0 ] && [ $null_count -eq 0 ]; then
echo "All jobs succeeded."
WORKFLOW_CONCLUSION="success"
else
echo "Defaulting to failure due to uncertain job conclusions."
WORKFLOW_CONCLUSION="failure"
fi
echo "WORKFLOW_CONCLUSION=$WORKFLOW_CONCLUSION" >> $GITHUB_ENV
echo "Workflow conclusion determined: $WORKFLOW_CONCLUSION"
exit 0
- uses: sarisia/actions-status-discord@v1
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
status: ${{ env.WORKFLOW_CONCLUSION }}