Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,22 @@
{
"name": "AtlassianPS Dev Environment - Jekyll",
"image": "mcr.microsoft.com/devcontainers/ruby:3.3-bookworm",
"forwardPorts": [
4000,
35729
],
"portsAttributes": {
"4000": {
"label": "Jekyll site"
},
"35729": {
"label": "LiveReload"
}
},
"features": {
"ghcr.io/devcontainers-contrib/features/zsh-plugins:0": {}
},
"postCreateCommand": ".devcontainer/post-create.sh",
"postCreateCommand": "bash .devcontainer/post-create.sh",
"customizations": {
"vscode": {
"settings": {}
Expand Down
24 changes: 15 additions & 9 deletions .devcontainer/post-create.sh
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
#!/usr/bin/env sh
#!/usr/bin/env bash
set -euo pipefail

# Use Ruby 3.3 for Jekyll
repo_root="$(cd "$(dirname "$0")/.." && pwd)"
cd "$repo_root"

# Install the version of Bundler specified in the Gemfile.lock
if [ -f Gemfile.lock ] && grep "BUNDLED WITH" Gemfile.lock > /dev/null; then
cat Gemfile.lock | tail -n 2 | grep -C2 "BUNDLED WITH" | tail -n 1 | xargs gem install bundler -v
echo "Preparing Jekyll devcontainer dependencies..."

# Install the Bundler version pinned in Gemfile.lock when present.
if [[ -f Gemfile.lock ]]; then
bundler_version="$(awk '/^BUNDLED WITH$/ { getline; gsub(/^[[:space:]]+/, "", $0); print $0; exit }' Gemfile.lock)"
if [[ -n "${bundler_version:-}" ]]; then
gem install bundler -v "$bundler_version"
fi
fi

# If there's a Gemfile, then run `bundle install`
# It's assumed that the Gemfile will install jekyll too
if [ -f Gemfile ]; then
if [[ -f Gemfile ]]; then
bundle install
fi

bundle exec jekyll serve --force-polling
echo "Devcontainer is ready."
echo "Run: bundle exec jekyll serve --host 0.0.0.0 --livereload --force-polling"
82 changes: 82 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ on:
branches: [master]
pull_request:
branches: [master]
schedule:
- cron: "17 4 * * *"
workflow_dispatch:

permissions:
Expand Down Expand Up @@ -34,6 +36,86 @@ jobs:
- name: Setup Pages
uses: actions/configure-pages@v5

- name: Generate contributors data
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const path = require('path');
const owner = 'AtlassianPS';

const payload = {
generated_at: new Date().toISOString(),
org: owner,
repos_count: 0,
repos: [],
contributors: [],
error: null
};

try {
const repos = await github.paginate(github.rest.repos.listForOrg, {
org: owner,
type: 'public',
per_page: 100
});

const activeRepos = repos.filter((repo) => !repo.fork && !repo.archived);
const contributorMap = new Map();

for (const repo of activeRepos) {
core.info(`Collecting contributors for ${repo.name}`);
const contributors = await github.paginate(github.rest.repos.listContributors, {
owner,
repo: repo.name,
per_page: 100
});

for (const contributor of contributors) {
if (!contributor.login || contributor.login.endsWith('[bot]')) {
continue;
}

const existing = contributorMap.get(contributor.login) || {
login: contributor.login,
html_url: contributor.html_url,
avatar_url: contributor.avatar_url,
contributions: 0,
repositories: []
};

existing.contributions += contributor.contributions || 0;
if (!existing.repositories.includes(repo.name)) {
existing.repositories.push(repo.name);
}

contributorMap.set(contributor.login, existing);
}
}

payload.repos = activeRepos.map((repo) => repo.name).sort((a, b) => a.localeCompare(b));
payload.repos_count = payload.repos.length;
payload.contributors = Array.from(contributorMap.values())
.map((contributor) => ({
...contributor,
repositories: contributor.repositories.sort((a, b) => a.localeCompare(b)),
repos_count: contributor.repositories.length
}))
.sort((a, b) =>
b.contributions - a.contributions ||
b.repos_count - a.repos_count ||
a.login.localeCompare(b.login)
);
} catch (error) {
payload.error = error.message;
core.warning(`Failed to collect contributors: ${error.message}`);
}

const outputPath = path.join(process.env.GITHUB_WORKSPACE, '_data', 'contributors', 'generated.json');
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
fs.writeFileSync(outputPath, `${JSON.stringify(payload, null, 2)}\n`);
core.info(`Wrote contributors data to ${outputPath}`);

- name: Build Jekyll
run: bundle exec jekyll build --baseurl ""
env:
Expand Down
10 changes: 10 additions & 0 deletions _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,18 @@ title: AtlassianPS
description: A PowerShell community for Atlassian products
# description: A community for PowerShell lovers that use Atlassian products
keywords: Atlassian,AtlassianPS,jira,confluence,bitbucket,hipchat,jiraps,confluenceps,bitbucketps,hipchatps,github,gh-pages
lang: en-US
baseurl: ""
url: "https://atlassianps.org"
logo: /assets/img/AtlassianPS.png

author:
name: AtlassianPS

social:
name: AtlassianPS
links:
- https://github.com/AtlassianPS

# exclude: ["modules"]

Expand Down
34 changes: 25 additions & 9 deletions _data/landing.yml
Original file line number Diff line number Diff line change
@@ -1,25 +1,41 @@
# index page sections
# custom following lines to edit your index page
- id: quickstart
name: Quick Start
tpl: quickstart.html
preTitle: Pick a module and run
title: One Powerful Command
postTitle:
classes: quickstart-section

- id: modules
name: Modules
tpl: modules.html
preTitle: These are our
title: Modules
preTitle: Build automation with
title: AtlassianPS Modules
postTitle:
classes:
classes: modules-section

- id: workflows
name: Workflows
tpl: workflows.html
preTitle: Common automation
title: Workflow Recipes
postTitle: Ready-to-adapt examples from the gallery
classes: workflows-section

- id: people
name: People
tpl: people.html
preTitle:
title: People
postTitle: Who built this
classes:
preTitle: Open source by
title: Community
postTitle: Maintainers, reviewers, and contributors
classes: people-section

- id: posts
name: Posts
tpl: posts.html
preTitle: Latest
title: Posts
title: Updates
postTitle:
classes:
classes: updates-section
8 changes: 8 additions & 0 deletions _includes/analytics.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<!-- Global Site Tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id={{ site.ga }}"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', '{{ site.ga }}');
</script>
33 changes: 14 additions & 19 deletions _includes/carousel.html
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
<script type="text/javascript">
$(function() {
/* initiate the plugin */
$(".rotate").Morphext({
animation: "bounceIn",
separator: "|",
speed: 2000
});
});
</script>
<section id="SlideShow" class="slideshow-wrapper">
<div class="container">
<div class="slideshow-content">
<h2 class="text-uppercase">We <i class="fas fa-heart red"></i> PowerShell</h2>
<pre>PS> Import-Module <span class="rotate">Confluence|Jira</span>PS</pre>
<p class="text-muted"><span class="small">Welcome to a community of Powershell lovers, who are invested in making Atlassian product part of their Powershell life</span></p>
<a href="/#people" class="btn btn-lg inpage-navigation" role="button">Who We Are</a>
<a href="/docs" class="btn btn-lg btn-square btn-outline" role="button">Get Started</a>
</div>
<section class="landing-hero" aria-labelledby="landing-title">
<div class="landing-hero-inner">
<p class="landing-eyebrow">Automation toolkit for Jira, Confluence, and shared config</p>
<h1 id="landing-title">Automate Jira and Confluence work with confidence</h1>
<p class="landing-lead">
Use production-ready modules, practical workflows, and clear documentation across the
AtlassianPS ecosystem.
</p>

<div class="landing-cta-group" role="group" aria-label="Primary links">
<a class="button primary" href="{{ '/docs/' | relative_url }}">Read the docs</a>
<a class="button" href="#modules">Browse modules</a>
<a class="button" href="#quickstart">See quick commands</a>
</div>
</div>
</section>
4 changes: 2 additions & 2 deletions _includes/footer.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
<div class="site-info">
<div class="container">
<div class="btt d-print-none">
<a class="inpage-navigation" href="#page-top" title="Back To Top"><i class="fa fas-angle-double-up" style="visibility: visible; animation-duration: 2s; animation-name: flash;"></i></a>
<a class="inpage-navigation" href="#page-top" title="Back To Top" aria-label="Back to top"><i class="fas fa-angle-double-up" style="visibility: visible; animation-duration: 2s; animation-name: flash;"></i></a>
</div>
<div class="row">
<div class="col-12">
Copyright © 2017 AtlassianPS
Copyright © 2017-{{ "now" | date: "%Y" }} AtlassianPS
</div>
</div>
<div class="row d-print-none">
Expand Down
8 changes: 8 additions & 0 deletions _includes/head-favicons.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<!-- favicon -->
<link rel="apple-touch-icon" sizes="120x120" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="theme-color" content="#ffffff">
14 changes: 14 additions & 0 deletions _includes/head-meta.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

{% assign pageTitle = include.title | default: page.title | default: site.title %}
{% if pageTitle == site.title %}
<title>{{ site.title }}</title>
{% else %}
<title>{{ pageTitle }} | {{ site.title }}</title>
{% endif %}
{% seo title=false %}
{% if site.keywords %}
<meta name="keywords" content="{{ site.keywords }}">
{% endif %}
7 changes: 7 additions & 0 deletions _includes/head-scripts-core.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<!-- Scripts -->
<script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/anchor-js/4.1.0/anchor.min.js" integrity="sha256-lZaRhKri35AyJSypXXs4o6OPFTbTmUoltBbDCbdzegg=" crossorigin="anonymous"></script>
<script src="/assets/javascript/jquery.toc.min.js"></script>
<script src="/assets/javascript/theme.js"></script>
4 changes: 2 additions & 2 deletions _includes/navigation.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ <h1 class="site-title"><a class="site-text-logo" href="{{ site.url }}" rel="home
</div>

<div class="header-right-wrapper d-print-none">
<a href="#0" id="nav-toggle" class="">Menu<span></span></a>
<button type="button" id="nav-toggle" aria-label="Toggle navigation menu" aria-controls="site-navigation-menu" aria-expanded="false">Menu<span></span></button>
<nav id="site-navigation" class="main-navigation" role="navigation">
<ul class="onepress-menu">
<ul class="onepress-menu" id="site-navigation-menu">
{% for section in site.data.navigation %}
{% if section.childs %}
<li class="menu-item menu-item-has-children{% if page.url contains section.path %} active{% endif %}">
Expand Down
Loading
Loading