Skip to content

Project: CT image based prediction model in head and neck cancer: contribution to MHub #581

Project: CT image based prediction model in head and neck cancer: contribution to MHub

Project: CT image based prediction model in head and neck cancer: contribution to MHub #581

name: Project Page Pull Request Creation
on:
issues:
types: [ labeled ]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
if: github.event.label.name == 'project:create'
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- name: Fetch the project issue info
id: project_issue
env:
GH_TOKEN: ${{ github.token }}
run: |
title=$(gh issue view ${{ github.event.issue.number }} --repo ${{ github.repository }} --json title --jq '.title')
echo "title [$title]"
# If any, remove"Project:" prefix
title=$(echo "$title" | sed 's/^Project:\s*//')
echo "title [$title]"
echo "title=$title" >> $GITHUB_OUTPUT
- name: Find project issue comment
uses: peter-evans/[email protected]
id: fc
with:
issue-number: ${{ github.event.issue.number }}
comment-author: 'github-actions[bot]'
body-includes: Project Page Pull Request Creation
- name: Create or update comment ⌛
id: couc
uses: peter-evans/create-or-update-comment@v3
with:
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ github.event.issue.number }}
body: |
## Project Page Pull Request Creation
:hourglass: **IN PROGRESS**: ![Project Page Pull Request Creation](${{ github.server_url }}/${{ github.repository }}/actions/workflows/project-page-pull-request.yml/badge.svg)
edit-mode: replace
- name: Extract event info
id: event_info
run: |
# TODO: Extract event name from "event:NAME" label
event_name="PW41_2024_MIT"
echo "name=$event_name" >> $GITHUB_OUTPUT
- uses: actions/checkout@v3
- name: Generate project directory name
id: project_directory
run: |
title=$(echo ${{ steps.project_issue.outputs.title }})
echo "title [$title]"
# Convert to title case
title_cased=$(echo "$title" | sed 's/.*/\L&/; s/[a-z]*/\u&/g')
echo "title_cased [$title_cased]"
# Sanitize string to use as a directory name
directory_name=$(echo "$title_cased" | tr -cs '[:alnum:]' '_' | sed 's/_//g')
echo "directory_name [$directory_name]"
echo "name=$directory_name" >> $GITHUB_OUTPUT
- name: Check if project already exists
id: check_project_exists
run: |
event_name=${{ steps.event_info.outputs.name }}
project_directory=${{ steps.event_info.outputs.name }}/Projects/${{ steps.project_directory.outputs.name }}
if [ -d "$project_directory" ]; then
echo "::error::Project already exist"
exit 1
fi
- name: Create or update comment 🛑
if: ${{ failure() && steps.check_project_exists.outcome == 'failure' }}
uses: peter-evans/create-or-update-comment@v3
with:
comment-id: ${{ steps.couc.outputs.comment-id }}
issue-number: ${{ github.event.issue.number }}
body: |
## Project Page Pull Request Creation
:stop_sign: **STOPPED**: Project already exists
edit-mode: replace
- name: Create project directory
run: |
event_name=${{ steps.event_info.outputs.name }}
directory_name=${{ steps.project_directory.outputs.name }}
mkdir $event_name/Projects/$directory_name
- name: Bulk issue body
id: bulk
env:
GH_TOKEN: ${{ github.token }}
run: |
body=$(gh issue view ${{ github.event.issue.number }} --repo ${{ github.repository }} --json body --jq '.body')
echo "$body" > ${{ runner.temp }}/bulk.txt
- name: Display bulk.txt
run: |
cat ${{ runner.temp }}/bulk.txt
- name: Split bulk
run: |
csplit ${{ runner.temp }}/bulk.txt \
'/^### Project Description/' \
'/^### Objective/' \
'/^### Approach and Plan/' \
'/^### Progress and Next Steps/' \
'/^### Illustrations/' \
'/^### Background and References/' \
-f ${{ runner.temp }}/project_pull_request_part_ -b "%02d.md"
- name: Cleanup files
run: |
cat ${{ runner.temp }}/project_pull_request_part_01.md | sed "1 d" > ${{ runner.temp }}/description.md
cat ${{ runner.temp }}/project_pull_request_part_02.md | sed "1 d" > ${{ runner.temp }}/objective.md
cat ${{ runner.temp }}/project_pull_request_part_03.md | sed "1 d" > ${{ runner.temp }}/approach.md
cat ${{ runner.temp }}/project_pull_request_part_04.md | sed "1 d" > ${{ runner.temp }}/progress.md
cat ${{ runner.temp }}/project_pull_request_part_05.md | sed "1 d" > ${{ runner.temp }}/illustrations.md
cat ${{ runner.temp }}/project_pull_request_part_06.md | sed "1 d" > ${{ runner.temp }}/background.md
- name: Display clean files
run: |
echo "Description:"
cat ${{ runner.temp }}/description.md
echo "Objective:"
cat ${{ runner.temp }}/objective.md
echo "Approach:"
cat ${{ runner.temp }}/approach.md
echo "Progress:"
cat ${{ runner.temp }}/progress.md
echo "Illustrations:"
cat ${{ runner.temp }}/illustrations.md
echo "Background:"
cat ${{ runner.temp }}/background.md
- name: Issue Forms Body Parser
id: parse
uses: zentered/[email protected]
- name: Extract issue fields
id: extract
run: |
echo ${{ toJSON(steps.parse.outputs.data) }} | \
jq --arg title "${{ steps.project_issue.outputs.title }}" \
--rawfile description "${{ runner.temp }}/description.md" \
--rawfile objective "${{ runner.temp }}/objective.md" \
--rawfile illustrations "${{ runner.temp }}/illustrations.md" \
--rawfile approach "${{ runner.temp }}/approach.md" \
--rawfile progress "${{ runner.temp }}/progress.md" \
--rawfile background "${{ runner.temp }}/background.md" '{
"title": $title,
"category": .category.text,
"presenter_location": .["presenter-location"].text,
"description": $description,
"objective": $objective,
"approach": $approach,
"progress": $progress,
"illustrations": $illustrations,
"background": $background,
"investigators": [.["key-investigators"].list[].text |
capture("(?<name>[^\\s]+(?:\\s[^\\s]+)*?)\\s*\\((?<affiliation>[^,]*)(?:,\\s*(?<country>[^)]*))?\\)") |
{name, affiliation: (.affiliation // ""), country: (.country // "")}],
}' > ${{ runner.temp }}/template-data.json
- name: Display template-data.json
run: |
cat ${{ runner.temp }}/template-data.json
- uses: actions/[email protected]
with:
python-version: "3.x"
- name: Install jinja2
run: |
python -m pip install jinja2
# Provide the cli interface
python -m pip install jinja2_cli
# Install the package providing the "to_yaml" and "regex_replace" filters.
python -m pip install jinja2-ansible-filters
- name: Generate Project README.md
run: |
jinja2 \
${{ steps.event_info.outputs.name }}/Projects/Template/README.md.j2 \
${{ runner.temp }}/template-data.json \
--format json \
-e "jinja2_ansible_filters.AnsibleCoreFiltersExtension" \
-o ${{ steps.event_info.outputs.name }}/Projects/${{ steps.project_directory.outputs.name }}/README.md
- uses: tibdex/github-app-token@v1
id: generate-token
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_PRIVATE_KEY }}
- name: Create Pull Request
id: cpr
uses: peter-evans/create-pull-request@v5
with:
token: ${{ steps.generate-token.outputs.token }}
commit-message: |
${{ steps.event_info.outputs.name }}: Add project ${{ steps.project_directory.outputs.name }}
committer: GitHub <[email protected]>
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
branch: ${{ steps.event_info.outputs.name }}/${{ steps.project_directory.outputs.name }}
delete-branch: true
title: Add project "${{ steps.project_issue.outputs.title }}" to "${{ steps.event_info.outputs.name }}"
body: |
Fixes #${{ github.event.issue.number }}
labels: |
project
event:${{ steps.event_info.outputs.name }}
- name: Create or update comment ❌
if: ${{ failure() && steps.check_project_exists.outcome == 'success' }}
uses: peter-evans/create-or-update-comment@v3
with:
comment-id: ${{ steps.couc.outputs.comment-id }}
issue-number: ${{ github.event.issue.number }}
body: |
## Project Page Pull Request Creation
:x: **FAILED**: See ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
edit-mode: replace
- name: Create or update comment ✅
if: ${{ success() }}
uses: peter-evans/create-or-update-comment@v3
with:
comment-id: ${{ steps.couc.outputs.comment-id }}
issue-number: ${{ github.event.issue.number }}
body: |
## Project Page Pull Request Creation
:white_check_mark: **COMPLETED**: See ${{ steps.cpr.outputs.pull-request-url }}
edit-mode: replace
- name: Remove "project:create" label
if: ${{ always() }}
uses: actions/github-script@v6
with:
script: |
github.rest.issues.removeLabel({
issue_number: context.payload.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: ["project:create"]
})