From 234d0eeda8f0f014454e7f7fd0587478c77773a5 Mon Sep 17 00:00:00 2001 From: John Boyes <154404+johnboyes@users.noreply.github.com> Date: Mon, 15 Feb 2021 11:25:40 +0000 Subject: [PATCH 1/6] Specify internal employee project visibility --- .github/workflows/functional-test.yml | 15 +++++- .github/workflows/reviewdog.yml | 2 +- requirements.txt | 1 + specs/example.spec | 33 ------------- specs/group_membership.spec | 8 ++++ specs/groups.spec | 10 ++++ specs/project_visibility.spec | 25 ++++++++++ step_impl/step_impl.py | 68 +++++++++++++++------------ 8 files changed, 97 insertions(+), 65 deletions(-) delete mode 100644 specs/example.spec create mode 100644 specs/group_membership.spec create mode 100644 specs/groups.spec create mode 100644 specs/project_visibility.spec diff --git a/.github/workflows/functional-test.yml b/.github/workflows/functional-test.yml index 04573a1..0a467da 100644 --- a/.github/workflows/functional-test.yml +++ b/.github/workflows/functional-test.yml @@ -24,14 +24,25 @@ jobs: with: python-version: 3.8.6 + - name: Install Python dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Install Gauge uses: getgauge/setup-gauge@master with: gauge-version: master - gauge-plugins: python, html-report + gauge-plugins: python, html-report, screenshot - name: FTs - run: gauge run specs + env: + JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }} + JIRA_ADMIN_USERNAME: ${{ secrets.JIRA_ADMIN_USERNAME }} + JIRA_ADMIN_PASSWORD: ${{ secrets.JIRA_ADMIN_PASSWORD }} + INTERNAL_EMPLOYEE_USERNAME: ${{ secrets.INTERNAL_EMPLOYEE_USERNAME }} + INTERNAL_EMPLOYEE_PASSWORD: ${{ secrets.INTERNAL_EMPLOYEE_PASSWORD }} + run: gauge run specs --tags \!in-progress - name: Upload logs uses: actions/upload-artifact@v2.2.2 diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml index fb66ea6..fbbe4f2 100644 --- a/.github/workflows/reviewdog.yml +++ b/.github/workflows/reviewdog.yml @@ -82,7 +82,7 @@ jobs: **/*.spec **/*.txt language: en - disabled_rules: "DOUBLE_PUNCTUATION,WHITESPACE_RULE,EN_QUOTES,DASH_RULE,WORD_CONTAINS_UNDERSCORE,UPPERCASE_SENTENCE_START,ARROWS,COMMA_PARENTHESIS_WHITESPACE,UNLIKELY_OPENING_PUNCTUATION,SENTENCE_WHITESPACE,CURRENCY,EN_UNPAIRED_BRACKETS,PHRASE_REPETITION,PUNCTUATION_PARAGRAPH_END,METRIC_UNITS_EN_US,ENGLISH_WORD_REPEAT_BEGINNING_RULE,GITHUB" # yamllint disable-line + disabled_rules: "DOUBLE_PUNCTUATION,WHITESPACE_RULE,EN_QUOTES,DASH_RULE,WORD_CONTAINS_UNDERSCORE,UPPERCASE_SENTENCE_START,ARROWS,COMMA_PARENTHESIS_WHITESPACE,UNLIKELY_OPENING_PUNCTUATION,SENTENCE_WHITESPACE,CURRENCY,EN_UNPAIRED_BRACKETS,PHRASE_REPETITION,PUNCTUATION_PARAGRAPH_END,METRIC_UNITS_EN_US,ENGLISH_WORD_REPEAT_BEGINNING_RULE,GITHUB,A_NNS" # yamllint disable-line black: # Black is an opinionated Python linter name: runner / black formatter diff --git a/requirements.txt b/requirements.txt index dccbded..5d80d03 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ getgauge +jira diff --git a/specs/example.spec b/specs/example.spec deleted file mode 100644 index 80886a6..0000000 --- a/specs/example.spec +++ /dev/null @@ -1,33 +0,0 @@ -# Specification Heading - -This is an executable specification file. This file follows Markdown syntax. -Every heading in this file denotes a scenario. Every bulleted point denotes a step. - -To execute this specification, run - - gauge run specs - - -* Vowels in English language are "aeiou". - -## Vowel counts in single word - -tags: single word - -* The word "gauge" has "3" vowels. - - -## Vowel counts in multiple word - -This is the second scenario in this specification - -Here's a step that takes a table - -* Almost all words have vowels - |Word |Vowel Count| - |------|-----------| - |Gauge |3 | - |Mingle|2 | - |Snap |1 | - |GoCD |1 | - |Rhythm|0 | diff --git a/specs/group_membership.spec b/specs/group_membership.spec new file mode 100644 index 0000000..325e6b1 --- /dev/null +++ b/specs/group_membership.spec @@ -0,0 +1,8 @@ +# Group membership + +Our implementation of group membership rules is based on +https://www.atlassian.com/blog/archives/share-jira-external-partners + +## All employees are members of the internal employees group + +* An internal employee is a member of the internal employees group diff --git a/specs/groups.spec b/specs/groups.spec new file mode 100644 index 0000000..ad59b7f --- /dev/null +++ b/specs/groups.spec @@ -0,0 +1,10 @@ +# Groups + +Our groups are based on the ideas in +https://www.atlassian.com/blog/archives/share-jira-external-partners + +## There is an internal employees group + +This group is for all internal employees who currently need access to this Jira instance + +* There is a jira-internal-employee-users group diff --git a/specs/project_visibility.spec b/specs/project_visibility.spec new file mode 100644 index 0000000..9e51969 --- /dev/null +++ b/specs/project_visibility.spec @@ -0,0 +1,25 @@ +# Project visibility + +Our implementation of project visibility rules is based on +https://www.atlassian.com/blog/archives/share-jira-external-partners + +## All internal employees can see all projects + +This is in line with our [InnerSource](https://about.gitlab.com/solutions/innersource/) principles. + +* An internal employee can see all projects + +## All external partners can only see the projects they are currently working on + +tags: in-progress + +Question: what about individual contractors, as opposed to external partner companies? + +* Not implemented yet + +## Closed projects are no longer viewable by any external partners + +tags: in-progress + +* Not implemented yet + diff --git a/step_impl/step_impl.py b/step_impl/step_impl.py index a7a0e08..4645da1 100644 --- a/step_impl/step_impl.py +++ b/step_impl/step_impl.py @@ -1,45 +1,55 @@ from getgauge.python import step, before_scenario, Messages +from jira import JIRA +import os -vowels = ["a", "e", "i", "o", "u"] +def jira_admin(): + return jira(os.getenv("JIRA_ADMIN_USERNAME"), os.getenv("JIRA_ADMIN_PASSWORD")) -def number_of_vowels(word): - return len([elem for elem in list(word) if elem in vowels]) +def internal_employee(): + return jira( + os.getenv("INTERNAL_EMPLOYEE_USERNAME"), os.getenv("INTERNAL_EMPLOYEE_PASSWORD") + ) -# -------------------------- -# Gauge step implementations -# -------------------------- +def jira(username, password): + return JIRA( + auth=(username, password), + options={"server": os.getenv("JIRA_BASE_URL")}, + ) -@step("The word has vowels.") -def assert_no_of_vowels_in(word, number): - assert str(number) == str(number_of_vowels(word)) +def is_group(group_name): + return len(jira_admin().group_members(group_name)) >= 0 -@step("Vowels in English language are .") -def assert_default_vowels(given_vowels): - Messages.write_message("Given vowels are {0}".format(given_vowels)) - assert given_vowels == "".join(vowels) +def is_internal_employee_in_internal_employees_group(): + internal_employees = jira_admin().group_members("jira-internal-employee_users") + return bool( + [ + emp + for emp in internal_employees.values() + if (emp["name"] == os.getenv("INTERNAL_EMPLOYEE_USERNAME")) + ] + ) -@step("Almost all words have vowels ") -def assert_words_vowel_count(table): - actual = [ - str(number_of_vowels(word)) - for word in table.get_column_values_with_name("Word") - ] - expected = [ - str(count) for count in table.get_column_values_with_name("Vowel Count") - ] - assert expected == actual +@step("An internal employee can see all projects") +def an_internal_employee_can_see_all_projects(): + assert len(jira_admin().projects()) == len(internal_employee().projects()) -# --------------- -# Execution Hooks -# --------------- +@step("An internal employee is a member of the internal employees group") +def an_internal_employee_is_a_member_of_the_internal_employees_group(): + assert is_internal_employee_in_internal_employees_group() -@before_scenario() -def before_scenario_hook(): - assert "".join(vowels) == "aeiou" + +@step("There is a jira-internal-employee-users group") +def there_is_a_jira_internal_employee_users_group(): + assert is_group("jira-internal-employee_users") + + +@step("Not implemented yet") +def not_implemented_yet(): + assert False, "Add implementation code" From 2c91a5766dbb0da52f25f3f041092bdbe3e7a0fb Mon Sep 17 00:00:00 2001 From: John Boyes <154404+johnboyes@users.noreply.github.com> Date: Wed, 17 Feb 2021 06:59:26 +0000 Subject: [PATCH 2/6] Extract Jira class --- step_impl/jira.py | 27 +++++++++++++++++++++++++++ step_impl/step_impl.py | 34 ++++++---------------------------- 2 files changed, 33 insertions(+), 28 deletions(-) create mode 100644 step_impl/jira.py diff --git a/step_impl/jira.py b/step_impl/jira.py new file mode 100644 index 0000000..4276056 --- /dev/null +++ b/step_impl/jira.py @@ -0,0 +1,27 @@ +from getgauge.python import before_suite +from jira import JIRA +import os + + +class Jira: + def __init__(self, username, password): + self.jira = JIRA( + auth=(username, password), + options={"server": os.getenv("JIRA_BASE_URL")}, + ) + + def has_group(self, group_name): + return len(self.jira.group_members(group_name)) >= 0 + + def projects(self): + return self.jira.projects() + + def is_internal_employee_in_internal_employees_group(self): + internal_employees = self.jira.group_members("jira-internal-employee_users") + return bool( + [ + emp + for emp in internal_employees.values() + if (emp["name"] == os.getenv("INTERNAL_EMPLOYEE_USERNAME")) + ] + ) diff --git a/step_impl/step_impl.py b/step_impl/step_impl.py index 4645da1..afd12ef 100644 --- a/step_impl/step_impl.py +++ b/step_impl/step_impl.py @@ -1,40 +1,18 @@ -from getgauge.python import step, before_scenario, Messages -from jira import JIRA +from getgauge.python import step +from step_impl.jira import Jira import os def jira_admin(): - return jira(os.getenv("JIRA_ADMIN_USERNAME"), os.getenv("JIRA_ADMIN_PASSWORD")) + return Jira(os.getenv("JIRA_ADMIN_USERNAME"), os.getenv("JIRA_ADMIN_PASSWORD")) def internal_employee(): - return jira( + return Jira( os.getenv("INTERNAL_EMPLOYEE_USERNAME"), os.getenv("INTERNAL_EMPLOYEE_PASSWORD") ) -def jira(username, password): - return JIRA( - auth=(username, password), - options={"server": os.getenv("JIRA_BASE_URL")}, - ) - - -def is_group(group_name): - return len(jira_admin().group_members(group_name)) >= 0 - - -def is_internal_employee_in_internal_employees_group(): - internal_employees = jira_admin().group_members("jira-internal-employee_users") - return bool( - [ - emp - for emp in internal_employees.values() - if (emp["name"] == os.getenv("INTERNAL_EMPLOYEE_USERNAME")) - ] - ) - - @step("An internal employee can see all projects") def an_internal_employee_can_see_all_projects(): assert len(jira_admin().projects()) == len(internal_employee().projects()) @@ -42,12 +20,12 @@ def an_internal_employee_can_see_all_projects(): @step("An internal employee is a member of the internal employees group") def an_internal_employee_is_a_member_of_the_internal_employees_group(): - assert is_internal_employee_in_internal_employees_group() + assert jira_admin().is_internal_employee_in_internal_employees_group() @step("There is a jira-internal-employee-users group") def there_is_a_jira_internal_employee_users_group(): - assert is_group("jira-internal-employee_users") + assert jira_admin().has_group("jira-internal-employee_users") @step("Not implemented yet") From e9ae516bbaceddb69b8c7b4d51bdb9ed78fb6d38 Mon Sep 17 00:00:00 2001 From: John Boyes <154404+johnboyes@users.noreply.github.com> Date: Wed, 17 Feb 2021 10:28:39 +0000 Subject: [PATCH 3/6] Extract bot class --- step_impl/bot.py | 18 ++++++++++++++++++ step_impl/jira.py | 1 - step_impl/step_impl.py | 19 ++++--------------- 3 files changed, 22 insertions(+), 16 deletions(-) create mode 100644 step_impl/bot.py diff --git a/step_impl/bot.py b/step_impl/bot.py new file mode 100644 index 0000000..d081cb5 --- /dev/null +++ b/step_impl/bot.py @@ -0,0 +1,18 @@ +from getgauge.python import before_suite +from step_impl.jira import Jira +import os + + +class Bot(object): + jira_admin = None + internal_employee = None + + @before_suite + def init(self): + Bot.jira_admin = Jira( + os.getenv("JIRA_ADMIN_USERNAME"), os.getenv("JIRA_ADMIN_PASSWORD") + ) + Bot.internal_employee = Jira( + os.getenv("INTERNAL_EMPLOYEE_USERNAME"), + os.getenv("INTERNAL_EMPLOYEE_PASSWORD"), + ) diff --git a/step_impl/jira.py b/step_impl/jira.py index 4276056..9ade141 100644 --- a/step_impl/jira.py +++ b/step_impl/jira.py @@ -1,4 +1,3 @@ -from getgauge.python import before_suite from jira import JIRA import os diff --git a/step_impl/step_impl.py b/step_impl/step_impl.py index afd12ef..a2bb416 100644 --- a/step_impl/step_impl.py +++ b/step_impl/step_impl.py @@ -1,31 +1,20 @@ from getgauge.python import step -from step_impl.jira import Jira -import os - - -def jira_admin(): - return Jira(os.getenv("JIRA_ADMIN_USERNAME"), os.getenv("JIRA_ADMIN_PASSWORD")) - - -def internal_employee(): - return Jira( - os.getenv("INTERNAL_EMPLOYEE_USERNAME"), os.getenv("INTERNAL_EMPLOYEE_PASSWORD") - ) +from step_impl.bot import Bot @step("An internal employee can see all projects") def an_internal_employee_can_see_all_projects(): - assert len(jira_admin().projects()) == len(internal_employee().projects()) + assert len(Bot.internal_employee.projects()) == len(Bot.jira_admin.projects()) @step("An internal employee is a member of the internal employees group") def an_internal_employee_is_a_member_of_the_internal_employees_group(): - assert jira_admin().is_internal_employee_in_internal_employees_group() + assert Bot.jira_admin.is_internal_employee_in_internal_employees_group() @step("There is a jira-internal-employee-users group") def there_is_a_jira_internal_employee_users_group(): - assert jira_admin().has_group("jira-internal-employee_users") + assert Bot.jira_admin.has_group("jira-internal-employee_users") @step("Not implemented yet") From c83460350a076a0dab0aeca641c4b7767486ce20 Mon Sep 17 00:00:00 2001 From: John Boyes <154404+johnboyes@users.noreply.github.com> Date: Wed, 17 Feb 2021 14:19:58 +0000 Subject: [PATCH 4/6] Refactor group membership method --- step_impl/bot.py | 2 ++ step_impl/jira.py | 13 ++++--------- step_impl/step_impl.py | 10 ++++++---- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/step_impl/bot.py b/step_impl/bot.py index d081cb5..3b5b5cb 100644 --- a/step_impl/bot.py +++ b/step_impl/bot.py @@ -2,6 +2,8 @@ from step_impl.jira import Jira import os +INTERNAL_EMPLOYEES_GROUP = "jira-internal-employee_users" + class Bot(object): jira_admin = None diff --git a/step_impl/jira.py b/step_impl/jira.py index 9ade141..3af3b83 100644 --- a/step_impl/jira.py +++ b/step_impl/jira.py @@ -8,6 +8,7 @@ def __init__(self, username, password): auth=(username, password), options={"server": os.getenv("JIRA_BASE_URL")}, ) + self.username = username def has_group(self, group_name): return len(self.jira.group_members(group_name)) >= 0 @@ -15,12 +16,6 @@ def has_group(self, group_name): def projects(self): return self.jira.projects() - def is_internal_employee_in_internal_employees_group(self): - internal_employees = self.jira.group_members("jira-internal-employee_users") - return bool( - [ - emp - for emp in internal_employees.values() - if (emp["name"] == os.getenv("INTERNAL_EMPLOYEE_USERNAME")) - ] - ) + def is_user_in_group(self, user, group): + group_members = self.jira.group_members(group) + return bool([emp for emp in group_members.values() if (emp["name"] == user)]) diff --git a/step_impl/step_impl.py b/step_impl/step_impl.py index a2bb416..42df42b 100644 --- a/step_impl/step_impl.py +++ b/step_impl/step_impl.py @@ -1,20 +1,22 @@ from getgauge.python import step -from step_impl.bot import Bot +from step_impl.bot import Bot, INTERNAL_EMPLOYEES_GROUP @step("An internal employee can see all projects") def an_internal_employee_can_see_all_projects(): - assert len(Bot.internal_employee.projects()) == len(Bot.jira_admin.projects()) + assert len(Bot.internal_employee.projects()) == len(Bot.jira_admin.projects()) @step("An internal employee is a member of the internal employees group") def an_internal_employee_is_a_member_of_the_internal_employees_group(): - assert Bot.jira_admin.is_internal_employee_in_internal_employees_group() + assert Bot.jira_admin.is_user_in_group( + Bot.internal_employee.username, INTERNAL_EMPLOYEES_GROUP + ) @step("There is a jira-internal-employee-users group") def there_is_a_jira_internal_employee_users_group(): - assert Bot.jira_admin.has_group("jira-internal-employee_users") + assert Bot.jira_admin.has_group(INTERNAL_EMPLOYEES_GROUP) @step("Not implemented yet") From 12103117d7c78f94aac1d8ae04db650c0b3453cd Mon Sep 17 00:00:00 2001 From: John Boyes <154404+johnboyes@users.noreply.github.com> Date: Thu, 18 Feb 2021 08:34:08 +0000 Subject: [PATCH 5/6] Refactor all env vars into Bot file --- step_impl/bot.py | 14 +++++++++----- step_impl/jira.py | 5 ++--- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/step_impl/bot.py b/step_impl/bot.py index 3b5b5cb..1221657 100644 --- a/step_impl/bot.py +++ b/step_impl/bot.py @@ -2,6 +2,11 @@ from step_impl.jira import Jira import os +JIRA_BASE_URL = os.getenv("JIRA_BASE_URL") +JIRA_ADMIN_USERNAME = os.getenv("JIRA_ADMIN_USERNAME") +JIRA_ADMIN_PASSWORD = os.getenv("JIRA_ADMIN_PASSWORD") +INTERNAL_EMPLOYEE_USERNAME = os.getenv("INTERNAL_EMPLOYEE_USERNAME") +INTERNAL_EMPLOYEE_PASSWORD = os.getenv("INTERNAL_EMPLOYEE_PASSWORD") INTERNAL_EMPLOYEES_GROUP = "jira-internal-employee_users" @@ -11,10 +16,9 @@ class Bot(object): @before_suite def init(self): - Bot.jira_admin = Jira( - os.getenv("JIRA_ADMIN_USERNAME"), os.getenv("JIRA_ADMIN_PASSWORD") - ) + Bot.jira_admin = Jira(JIRA_BASE_URL, JIRA_ADMIN_USERNAME, JIRA_ADMIN_PASSWORD) Bot.internal_employee = Jira( - os.getenv("INTERNAL_EMPLOYEE_USERNAME"), - os.getenv("INTERNAL_EMPLOYEE_PASSWORD"), + JIRA_BASE_URL, + INTERNAL_EMPLOYEE_USERNAME, + INTERNAL_EMPLOYEE_PASSWORD, ) diff --git a/step_impl/jira.py b/step_impl/jira.py index 3af3b83..0874e79 100644 --- a/step_impl/jira.py +++ b/step_impl/jira.py @@ -1,12 +1,11 @@ from jira import JIRA -import os class Jira: - def __init__(self, username, password): + def __init__(self, base_url, username, password): self.jira = JIRA( auth=(username, password), - options={"server": os.getenv("JIRA_BASE_URL")}, + options={"server": base_url}, ) self.username = username From deae730ca34920c2c3236146bc4541bb064a8e1a Mon Sep 17 00:00:00 2001 From: John Boyes <154404+johnboyes@users.noreply.github.com> Date: Wed, 24 Feb 2021 08:20:08 +0000 Subject: [PATCH 6/6] Update contributing guidelines --- CONTRIBUTING.md | 66 ++++++++++++++++++++++++++++--------------------- README.md | 4 +-- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a2ffc47..e08d26d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,41 +3,20 @@ Firstly thanks for thinking of contributing - the project is [open source](https://opensource.guide/how-to-contribute/) and all contributions are very welcome :slightly_smiling_face: :boom: :thumbsup: -[How to make a contribution](#how-to-make-a-contribution) - -[Local development](#local-development) - -* [Visual Studio Code](#visual-studio-code) -* [Codespaces](#codespaces) -* [Tools and technologies](#tools-and-technologies) - -## How to make a contribution - -* [Create a pull request](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests). -The project uses the _[fork and pull model](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-collaborative-development-models)_: - * [Fork the project](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/working-with-forks) - * Make your changes on your fork - * Write a [good commit message(s)](https://chris.beams.io/posts/git-commit/) for your changes - * [Create the pull request for your changes](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/proposing-changes-to-your-work-with-pull-requests) - ## Local development -### Visual Studio Code +### VS Code -The easiest way to set up your development environment (unless you have [Codespaces](#codespaces), which is even easier) -is to use [Visual Studio Code](https://code.visualstudio.com/)'s [Remote Containers](https://code.visualstudio.com/docs/remote/containers) -functionality: +The preferred development environment is on a [Visual Studio Code](https://code.visualstudio.com/) [Remote Container](https://code.visualstudio.com/docs/remote/containers) +(as this comes fully loaded with the right software and code linters etc). * [System requirements](https://code.visualstudio.com/docs/remote/containers#_system-requirements) + * [Visual Studio Code](https://code.visualstudio.com/) + * [Docker Desktop](https://www.docker.com/products/docker-desktop) * [Fork the project](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/working-with-forks) -* [Open the local project folder in a container](https://code.visualstudio.com/docs/remote/containers#_quick-start-open-an-existing-folder-in-a-container) -* Everything will then be setup for you. +* [Open the forked repo (or a specific branch or pull request) in a VS Code container](https://code.visualstudio.com/docs/remote/containers#_quick-start-open-a-git-repository-or-github-pr-in-an-isolated-container-volume) -### Codespaces - -If you have access to [GitHub Codespaces](https://github.com/features/codespaces/) (which allows full remote -development from within your browser) then all you need to do is [fork the project](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/working-with-forks) -and open it in Codespaces - easy! + The remote VS Code container will start with all the software you need installed and configured correctly. ### Tools and technologies @@ -47,6 +26,37 @@ and open it in Codespaces - easy! * [Flake8](https://flake8.pycqa.org/) for Python style checks * [GitHub Actions](https://docs.github.com/en/actions) for CI +### Environment configuration + +You will need to set up some Gauge properties: + +1. Create the following file: `env/default/secrets.properties` +2. Populate the file with: + + ```lang-default + JIRA_BASE_URL = + JIRA_ADMIN_USERNAME = + JIRA_ADMIN_PASSWORD = + INTERNAL_EMPLOYEE_USERNAME = + INTERNAL_EMPLOYEE_PASSWORD = + ``` + +3. Ask [a maintainer](.github/CODEOWNERS) for the values for the above configuration properties and populate them in + the file you just created. + +### Running the specs + +`gauge run --tags \!in-progress` + +## How to make a contribution + +* [Create a pull request](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests). +The project uses the _[fork and pull model](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-collaborative-development-models)_: + * [Fork the project](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/working-with-forks) + * Make your changes on your fork + * Write a [good commit message(s)](https://chris.beams.io/posts/git-commit/) for your changes + * [Create the pull request for your changes](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/proposing-changes-to-your-work-with-pull-requests) + ## Updating dependencies See the [DEPENDENCIES.md](.github/DEPENDENCIES.md) diff --git a/README.md b/README.md index f670f58..53af95f 100644 --- a/README.md +++ b/README.md @@ -13,11 +13,11 @@ Verifies a Jira configuration through executable specifications +[How to run the specs](CONTRIBUTING.md#local-development) + ## Suggestions / bug reports / contributions The project is [open source](https://opensource.guide/how-to-contribute/) and all contributions are very welcome :slightly_smiling_face: :boom: :thumbsup: -* [How to report a bug or suggest a new feature](CONTRIBUTING.md#how-to-report-a-bug-or-suggest-a-new-feature) - * [How to contribute](CONTRIBUTING.md#how-to-make-a-contribution)