169 lines
6.5 KiB
YAML
169 lines
6.5 KiB
YAML
|
---
|
||
|
version: '3'
|
||
|
|
||
|
tasks:
|
||
|
create:
|
||
|
deps:
|
||
|
- :ci:commit:config
|
||
|
- :install:software:gh
|
||
|
- :install:software:jq
|
||
|
- :git:remotes
|
||
|
vars:
|
||
|
DESCRIPTION:
|
||
|
sh: jq -r '.description' package.json
|
||
|
GITHUB_SLUG:
|
||
|
sh: jq -r '.blueprint.repository.github' package.json | sed 's/.*\///'
|
||
|
HOMEPAGE:
|
||
|
sh: jq -r '.homepage' package.json
|
||
|
PROJECT_TYPE:
|
||
|
sh: if [[ $(jq -r '.private' package.json) == 'true' ]]; then echo '--private'; else echo '--public'; fi
|
||
|
run: once
|
||
|
log:
|
||
|
error: Error while ensuring GitHub repository exists
|
||
|
start: Checking for presence of GitHub repository and creating one if it does not exist
|
||
|
success: Ensure GitHub repository is present
|
||
|
cmds:
|
||
|
- cmd: |
|
||
|
gh repo create "{{.GITHUB_ORG}}/{{.GITHUB_SLUG}}" --enable-wiki={{.GITHUB_WIKI}} -y --description "{{.EMOJI_START}}{{.DESCRIPTION}}{{.EMOJI_END}}" \
|
||
|
--homepage "{{.HOMEPAGE}}" {{.PROJECT_TYPE}} > /dev/null
|
||
|
task --list > /dev/null || (echo "ERROR: Invalid Taskfiles!" && exit 1)
|
||
|
git add --all
|
||
|
git commit --quiet -m "✨ feat(birth): Birth" -n || true
|
||
|
git push github master
|
||
|
ignore_error: true
|
||
|
status:
|
||
|
- '[ -z "$GITHUB_TOKEN" ] || (test -d .git && gh repo view "{{.GITHUB_ORG}}/{{.GITHUB_SLUG}}" > /dev/null)'
|
||
|
preconditions:
|
||
|
- sh: '[ "{{.DESCRIPTION}}" != "null" ]'
|
||
|
msg: The `.description` in `package.json` must be set.
|
||
|
- sh: '[ "{{.GITHUB_SLUG}}" != "null" ]'
|
||
|
msg: The `.name` in `package.json` must be set.
|
||
|
- sh: '[ "{{.HOMEPAGE}}" != "null" ]'
|
||
|
msg: The `.homepage` in `package.json` must be set.
|
||
|
|
||
|
ids:
|
||
|
deps:
|
||
|
- :install:software:gh
|
||
|
- :install:software:jq
|
||
|
- create
|
||
|
vars:
|
||
|
CURRENT_PROJECT_ID:
|
||
|
sh: jq -r '.blueprint.github_id' package.json
|
||
|
PROJECT_ID:
|
||
|
sh: gh repo view --json id | jq -r '.id'
|
||
|
log:
|
||
|
error: Failed to add GitHub project ID to package.json
|
||
|
start: Saving GitHub project ID to package.json
|
||
|
success: Added GitHub project ID to package.json
|
||
|
cmds:
|
||
|
- TMP="$(mktemp)" && jq --arg projectId "{{.PROJECT_ID}}" '.blueprint.github_id = $projectId' package.json > "$TMP" && mv "$TMP" package.json
|
||
|
status:
|
||
|
- '[[ "{{.CURRENT_PROJECT_ID}}" == "{{.PROJECT_ID}}" ]]'
|
||
|
|
||
|
ssh-keys:
|
||
|
deps:
|
||
|
- :install:software:gh
|
||
|
- :install:software:jq
|
||
|
cmds:
|
||
|
- .config/log info 'Clearing GitLab SSH keys'
|
||
|
- |
|
||
|
ACCEPT_HEADER="Accept: application/vnd.github+json"
|
||
|
GH_KEYS_URL="https://api.github.com/user/keys"
|
||
|
KEYIDS="$(curl -sSL -H "$ACCEPT_HEADER" -H "Authorization: token $GITHUB_TOKEN" "$GH_KEYS_URL" | jq '.[].id')"
|
||
|
for KEYID in $KEYIDS; do
|
||
|
curl -H "$ACCEPT_HEADER" -H "Authorization: token $GITHUB_TOKEN" -X DELETE "$GH_KEYS_URL/$KEYID"
|
||
|
done
|
||
|
- .config/log start 'Syncing SSH keys with GitHub'
|
||
|
- |
|
||
|
for KEY in `ls $HOME/.ssh/*.pub`; do
|
||
|
TITLE="$(cat $KEY | sed 's/\(.*\=\) \(.*\)$/\2/')"
|
||
|
gh ssh-key add $KEY -t "$TITLE"
|
||
|
done
|
||
|
- .config/log success 'Finished syncing SSH keys with GitHub'
|
||
|
preconditions:
|
||
|
- sh: '[ -n "$GITHUB_TOKEN" ]'
|
||
|
msg: The GITHUB_TOKEN must be set to a personal access token.
|
||
|
|
||
|
update:
|
||
|
run: once
|
||
|
cmds:
|
||
|
- task: update:deps
|
||
|
status:
|
||
|
- '[ -z "$GITHUB_TOKEN" ]'
|
||
|
|
||
|
update:deps:
|
||
|
deps:
|
||
|
- update:meta
|
||
|
- ids
|
||
|
- variables
|
||
|
|
||
|
update:meta:
|
||
|
deps:
|
||
|
- :install:software:gh
|
||
|
- :install:software:jq
|
||
|
- create
|
||
|
vars:
|
||
|
DESCRIPTION:
|
||
|
sh: jq -r '.description' package.json
|
||
|
GITHUB_SLUG:
|
||
|
sh: jq -r '.blueprint.repository.github' package.json | sed 's/.*\///'
|
||
|
HOMEPAGE:
|
||
|
sh: jq -r '.homepage' package.json
|
||
|
PRIVATE:
|
||
|
sh: jq -r '.private' package.json | sed 's/null/false/'
|
||
|
log:
|
||
|
error: Error while updating GitHub repository metadata
|
||
|
start: Updating GitHub project metadata
|
||
|
success: Updated GitHub repository metadata
|
||
|
cmds:
|
||
|
- |
|
||
|
OPTIONAL_TAGS="$(jq '.keywords' .config/common-keywords.json)"
|
||
|
TOPICS="$(jq '.keywords' package.json | sed 's/null/[]/')"
|
||
|
TOPICS_LENGTH="$(jq -r '.keywords | length' package.json)"
|
||
|
if [ ! -z "$GITHUB_TOKEN" ]; then
|
||
|
gh api -X PATCH repos/{{.GITHUB_ORG}}/{{.GITHUB_SLUG}} -f description="{{.EMOJI_START}}{{.DESCRIPTION}}{{.EMOJI_END}}" -f homepage="{{.HOMEPAGE}}" \
|
||
|
-f has_issues={{.GITHUB_ISSUES}} -f has_wiki={{.GITHUB_WIKI}} -f private="{{.PRIVATE}}" --silent
|
||
|
.config/log success 'Ensured GitHub metadata is up-to-date'
|
||
|
RESULT="$TOPICS"
|
||
|
if [ "$TOPICS_LENGTH" -gt 20 ]; then
|
||
|
function updateList() {
|
||
|
REMOVE_KEY="$(jq -n --argjson optional "$OPTIONAL_TAGS" '$optional['"$1"']')"
|
||
|
RESULT="$(jq -n --argjson remove "$REMOVE_KEY" --argjson jq "$RESULT" '$jq | del(.[] | select(. == $remove))')"
|
||
|
}
|
||
|
LOOP_COUNT="$((TOPICS_LENGTH-20))"
|
||
|
for i in $(seq "$LOOP_COUNT"); do
|
||
|
updateList "$i"
|
||
|
done
|
||
|
fi
|
||
|
MINIMIZED_TOPICS="$(jq -n --argjson tags "$RESULT" '$tags | .[]' | xargs | sed 's/ /","/g' | sed 's/^/"/' | sed 's/$/"/')"
|
||
|
if [[ "$MINIMIZED_TOPICS" != '""' ]]; then
|
||
|
curl -s -X PUT -H "Accept: application/vnd.github.mercy-preview+json" -u "{{.GITHUB_ORG}}:$GITHUB_TOKEN" \
|
||
|
'https://api.github.com/repos/{{.GITHUB_ORG}}/{{.GITHUB_SLUG}}/topics' -d '{"names":['"$MINIMIZED_TOPICS"']}' > /dev/null
|
||
|
.config/log success 'Updated GitHub topics successfully'
|
||
|
fi
|
||
|
else
|
||
|
.config/log warn 'The `GITHUB_TOKEN` environment variable is not set so the GitHub repository cannot be updated via the API.'
|
||
|
fi
|
||
|
sources:
|
||
|
- .config/common-keywords.json
|
||
|
- .variables.json
|
||
|
- package.json
|
||
|
preconditions:
|
||
|
- sh: '[ "{{.DESCRIPTION}}" != "null" ]'
|
||
|
msg: The `.description` in `package.json` must be set.
|
||
|
- sh: '[ "{{.HOMEPAGE}}" != "null" ]'
|
||
|
msg: The `.homepage` in `package.json` must be set.
|
||
|
|
||
|
variables:
|
||
|
deps:
|
||
|
- :install:software:gh
|
||
|
- create
|
||
|
log:
|
||
|
error: Error setting GitHub Actions Ansible Galaxy token
|
||
|
start: Setting GitHub Actions Ansible Galaxy token
|
||
|
success: GitHub Actions Ansible Galaxy token set
|
||
|
cmds:
|
||
|
- gh secret set ANSIBLE_GALAXY_TOKEN -b "$ANSIBLE_GALAXY_TOKEN"
|
||
|
status:
|
||
|
- '[ -z "$GITHUB_TOKEN" ] || [ -z "$ANSIBLE_GALAXY_TOKEN" ] || [ "{{.REPOSITORY_TYPE}}" != "ansible" ]'
|