<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - Sarah Gibson</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/author-sarah-gibson.atom.xml" rel="self"/><id>https://jasongrout.github.io/medium-archive/pelican/</id><updated>2025-02-06T16:05:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>Join JupyterHub on Zulip chat!</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2025/join-jupyterhub-on-zulip-chat/" rel="alternate"/><published>2025-02-06T16:05:00+00:00</published><updated>2025-02-06T16:05:00+00:00</updated><author><name>Sarah Gibson</name></author><id>tag:jasongrout.github.io,2025-02-06:/medium-archive/pelican/posts/2025/join-jupyterhub-on-zulip-chat/</id><summary type="html">&lt;p&gt;The JupyterHub team have just moved all their chat to a Zulip channel!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2025/join-jupyterhub-on-zulip-chat/images/001-1_szQUtcTU4TbmrkGrSNzBpw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The JupyterHub team have just moved all their chat to a &lt;a href="https://jupyter.zulipchat.com/#narrow/channel/469744-jupyterhub"&gt;Zulip channel&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://jupyter.zulipchat.com"&gt;Jupyter Zulip instance&lt;/a&gt; is a Jupyter-wide chat space allowing cross-team communication in channels, some of which can be viewed publicly without an account.&lt;/p&gt;
&lt;p&gt;For the JupyterHub team, we have found better engagement from team members and across the wider eco-system by using the Zulip instance. To that end, we recently updated all of our Gitter rooms to “invite-only” so no new members could join, and left a pinned message with a link to the JupyterHub channel on Zulip and an invite to join the conversation there. We have also updated any of our repositories that had Gitter links to point to Zulip as well.&lt;/p&gt;
&lt;p&gt;If you would like to keep in touch with the JupyterHub, we would love to hear from you over on &lt;a href="https://jupyter.zulipchat.com/#narrow/channel/469744-jupyterhub"&gt;Zulip&lt;/a&gt;!&lt;/p&gt;
</content><category term="community"/><category term="JupyterHub"/></entry><entry><title>Online Collaboration Café launch: JupyterHub team meetings to become more collaborative spaces!</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2023/online-collaboration-cafe-launch-jupyterhub-team/" rel="alternate"/><published>2023-02-27T08:49:00+00:00</published><updated>2023-02-27T08:49:00+00:00</updated><author><name>Sarah Gibson</name></author><id>tag:jasongrout.github.io,2023-02-27:/medium-archive/pelican/posts/2023/online-collaboration-cafe-launch-jupyterhub-team/</id><summary type="html">&lt;p&gt;The JupyterHub team are refactoring our monthly meeting into a collaborative, co-working space that is more accessible and inclusive to…&lt;/p&gt;
</summary><content type="html">&lt;figure&gt;
&lt;img alt="A cartoon of a person and their black and white dog, sat at a desk using a laptop. Squares containing profiles of different people wearing headphones are emanating from the laptop, indicating that the person at the desk is participating in a remote, collaborative activity." src="https://jasongrout.github.io/medium-archive/pelican/posts/2023/online-collaboration-cafe-launch-jupyterhub-team/images/001-1_9GSBPtjxJNpvUXCFcaL9ng.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;&lt;em&gt;This illustration is created by Scriberia with The Turing Way community. Used under a CC-BY 4.0 licence. DOI:&lt;/em&gt; &lt;a href="https://doi.org/10.5281/zenodo.3332807"&gt;&lt;em&gt;10.5281/zenodo.3332807&lt;/em&gt;&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The JupyterHub team are refactoring our monthly meeting into a collaborative, co-working space that is more accessible and inclusive to those who are just getting started in the community — an Online Collaboration Café! This blog post aims to explain what that means, and what to expect when you attend. We plan to hold our first Online Collaboration Café on &lt;strong&gt;21st March 2023&lt;/strong&gt;. Please come along and let us know your feedback!&lt;/p&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;The team meeting will be held in a new format for 2 hours in the original time slot. Instead of a typical meeting style with an agenda, the group will be divided into breakout rooms to work more collaboratively on ideas and perhaps begin actioning them. There will always be breakout rooms available for onboarding newcomers and those who wish some dedicated time to undertake maintenance tasks, as well as a quiet working space in the main room. Participants should feel free to swap rooms and join/drop out as they need.&lt;/p&gt;
&lt;h2 id="why-the-change"&gt;Why the change?&lt;/h2&gt;
&lt;p&gt;The JupyterHub community often cite the team meetings as a touchpoint for newcomers to familiarise themselves with the JupyterHub project. However, this is not always the case. The team meetings have an emergent agenda built by the community members — which is great! — but it also means that it is a potluck as to whether the meeting you happen to attend will actually be useful depending on the agenda, and a newcomer may have to attend multiple meetings over a long period before feeling comfortable to ask questions and know where they can begin to help.&lt;/p&gt;
&lt;p&gt;By reformatting the meeting into a collaborative co-working space using breakout rooms, we can cater for both the need of newcomers to be oriented to the project, and for the community to discuss in-depth topics in an emergent nature.&lt;/p&gt;
&lt;h2 id="what-is-an-online-collaboration-cafe"&gt;What is an Online Collaboration Café?&lt;/h2&gt;
&lt;p&gt;The Collaboration Café is a concept that was developed by &lt;a href="https://the-turing-way.netlify.app"&gt;&lt;em&gt;The Turing Way&lt;/em&gt; community&lt;/a&gt;, and you can read more about it and how they are run in their &lt;a href="https://the-turing-way.netlify.app/community-handbook/coworking/coworking-collabcafe.html#chairing-an-online-collaboration-cafe"&gt;Community Handbook&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In short, an Online Collaboration Café utilises breakout rooms and &lt;a href="https://en.wikipedia.org/wiki/Pomodoro_Technique"&gt;pomodoro sprints&lt;/a&gt; to allow groups of community members to work together on a topic that best suits them. The space between the pomodoros are used as shareouts to the rest of the group, or as biobreaks.&lt;/p&gt;
&lt;h2 id="what-are-the-logistics"&gt;What are the logistics?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;This is an &lt;a href="https://en.wikipedia.org/wiki/Pomodoro_Technique"&gt;online&lt;/a&gt; café. We will meet on a video call.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We will be using the same alternating time slot that the team meetings used to occur in, but the slot will now be two hours. You can view the &lt;a href="https://jupyterhub-team-compass.readthedocs.io/en/latest/meetings/index.html#meeting-calendars"&gt;Team Calendar&lt;/a&gt; for details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A chair will always be present in the main room to manage breakout rooms and greet folk who may arrive mid-sprint.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There will always be some default breakout rooms available:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Onboarding:&lt;/strong&gt; For new arrivals to the community. A member of the team will be available on the call to support anyone wanting to learn more about collaborating on GitHub, getting a virtual tour of our GitHub organisation, and help you in any way we can.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintenance:&lt;/strong&gt; Folks working in this room will be triaging issues, reviewing pull requests, and other maintenance-related activities across the JupyterHub organisation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quiet working in the main room:&lt;/strong&gt; If you would just like some quiet time dedicated to any JupyterHub-related work you have, you are invited to hang out in the main room (and keep the chair company 😉)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-will-happen-when-i-attend"&gt;What will happen when I attend?&lt;/h2&gt;
&lt;p&gt;When you arrive to the Online Collaboration Café, there will first be some housekeeping, such as introductions, Code of Conduct review. There will then be some goal setting around what folks are hoping to achieve during the time. These goals will determine the topics for the breakout rooms. Any attendee is welcome to: suggest their own topic, join a suggested topic, join one of the default rooms, or work quietly in the main room. The breakouts will then run in sprints with breaks to share their progress. The Café is closed with some reflections, for example: how did your work progress, what should the project think about working towards next?&lt;/p&gt;
&lt;p&gt;Here is an example schedule of how an Online Collaboration Café could happen inspired by &lt;a href="https://the-turing-way.netlify.app/community-handbook/coworking/coworking-collabcafe.html#schedule"&gt;&lt;em&gt;The Turing Way&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Time: Activity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Start: Welcome, CoC review&lt;/li&gt;
&lt;li&gt;10 mins: Introductions and goal setting&lt;/li&gt;
&lt;li&gt;20 mins: Pomodoro 1&lt;/li&gt;
&lt;li&gt;5 mins: Break&lt;/li&gt;
&lt;li&gt;20 mins: Pomodoro 2&lt;/li&gt;
&lt;li&gt;5 mins: Break&lt;/li&gt;
&lt;li&gt;20 mins: Open discussion: celebrations, reflections, future plans&lt;/li&gt;
&lt;li&gt;5 mins: Close&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-hours-seems-like-a-long-time-why-not-multiple-meetings"&gt;2 hours seems like a long time… Why not multiple meetings?&lt;/h2&gt;
&lt;p&gt;Various individual meetings covering separate topics, such as onboarding and maintenance, were considered. However given that the majority of JupyterHub’s community are volunteers, it didn’t seem practical to fill up the calendar with lots of meetings. Another reason to use parallel breakout rooms is that participants can swap rooms if the current conversation doesn’t appeal to them, as if you were at tables in a real café. &lt;em&gt;This practice is highly encouraged.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The extension to 2 hours is important because this is a pivot towards collaboration and co-working, and we want to provide a dedicated time for folk to achieve that and begin actioning ideas. However it is a large chunk of time to devote when we are all busy, and so it is not a requirement to arrive on time and participate for the full 2 hours. &lt;em&gt;Joining when you can and dropping when you need to is encouraged and doesn’t require apologies.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="will-there-be-cake-at-this-cafe"&gt;Will there be cake at this café?&lt;/h2&gt;
&lt;p&gt;It is an online café so there will be as many virtual cakes as you like! 🍰🍰🍰&lt;/p&gt;
&lt;p&gt;This is an informal space, so you are encouraged to bring along any beverages and/or snacks. We hope you will join us!&lt;/p&gt;
</content><category term="collaboration"/><category term="community"/><category term="JupyterHub"/></entry><entry><title>Introducing JupyterHub’s Outreachy interns! — December 2022 Cohort</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2022/introducing-jupyterhubs-outreachy-interns-december-2022/" rel="alternate"/><published>2022-12-07T07:45:00+00:00</published><updated>2022-12-07T07:45:00+00:00</updated><author><name>Sarah Gibson</name></author><id>tag:jasongrout.github.io,2022-12-07:/medium-archive/pelican/posts/2022/introducing-jupyterhubs-outreachy-interns-december-2022/</id><summary type="html">&lt;p&gt;As part of the community strategic support project funded by CZI’s EOSS grant series, the JupyterHub sub-project has funding to support…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2022/introducing-jupyterhubs-outreachy-interns-december-2022/images/001-1_mRtgDdoRwjO3Kb2nSGOsdw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;As part of the &lt;a href="/posts/2021/czi-awards-three-eoss-grants-to-jupyter-community/"&gt;community strategic support project funded by CZI’s EOSS grant series&lt;/a&gt;, the JupyterHub sub-project has funding to support Outreachy interns through four cohorts over the next two years. We would like to introduce you to the first cohort and the projects they will be working on!&lt;/p&gt;
&lt;h2 id="ogoh-blessing-onyowoicho-improve-accessibility-in-jupyterhub"&gt;Ogoh Blessing Onyowoicho — Improve Accessibility in JupyterHub&lt;/h2&gt;
&lt;p&gt;Accessibility is the ability of tools (in our case web tools) to be used by a variety of communities with different disabilities. There are a variety of standards and tools for evaluating and ensuring that a web page can be used effectively by as many people as possible. Work by the &lt;a href="https://jupyter-accessibility.readthedocs.io"&gt;Accessibility team&lt;/a&gt; is ongoing to define a set of standard tools to improve accessibility across the Jupyter ecosystem.&lt;/p&gt;
&lt;p&gt;The JupyterHub project is working to improve the accessibility of its pages to ensure we are providing tools that are as useful as they can be to as many people as we can. During the internship, we will evaluate JupyterHub’s accessibility, find ways to improve it, and integrate accessibility testing into the development process, in collaboration with the Accessibility team, to ensure we do a better job going forward.&lt;/p&gt;
&lt;h3 id="ogoh-blessing-says"&gt;Ogoh Blessing says:&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;My name is Ogoh Blessing Onyowoicho. I am a self-taught Frontend developer based in Lagos, Nigeria and I am an Outreachy intern working on Improving the accessibility of JupyterHub.&lt;br&gt;
I am excited to work on JupyterHub because it is giving me the opportunity to use skills that I have accrued over the years to proffer solutions to problems that affect people’s lives directly. On hearing accessibility, the first thought one has is that it involves building web products that people with special needs can use seamlessly. Though this is part of it, accessibility goes way beyond this. It involves building products that different users (e.g users at different locations, users with different devices etc) can use easily. The thought of contributing to improving the experience of so many people alone excites me.&lt;br&gt;
In the coming months, I hope to learn and continue to hone my skills as I am guided by my mentors and members of the community I get to interact with.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="allan-wasega-restructure-and-improve-jupyterhub-documentation-by-implementing-the-diataxis-framework"&gt;Allan Wasega — Restructure and improve JupyterHub documentation by implementing the Diátaxis framework&lt;/h2&gt;
&lt;p&gt;JupyterHub has a range of documentation that covers both developer and user audiences in order to help them deploy, maintain, and use their own instance of a JupyterHub. The success of an open source software project to (i) be adopted by users, and (ii) receive meaningful contributions relies heavily on the quality, navigability and accessibility of documentation so that users and developers have all the information they need to achieve what they want to do.&lt;/p&gt;
&lt;p&gt;A framework for organising technical documentation has arisen called &lt;a href="https://diataxis.fr"&gt;diátaxis&lt;/a&gt;. It takes a systematic approach to understanding user requirements of documentation throughout the lifecycle of interaction with a product and posits that different user needs require different approaches in creation of the documentation, as well as a layout to navigate these different “modes” of documentation.&lt;/p&gt;
&lt;p&gt;This project will focus on a refactoring of the documentation for the &lt;a href="https://github.com/jupyterhub/jupyterhub"&gt;JupyterHub package&lt;/a&gt;. We will begin by performing a review of the present documentation, categorise these into the diataxis framework, and then restructure the documentation files in the repository. Once we have transformed the documentation into this framework, it will be much easier to identify missing and unclear documentation (those that were difficult to categorise). We can then begin to curate resources that can fill the gaps and improve documentation that is not specific enough.&lt;/p&gt;
&lt;h3 id="allan-says"&gt;Allan says:&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;I am Allan Wasega, from Nairobi, Kenya. Broadly, I like to describe myself as a researcher and a writer. Researcher because looking into things to find patterns or hidden information has always been of interest to me. Writer because I figured early on that words allow me to express myself and to communicate to a larger audience than that inside my head :). As a Computer Science student, I looked for ways to bring these two skills together within the realm of computing and that is how I found myself in the technical writing space.&lt;br&gt;
As an undergraduate student, I used Jupyter Notebooks extensively for most of my programming assignments and projects. As a result, when making my Outreachy application, the JupyterHub project immediately piqued my interest because I did not know that there was a way to serve Jupyter Notebooks to multiple users, such as within a classroom setting. Presently, I serve as a mentor at KamiLimu, which is a mentorship program for students pursuing technology-aligned courses in tertiary institutions in Kenya. One of the objectives of KamiLimu is to introduce students to tech specializations such as Data Science and Machine Learning, which, from experience, uses Jupyter Notebooks! Therefore, I am excited to work on JupyterHub because I will be learning about and helping to improve a product I hold dear and which I can use to advance the skills of the next generation of computer technologists in Kenya.&lt;br&gt;
First, I hope to gain a deep understanding of how JupyterHub works so as to spread the word about it and its functionalities. Second, I hope to apply and advance my technical writing skills. I encountered the Diataxis Framework earlier this year while working as a technical writer at Tingle Software, a Nairobi-based software company. I have also been following Daniele Procida (the author of the framework) on Twitter for a while now and his work has been quite inspiring. Through this project, I will apply the Diataxis Framework to restructure JupyterHub’s documentation and, in doing so, further my understanding of the framework. Finally, I am passionate about mentorship, especially in the tech field. Therefore, besides expanding my professional and personal networks, this project will enable me to learn how to conduct mentorship within a global setting, and I can, in turn, apply this knowledge within my local community.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="sheila-kahwai-create-a-reusable-jupyterhub-pytest-plugin"&gt;Sheila Kahwai — Create a reusable JupyterHub pytest plugin&lt;/h2&gt;
&lt;p&gt;JupyterHub is a modular and extensible project, with parts, like the proxy, authenticator and spawner, that can be easily changed and extended. Testing the functionality of these components against JupyterHub is important and it requires various hub setups that can sometimes become complicated.&lt;/p&gt;
&lt;p&gt;Currently, each of these hub components and the hub itself define their own testing infrastructure, building everything from the ground up using the pytest framework. But some of this complex work is either repetitive across JupyterHub sub-projects, or under-specified for some of them.&lt;/p&gt;
&lt;p&gt;This project will abstract out these common parts into a separate testing framework. This framework should be a pip-installable pytest plugin that would provide various hub functionalities through pytest fixtures. These fixtures can then be re-used by JupyterHub and its components to bootstrap their own testing suite.&lt;/p&gt;
&lt;p&gt;Integrating this plugin will drive some important refactoring work of the current testing architecture of JupyterHub and have a great impact in improving the overall test coverage, maintainability and continuity of the JupyterHub project.&lt;/p&gt;
&lt;h3 id="sheila-says"&gt;Sheila says:&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;My name is Sheila Kahwai. I am a self-taught python developer from Nairobi, Kenya, working to specialize in back-end engineering.&lt;br&gt;
I am excited to work on JupyterHub because it has made many products I have used throughout my learning journey. It is a privilege to work with a diverse community that has created products that are very useful to equally diverse users like myself.&lt;br&gt;
While creating a reusable JupyterHub pytest plugin, I hope to gain more insight into creating plugins for massive codebases to improve maintainability and scalability with clean and reusable code. Through this project, I look forward to improving the overall testing infrastructure of the various JupyterHub components.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Welcome to the interns! We’re so excited to start working with you!&lt;/p&gt;
</content><category term="accessibility"/><category term="documentation"/><category term="JupyterHub"/><category term="Outreachy"/></entry><entry><title>How I automated authorised cloud deployments from Pull Requests with GitHub Actions</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2021/how-i-automated-authorised-cloud-deployments-from-pull/" rel="alternate"/><published>2021-11-22T18:30:00+00:00</published><updated>2021-11-22T18:30:00+00:00</updated><author><name>Sarah Gibson</name></author><id>tag:jasongrout.github.io,2021-11-22:/medium-archive/pelican/posts/2021/how-i-automated-authorised-cloud-deployments-from-pull/</id><summary type="html">&lt;p&gt;I recently did some work on the mybinder.org deployment infrastructure to solve a problem with testing Pull Requests before deployment. It…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;I recently did some work on the mybinder.org deployment infrastructure to solve a problem with testing Pull Requests before deployment. It had not been possible to test Pull Requests on our staging deployment because our automated workflows don’t have access to secrets. This resulted in my writing the &lt;a href="https://github.com/sgibson91/test-this-pr-action"&gt;test-this-pr action&lt;/a&gt; and this blog is a retrospective of what I learned over that process.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="what-was-the-problem-we-were-trying-to-solve"&gt;&lt;strong&gt;What was the problem we were trying to solve?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;It is generally considered best practice to have a staging environment when running complex applications or platforms that have a large userbase, such as &lt;a href="https://mybinder.org"&gt;mybinder.org&lt;/a&gt;. This provides developers a space to test infrastructure changes safely with the knowledge that users won’t be affected should anything go wrong. The deployment configuration for mybinder.org is managed &lt;a href="https://github.com/jupyterhub/mybinder.org-deploy"&gt;in a GitHub repository&lt;/a&gt; and deploys are handled &lt;a href="https://github.com/jupyterhub/mybinder.org-deploy/blob/master/.github/workflows/cd.yml"&gt;in a CI/CD pipeline run on GitHub Actions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The mybinder.org operating team’s usual workflow will be very familiar to anyone working as part of a distributed development team: fork the main repository, do some development (fix a bug or implement a feature), and then open a Pull Request (PR) back to the default branch of the main repository. The difficulty arises when we want to test the PR on our staging infrastructure before merging and deploying for real.&lt;/p&gt;
&lt;p&gt;Various secrets are required to make a deployment, even to our staging environment. These include a git-crypt secret that decrypts certain sensitive files and credentials to push Docker images to the repositories connected to our clusters, among others. These are stored as encrypted repository secrets so they are available to GitHub Actions when our CD pipeline runs. However by default, repository secrets are not made available to PRs from forks, which introduces a problem for the workflow I described above.&lt;/p&gt;
&lt;p&gt;So to summarise our problem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Contributors often make changes to the code in their &lt;em&gt;fork&lt;/em&gt; of the repository&lt;/li&gt;
&lt;li&gt;Testing any change requires deploying to an actively-running staging cluster&lt;/li&gt;
&lt;li&gt;The secrets needed to make those deploys are only available to the original repository, not to a forked repository&lt;/li&gt;
&lt;li&gt;So we needed a way to trigger a test deployment on changes &lt;em&gt;from a forked repository&lt;/em&gt; but that ran &lt;em&gt;in the origin repository&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-solutions-did-we-already-have-in-place"&gt;What solutions did we already have in place?&lt;/h2&gt;
&lt;p&gt;We had one team practice, and one technical solution to address this issue, both of which didn’t quite do what we wanted.&lt;/p&gt;
&lt;p&gt;One solution was a team deployment practice of “just merge the PR anyway and file a revert PR if things go wrong”. Our CI/CD pipeline is broken into two jobs: deploy to staging infrastructure, and a matrix deployment to each production cluster in &lt;a href="https://mybinder-sre.readthedocs.io/en/latest/operation_guide/federation.html"&gt;the BinderHub federation&lt;/a&gt;. The production jobs require the staging job to pass first before they are triggered. This means that if the deploy to staging fails, the changes will never propagate to our production clusters.&lt;/p&gt;
&lt;p&gt;Another solution was a “test-staging” label we could apply to open PRs. This triggered the deploy to staging job without a merge. However, this only worked for PRs opened from branches &lt;em&gt;within the origin repository&lt;/em&gt;, and as mentioned above, this is not a common workflow for maintainers. Instead they open PRs from forked repositories, which do not have the proper secrets to deploy to staging.&lt;/p&gt;
&lt;h2 id="what-other-solutions-were-available"&gt;What other solutions were available?&lt;/h2&gt;
&lt;p&gt;We briefly considered &lt;a href="https://github.com/imjohnbo/ok-to-test"&gt;ok-to-test&lt;/a&gt; but were put off by the requirement for a GitHub App. However as we will learn, it was probably a mistake to dismiss this so quickly!&lt;/p&gt;
&lt;h2 id="what-did-i-end-up-implementing"&gt;What did I end up implementing?&lt;/h2&gt;
&lt;p&gt;And so I built my first GitHub Action!&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/sgibson91/test-this-pr-action"&gt;test-this-pr action&lt;/a&gt; allows you to trigger a GitHub Action &lt;em&gt;from the origin repository&lt;/em&gt; when an authorised user adds a comment to the PR of a forked repository.&lt;/p&gt;
&lt;p&gt;test-this-pr is triggered when a user leaves a comment on the PR you’d like to test, but only if the commenter has the appropriate permissions on the repository, e.g. MEMBER. This protects us from malicious code being run automatically on our staging deployment and ensures that project maintainers have vetted the code in some way before triggering the test.&lt;/p&gt;
&lt;p&gt;When triggered, test-this-pr uses a small Python script that queries the GitHub API to do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It creates a new branch in the origin repository that uses the merge reference from the PR.&lt;/li&gt;
&lt;li&gt;This triggers the test suite in the new branch, because we have configured the origin repository to automatically run deployment tests on branches that match a particular name pattern (in our case, test-this-pr/*, see below)&lt;/li&gt;
&lt;li&gt;Adds comments on the original PR with a link to the newly-running CI test logs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This script is wrapped up into a Dockerfile, which allows GitHub Actions to run the action using its docker runner.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The test-this-workflow bot in action." src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/how-i-automated-authorised-cloud-deployments-from-pull/images/001-0_CxrmnyCYbWVYXn0B.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;An example of the &lt;code&gt;test-this-pr&lt;/code&gt; workflow in action.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="extra-configuration-needed-to-use-this-action"&gt;Extra configuration needed to use this action&lt;/h2&gt;
&lt;p&gt;There were a few extra pieces I configured that couldn’t (and shouldn’t!) be implemented in the test-this-pr action, but contribute to the overall workflow.&lt;/p&gt;
&lt;p&gt;I also &lt;a href="https://github.com/jupyterhub/mybinder.org-deploy/blob/5442082cbb408f889f433792c1abf4ede02e67ec/.github/workflows/cd.yml#L318-L341"&gt;created a CI job that polls the running staging job&lt;/a&gt;. Upon completion, it posts a second comment to the original PR stating whether the test passed or failed. This had to be separate from the test-this-pr action since this job needs to run within the same workflow run in order to access the status of the staging job.&lt;/p&gt;
&lt;p&gt;Once the pass/fail status of the staging job has been reported, the branch created by test-this-pr is then deleted. We decided this was the best path forward so that the original PR remained the “single source of truth” and maintainers wouldn’t be confused by extra branches in the repository.&lt;/p&gt;
&lt;h2 id="for-reference-if-youd-like-to-understand-this-implementation"&gt;For reference if you’d like to understand this implementation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterhub/mybinder.org-deploy/blob/master/.github/workflows/test-this-pr.yml"&gt;Here is our configuration to trigger test-this-pr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterhub/mybinder.org-deploy/blob/master/.github/workflows/cd.yml#L17-L21"&gt;Here we configure our deployment action to run on branches with test-this-pr/*&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyterhub/mybinder.org-deploy/blob/5442082cbb408f889f433792c1abf4ede02e67ec/.github/workflows/cd.yml#L318-L341"&gt;Here is the CI job that polls the running staging job and posts a comment with its status before deleting the branch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-did-i-learn-along-the-way"&gt;What did I learn along the way?&lt;/h2&gt;
&lt;h3 id="there-is-a-lot-you-can-do-with-the-github-rest-api"&gt;There is A LOT you can do with the GitHub REST API&lt;/h3&gt;
&lt;p&gt;I had originally configured the Python script to shell out to git for tasks like creating the new branch and pulling the PR merge ref, and this worked fine when I ran Python locally. However when running the docker container, I struggled to authorise git correctly, even when passing my Personal Access Token. And so I made the decision to switch to the &lt;a href="https://docs.github.com/en/rest"&gt;GitHub REST API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While a lot of GitHub native features can be accessed and manipulated via the API, some git-specific actions can be achieved as well via the &lt;a href="https://docs.github.com/en/rest/reference/git"&gt;git database endpoint&lt;/a&gt;, which is the endpoint to use to create branches, commits, and much more. This section of the API might require a deeper dive into the inner-workings of git, but can unlock a lot of automation potential once you have your mental model!&lt;/p&gt;
&lt;p&gt;Switching to the GitHub REST API from the git command line meant that I no longer needed to install git into my docker container or locally clone the repository to carry out the actions, making my image much smaller.&lt;/p&gt;
&lt;h3 id="triggering-github-actions-from-other-actions"&gt;Triggering GitHub Actions from other Actions&lt;/h3&gt;
&lt;p&gt;You can’t trigger another GitHub Actions workflow from an event that was authorised with the GITHUB_TOKEN from within a previous workflow. This is why the comments left by the test-this-pr workflows in the Binder repository come from my account as I had to provide a Personal Access Token for the staging job to be correctly triggered.&lt;/p&gt;
&lt;p&gt;The downside of this is that I’m automatically subscribed to notifications for any Binder PR where someone is using test-this-pr. It’s not the worst situation in the world as I have email filters set up, but also not ideal.&lt;/p&gt;
&lt;p&gt;This is also why &lt;a href="https://github.com/imjohnbo/ok-to-test"&gt;ok-to-test&lt;/a&gt; recommends setting up a GitHub App for authorisation, so you don’t have to sacrifice your own account and all the notifications that come with it!&lt;/p&gt;
&lt;p&gt;However, this “actions triggering actions” scenario could be smoothed out by using the upcoming &lt;a href="https://docs.github.com/en/actions/learn-github-actions/reusing-workflows"&gt;Reusable Workflows&lt;/a&gt; beta.&lt;/p&gt;
&lt;h3 id="building-actions-with-dockerfiles"&gt;Building Actions with Dockerfiles&lt;/h3&gt;
&lt;p&gt;Providing a Dockerfile with a custom Action will allow you to write your Action in whatever language you like. However, it is one of the slowest ways to implement custom Actions because GitHub’s runner will build the image every time the workflow is triggered.&lt;/p&gt;
&lt;h2 id="what-would-i-do-differently-now"&gt;What would I do differently now?&lt;/h2&gt;
&lt;h3 id="setup-a-github-app-for-authorisation"&gt;Setup a GitHub App for authorisation&lt;/h3&gt;
&lt;p&gt;If only to spare my inbox from the notifications! 😂&lt;/p&gt;
&lt;h3 id="move-away-from-a-python-implementation"&gt;Move away from a Python implementation&lt;/h3&gt;
&lt;p&gt;The test-this-pr action ultimately ended up being a handful of calls to the GitHub REST API. As opposed to maintaining a Python script and Dockerfile, I would probably reimplement this using the &lt;a href="https://github.com/marketplace/actions/github-script"&gt;github-script action&lt;/a&gt;, which is a JavaScript wrapper for the GitHub API that can be directly run from GitHub Actions. This will be less code to maintain and the test-this-pr action itself could then be reworked as a &lt;a href="https://docs.github.com/en/actions/creating-actions/creating-a-composite-action"&gt;composite action&lt;/a&gt; which would build faster than the current Docker-based implementation.&lt;/p&gt;
&lt;h2 id="closing-remarks"&gt;Closing Remarks&lt;/h2&gt;
&lt;figure&gt;
&lt;img alt="Members of the mybinder operating team discussing test-this-pr in gitter" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/how-i-automated-authorised-cloud-deployments-from-pull/images/002-1_8XZ7K2yXsNdRUTUPhfCYwA.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Members of the mybinder operating team discussing test-this-pr in gitter&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;While there is a lot I would change about test-this-pr, including fundamental changes that would make it look radically different, I needed to go on this developmental journey to gain the better understanding of GitHub Actions that I have now. And hopefully by sharing that journey, other folk can learn from it!&lt;/p&gt;
&lt;p&gt;Also the mybinder operating team love using this feature and it’s adding value to our development workflow, so I don’t see a need to dive back in and start changing things again right now 🙂&lt;/p&gt;
&lt;p&gt;You can read the source code for &lt;a href="https://github.com/sgibson91/test-this-pr-action"&gt;&lt;code&gt;test-this-pr&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/jupyterhub/mybinder.org-deploy/blob/master/.github/workflows/cd.yml"&gt;mybinder.org’s deployment workflow&lt;/a&gt; in full.&lt;/p&gt;
</content><category term="DevOps"/></entry><entry><title>Diving into Leadership to Build Push-Button Code</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/diving-into-leadership-to-build-push-button-code/" rel="alternate"/><published>2019-10-15T18:34:00+00:00</published><updated>2019-10-15T18:34:00+00:00</updated><author><name>Sarah Gibson</name></author><id>tag:jasongrout.github.io,2019-10-15:/medium-archive/pelican/posts/2019/diving-into-leadership-to-build-push-button-code/</id><summary type="html">&lt;p&gt;“Hi everyone, I’m Sarah! I’m a Research Data Scientist at the Alan Turing Institute and I’m also an operator of mybinder.org. It’s really…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;“Hi everyone, I’m Sarah! I’m a Research Data Scientist at the Alan Turing Institute and I’m also an operator of mybinder.org. It’s really cool seeing how many people here are interested in BinderHub!”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And it is cool. &lt;em&gt;Really&lt;/em&gt; cool! But also a bit scary as a room full of Research Software Engineers (each of them much further on in their careers than I am) suddenly turn to me, eager for the knowledge I was surely about to impart to them.&lt;/p&gt;
&lt;p&gt;But let’s rewind a bit.&lt;/p&gt;
&lt;h2 id="joining-the-binder-community"&gt;Joining the Binder community&lt;/h2&gt;
&lt;p&gt;Its May 2019 and I’m attending the Research Software Reactor sprint jointly hosted by Microsoft and Imperial College London. This is a 3-day hackathon where researchers from different areas (though all with a computing background) come together to collaboratively build cloud-based resources on Microsoft’s Azure platform.&lt;/p&gt;
&lt;p&gt;As for me, I’m only 6 months into my role at the Turing, having graduated from my PhD in Astrophysics at the start of the year. Also, my role as a “Binder Operator” is barely 2 months old… which is why I’m starting to feel nervous about the amount of interest in the room! This also happens to be the second hackathon I’ve attended &lt;em&gt;ever&lt;/em&gt;, so the adrenaline is high.&lt;/p&gt;
&lt;p&gt;So, what is this “Binder” that we’re all so excited about?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mybinder.readthedocs.io/en/latest/"&gt;Binder&lt;/a&gt; is an amazing resource that can host reproducible and interactive code in a web browser. Great… what does that mean? It means that if I have some scripts or notebooks in a repository (like &lt;a href="https://github.com/binder-examples/requirements"&gt;this one&lt;/a&gt;) and I describe the packages in a configuration file (such as &lt;a href="https://github.com/binder-examples/requirements/blob/master/requirements.txt"&gt;requirements.txt&lt;/a&gt;), then I can go to &lt;a href="https://mybinder.org"&gt;mybinder.org&lt;/a&gt;, copy the URL of the repository into the form and hit launch. This will begin a series of events culminating in my notebook appearing in a browser window with all of the packages installed, and the code will &lt;em&gt;just run&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Sounds like magic, right? You can even combine Binder with &lt;a href="https://jupyterbook.org/intro.html"&gt;Jupyter Books&lt;/a&gt; to create &lt;a href="https://joergbrech.github.io/Modellbildung-und-Simulation/intro"&gt;interactive documents&lt;/a&gt;! Below is a comic explaining how a scientist may use Binder.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The user experience of mybinder.org. Comic courtesy of Juliette Taka." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/diving-into-leadership-to-build-push-button-code/images/001-1_Q0AkXSsMbp0TWgC58b3zdA.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The user experience of mybinder.org. Comic courtesy of &lt;a href="https://twitter.com/mybinderteam/status/1082556317842264064"&gt;Juliette Taka&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href="https://binderhub.readthedocs.io/en/latest/index.html"&gt;BinderHub&lt;/a&gt; is the technology powering Binder (or where the magic happens). It is a multi-user server that can create a custom, user-specified computing environment and make it accessible via a URL. It utilizes different tools to make this possible and can be deployed onto either a cloud provider or an on-premise compute cluster. These tools are depicted in the below illustration.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A pictorial representation of the different tools constituting BinderHub. This image was created by Scriberia for The Turing Way community and is used under a CC-BY licence. Zenodo record." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/diving-into-leadership-to-build-push-button-code/images/002-1_0M4Cmt18vZIGBOUGjToP3A.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A pictorial representation of the different tools constituting BinderHub. This image was created by &lt;a href="http://www.scriberia.co.uk/"&gt;Scriberia&lt;/a&gt; for &lt;a href="https://github.com/alan-turing-institute/the-turing-way"&gt;&lt;strong&gt;The Turing Way&lt;/strong&gt;&lt;/a&gt; community and is used under a CC-BY licence. &lt;a href="https://doi.org/10.5281/zenodo.3332808"&gt;Zenodo record&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Since BinderHub is a cloud-neutral technology (mybinder.org itself runs on &lt;a href="/posts/2019/the-international-binder-federation/"&gt;Google Cloud and OVH.com&lt;/a&gt;), I previously worked on refining the documentation around deploying BinderHub on Azure and ran workshops teaching people how to use Binder and deploy BinderHub. It was this work that lead to me being invited to join the Binder team. Being a maintainer for an open-source project involves checking if the service is still running smoothly and being an active, friendly member of the community — one who can answer questions when they arise.&lt;/p&gt;
&lt;p&gt;Now that we’ve covered a bit of background, let’s get back to my slightly uncomfortable moment at the sprint.&lt;/p&gt;
&lt;h2 id="day-1-an-unexpected-leadership-position"&gt;Day 1: An unexpected leadership position&lt;/h2&gt;
&lt;p&gt;Everybody in the room is now trying to whittle down which projects we should work on — all of which are awesome! The magic of BinderHub is that it covers so many aspects of software engineering tools and practices, such as continuous integration/deployment and &lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt;. The BinderHub idea is quickly amassing a lot of satellite projects!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“So Sarah, is it OK if I name you leader of ‘Team BinderHub’?”&lt;/em&gt; My second uncomfortable moment. Gerard Gorman, Senior Lecturer in the Department of Earth Sciences at Imperial and co-organizer of the sprint, has just elected me leader of my first ever hack project. If I’m honest, I’d intended to spend the sprint ironing out some niggles with a colleague. But I’ve always been a “learn by doing” person so I agree and desperately begin wracking my brain for a project to give my team for the next 3 days.&lt;/p&gt;
&lt;p&gt;After a bit of shuffling (where for a while it seemed like most of the attendees would be joining ‘Team BinderHub’!), I finally assemble a team. My teammates are: Tania Allard, a Microsoft Developer Advocate; Tim Greaves and Diego Alonso Álvarez, Research Software Engineers at Imperial; and Gerard himself.&lt;/p&gt;
&lt;p&gt;The project I decide to bring to the table is one that I’d started but had stalled. The process of deploying a BinderHub can be quite long (usually an hour) and consists mainly of typing stuff into the command line. So a couple of months prior, I’d begun designing a set of scripts that would install the relevant tools, deploy a BinderHub on Azure and connect it to a Docker Hub account, retrieve various pieces of information (IP addresses, logs, etc.) and then remove the BinderHub from the cloud. However, my bash scripting and operating system knowledge is not especially strong. Within the team, we have a bit of a discussion around the &lt;a href="https://www.microsoft.com/developerblog/2017/01/17/the-deploy-to-azure-button/"&gt;Deploy to Azure&lt;/a&gt; feature — a button that can be copy-pasted into the README of a GitHub project and facilitates a one-click deployment of the project to Azure. It seems like the perfect hack is to combine my scripts with the deploy button and make deploying BinderHub as easy as possible.&lt;/p&gt;
&lt;p&gt;Tim is a bash scripting, containerizing pro and has a little experience with the Azure “blue button” from the &lt;a href="https://github.com/okpy/ok"&gt;OKPy project&lt;/a&gt;. I ask him to check my setup script that installs the required Command Line Interfaces (CLIs) and explain that I’d like it to be generalized for different operating systems.&lt;/p&gt;
&lt;p&gt;Gerard is a BinderHub enthusiast and is keen to get one deployed as a teaching resource at Imperial. As a starter task, I ask him to read up on how the blue button works.&lt;/p&gt;
&lt;p&gt;Diego has never heard of Binder or BinderHub before and is quite confused as to what the rest of the team are so excited about! I suggest that he works through my &lt;a href="https://bit.ly/zero-to-binderhub-workshop"&gt;Zero to BinderHub workshop&lt;/a&gt; in order to bring him up to speed with the concepts. This is also the perfect opportunity to get feedback on my workshop if parts are not clear! I encourage him to open an issue describing any problems he comes across or extra information he’d like to see.&lt;/p&gt;
&lt;p&gt;And just like that, I find I’ve delegated myself out of a job!&lt;/p&gt;
&lt;p&gt;Now Imposter Syndrome is beginning to creep up on me. Not only is it taking four extra people to pull together my work and make it usable, but I am also unsure how I would assist them in these tasks I’d set them. Especially Tim, as the complexity of what I wanted the bash scripts to achieve was the reason this project stalled in the first place.&lt;/p&gt;
&lt;p&gt;Except there’s one very important aspect of any software project I’ve not mentioned yet: Documentation!&lt;/p&gt;
&lt;p&gt;Since starting my position at the Turing, I’ve come to fully appreciate how fundamental good documentation is to the success of a project. Clearly-written instructions covering the purpose of the project, how to install/run the code, and what kind of inputs/outputs to expect make it much easier for a new person to quickly get to grips with the project. And as result, it’s far more likely to be referenced and reused. While my team begin familiarizing themselves with the infrastructure and goals of my project, I begin an overhaul of the documentation whilst keeping an eye on the repository to manage incoming issues and pull requests.&lt;/p&gt;
&lt;p&gt;Take that, Imposter Syndrome!&lt;/p&gt;
&lt;h2 id="day-2-the-team-makes-progress"&gt;Day 2: The team makes progress&lt;/h2&gt;
&lt;p&gt;It’s the second day of the sprint and ‘Team BinderHub’ gather again, our enthusiasm not diminished yet!&lt;/p&gt;
&lt;p&gt;I very quickly set goals for the day. I want the button to work by the end of the day as I’m hoping the final day can be used to work on an idea Tania has to use &lt;a href="https://azure.microsoft.com/en-gb/services/devops/pipelines/"&gt;Azure’s DevOps Pipelines&lt;/a&gt; to automatically update the deployed BinderHub as new commits come into the host repository. This would be a very handy feature for those (like me!) maintaining BinderHubs at their own institutions. Anything to automate and reduce the number of commands we have to type!&lt;/p&gt;
&lt;p&gt;I ask Tim to begin working on the deploy script itself, to add tests where necessary and tidy up some of the parsing of the variables. The next steps are to build a Dockerfile that runs the deploy script and an &lt;a href="https://docs.microsoft.com/en-gb/azure/azure-resource-manager/resource-group-overview"&gt;ARM (Azure Resource Manager) template&lt;/a&gt; that controls the form that the blue button links to.&lt;/p&gt;
&lt;p&gt;Again, I’m managing the documentation, keeping up with changes we make to the code-base and functionality. Similarly, I keep watch over the repository to manage incoming pull requests and merge conflicts and also make a start on the amendments to the BinderHub workshop Diego has compiled.&lt;/p&gt;
&lt;p&gt;My Imposter Syndrome is definitely subsiding as I begin to feel more like I understand the skills of my team and we are all making the best use of our time.&lt;/p&gt;
&lt;h2 id="day-3-document-document-document"&gt;Day 3: Document, document, document&lt;/h2&gt;
&lt;p&gt;For the third and final day of the sprint we are in a new venue: the Microsoft Reactor. This is a workspace in the Shoreditch area of London where we are offered free pizza and cookies and a DJ to provide the soundtrack to our code. (OK, less an &lt;em&gt;actual&lt;/em&gt; DJ, more of a software engineer with Spotify Premium. 😜) What I will say though, Microsoft’s beverage-making facilities have nothing on the Turing’s iPad coffee maker! 😉&lt;/p&gt;
&lt;p&gt;Our goals for the last day? Consolidate and document! Ideally get the button working if possible, but the top priority is to make it as easy as possible for the team (or someone new!) to come along to the repository and finish what we have started.&lt;/p&gt;
&lt;p&gt;We decide that there isn’t enough time left or infrastructure in place to implement the Azure DevOps Pipeline for automatic upgrades; instead, Tania begins working on a tutorial so we can implement it later.&lt;/p&gt;
&lt;p&gt;Tim and I end up in a bit of GitHub hell as we realize that the code to create the Kubernetes cluster is in the setup script, not the deploy script. We refactor some parts so that all of the resources are deployed from the deploy script, and this also means that the Dockerfile only needs to find one script to execute. However, this refactoring causes a complicated merge conflict and some of the bug fixes Tim implemented disappear in a squash merge. (This sounded difficult enough to resolve that I’ve been put off learning about squash merges since!) As team leader, I try to orchestrate whose pull request should be merged first so that all the right code ends up in master.&lt;/p&gt;
&lt;h2 id="what-did-we-learn-and-do"&gt;What did we learn and do?&lt;/h2&gt;
&lt;p&gt;By the end of the sprint, we don’t quite have a working button deployment, but we do have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a set of streamlined scripts for auto-deployment based on the contents of a JSON file,&lt;/li&gt;
&lt;li&gt;an ARM template and Dockerfile that will provide the backend to the blue button after some further debugging,&lt;/li&gt;
&lt;li&gt;a plan to move the project forwards after the sprint.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So what did I learn from those three days?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coding with other people is fun!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Paired programming is something we try to achieve at the Turing, but it can be difficult to do depending on the project and the time constraints of those working on it.&lt;/p&gt;
&lt;p&gt;This was the first time I’d experienced true collaboration. Where I had an idea that I wasn’t sure how to implement, and someone with the skills had helped me shape it and realize it. It gave me a sense of community and belonging. I hope I’ve forged connections with ‘Team BinderHub’ that will last the duration of our careers and we can work together again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;There’s a role for everyone in a team and these are equally important&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Even if it’s reviewing code or writing documentation, these are as important (arguably, more so) than the code itself. Code that does what you think it’s doing and has been explained well will have a much longer lifespan than code that is difficult to follow, regardless of how clever it is, and poorly documented.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I found my strength as a leader&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You might remember at the beginning of this blog post I mentioned that I’d never led a hack project before, so I also learned a lot about my leadership capabilities.&lt;/p&gt;
&lt;p&gt;I think I did well. I identified the strengths of each of my team members and gave them a task suited to them whilst letting them explore new concepts, offering my own insight and opinions when required.&lt;/p&gt;
&lt;p&gt;I also think that it was a good choice for me to not be too involved in the coding aspect of this project. Managing the flow into the repository and updating the documentation as new code came in meant that I managed to maintain an overall perspective of the project and could switch gears as questions came in from different areas. I don’t think I could have maintained such a view if I’d been buried in code, and I can always learn from the scripts that we’ve developed at a later point.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hackathons are not where projects end&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;While the first 80% of a project to get the infrastructure in place can be achieved in a short amount of time like a hackathon, the last 20% is &lt;strong&gt;hard&lt;/strong&gt; and often takes longer. But this extra effort is necessary for the software to be taken up by others.&lt;/p&gt;
&lt;p&gt;‘Team BinderHub’ continued working on this project over Slack and GitHub to finally make our &lt;a href="https://github.com/alan-turing-institute/binderhub-deploy/releases"&gt;version 1 release&lt;/a&gt; on &lt;a href="https://twitter.com/ixek/status/1138422778040922112"&gt;June 11th&lt;/a&gt; — almost 3 weeks after the end of the sprint!&lt;/p&gt;
&lt;p&gt;If you’d like to try the button to deploy your own BinderHub (or contribute a new feature!), the repo can be found here 👉 &lt;a href="https://github.com/alan-turing-institute/binderhub-deploy"&gt;github.com/alan-turing-institute/binderhub-deploy&lt;/a&gt;. Look for the button below!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/diving-into-leadership-to-build-push-button-code/images/003-1_skpynPlvqIbdx3BUph76iA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thank You!&lt;/strong&gt; 💖&lt;/p&gt;
&lt;p&gt;I’d like to thank a few people who made this possible:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gerard, Imperial College, Tania and Lee Stott from Microsoft for organising such an inspiring event;&lt;/li&gt;
&lt;li&gt;‘Team BinderHub’ for coming along on this wild ride with me;&lt;/li&gt;
&lt;li&gt;The Binder Team for accepting me into the community and giving me the space to develop such projects;&lt;/li&gt;
&lt;li&gt;and &lt;a href="https://github.com/alan-turing-institute/the-turing-way"&gt;&lt;em&gt;The Turing Way&lt;/em&gt;&lt;/a&gt; team who introduced me to Binder and the value of community (and documentation!).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;—&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: this is cross-posted with&lt;/em&gt; &lt;a href="https://www.turing.ac.uk/research/research-programmes/research-engineering/programme-articles/diving-leadership-build-push-button-code"&gt;&lt;em&gt;the Turing Institute blog&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
</content><category term="community"/><category term="hackathons"/></entry></feed>