Skip to content

Commit 0545128

Browse files
committed
Synchronized build
1 parent 56ec913 commit 0545128

File tree

7 files changed

+516
-489
lines changed

7 files changed

+516
-489
lines changed

blog/entries/automate-github-for-more-than-CI CD/index.html

+41-41
Original file line numberDiff line numberDiff line change
@@ -303,57 +303,57 @@ <h3 id="release-note-generation">Release note generation</h3><p>Our frontend Vue
303303
</figcaption>
304304
</figure>
305305
</div><p>The quality of these release notes made them quite tedious to generate manually. With the <a href="https://github.com/marketplace/actions/release-drafter">release drafter action</a>, we're able to automatically update a draft release note on every pull request to CC Search. The action lets us configure the line added for each pull request with some basic templating which includes variables for the pr number, title, and author (among others):</p>
306-
<div class="hll"><pre><span></span><span class="nt">change-template</span><span class="p">:</span> <span class="s">&#39;-</span><span class="nv"> </span><span class="s">$TITLE:</span><span class="nv"> </span><span class="s">#$NUMBER</span><span class="nv"> </span><span class="s">by</span><span class="nv"> </span><span class="s">@$AUTHOR&#39;</span>
306+
<div class="hll"><pre><span></span><span class="nt">change-template</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;-</span><span class="nv"> </span><span class="s">$TITLE:</span><span class="nv"> </span><span class="s">#$NUMBER</span><span class="nv"> </span><span class="s">by</span><span class="nv"> </span><span class="s">@$AUTHOR&#39;</span><span class="w"></span>
307307
</pre></div>
308308
<p><br />This means each pull request gets a line like this in our release notes:</p>
309309
<blockquote><p>Enable web monetization on single result pages: <strong>#1191</strong> by <strong>@zackkrida</strong></p>
310310
</blockquote>
311311
<p>Perfect! We can also map GitHub labels on our pull requests to the sections of our generated release notes, like so:</p>
312-
<div class="hll"><pre><span></span><span class="nt">categories</span><span class="p">:</span>
313-
<span class="p p-Indicator">-</span> <span class="nt">title</span><span class="p">:</span> <span class="s">&#39;New</span><span class="nv"> </span><span class="s">Features&#39;</span>
314-
<span class="nt">label</span><span class="p">:</span> <span class="s">&#39;feature&#39;</span>
315-
<span class="p p-Indicator">-</span> <span class="nt">title</span><span class="p">:</span> <span class="s">&#39;Bug</span><span class="nv"> </span><span class="s">Fixes&#39;</span>
316-
<span class="nt">label</span><span class="p">:</span>
317-
<span class="p p-Indicator">-</span> <span class="s">&#39;bug&#39;</span>
318-
<span class="p p-Indicator">-</span> <span class="s">&#39;critical&#39;</span>
312+
<div class="hll"><pre><span></span><span class="nt">categories</span><span class="p">:</span><span class="w"></span>
313+
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;New</span><span class="nv"> </span><span class="s">Features&#39;</span><span class="w"></span>
314+
<span class="w"> </span><span class="nt">label</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;feature&#39;</span><span class="w"></span>
315+
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;Bug</span><span class="nv"> </span><span class="s">Fixes&#39;</span><span class="w"></span>
316+
<span class="w"> </span><span class="nt">label</span><span class="p">:</span><span class="w"></span>
317+
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&#39;bug&#39;</span><span class="w"></span>
318+
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&#39;critical&#39;</span><span class="w"></span>
319319
</pre></div>
320320
<p>The resulting release notes require no manual editing at release time, and has saved us hours over time and allows our developers to focus on DevOps work instead of copywriting on release days. We also never miss a contribution or expression of gratitude to one of our contributors. You can read the <a href="https://github.com/creativecommons/cccatalog-frontend/releases/latest">latest CC Search release notes</a> or <a href="https://github.com/creativecommons/cccatalog-frontend/blob/develop/.github/release-drafter.yml">see our full release-drafter.yml file here</a>.</p>
321321
<h3 id="repository-normalization">Repository Normalization</h3><p>Within a private repository of internal helper scripts, the CC technical team has a number of Github Actions which trigger Python scripts to keep configuration standardized across our repositories. We casually call this process "repository normalization". One such script ensures that we use a standard set of GitHub labels across all of our projects. This consistency helps us do things like direct users to <a href="https://github.com/search?q=org%3Acreativecommons+label%3A%22help+wanted%22+state%3Aopen&amp;type=Issues">open issues in need of assistance</a> across the organization, or issues <a href="https://github.com/search?q=org%3Acreativecommons+label%3A%22good+first+issue%22+state%3Aopen&amp;type=Issues">good for first-time open source contributors</a>. With GitHub Actions, its easy to set up scheduled tasks with only a few lines of human-readable configuration. Here's the gist of running a Python script daily, for example:</p>
322-
<div class="hll"><pre><span></span><span class="nt">name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">Example scheduled python action</span>
323-
<span class="nt">on</span><span class="p">:</span>
324-
<span class="nt">schedule</span><span class="p">:</span>
325-
<span class="p p-Indicator">-</span> <span class="nt">cron</span><span class="p">:</span> <span class="s">&#39;0</span><span class="nv"> </span><span class="s">0</span><span class="nv"> </span><span class="s">*</span><span class="nv"> </span><span class="s">*</span><span class="nv"> </span><span class="s">*&#39;</span>
326-
<span class="nt">push</span><span class="p">:</span>
327-
<span class="nt">branches</span><span class="p">:</span>
328-
<span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">master</span>
329-
<span class="nt">jobs</span><span class="p">:</span>
330-
<span class="nt">build</span><span class="p">:</span>
331-
<span class="nt">runs-on</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">ubuntu-latest</span>
332-
<span class="nt">steps</span><span class="p">:</span>
333-
<span class="p p-Indicator">-</span> <span class="nt">uses</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">actions/checkout@v2</span>
334-
<span class="p p-Indicator">-</span> <span class="nt">name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">Set up Python 3.7</span>
335-
<span class="nt">uses</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">actions/setup-python@v1</span>
336-
<span class="nt">with</span><span class="p">:</span>
337-
<span class="nt">python-version</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">3.7</span>
338-
<span class="p p-Indicator">-</span> <span class="nt">name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">Install dependencies</span>
339-
<span class="nt">run</span><span class="p">:</span> <span class="p p-Indicator">|</span>
340-
<span class="no">python -m pip install --upgrade pip</span>
341-
<span class="no">python -m pip install pipenv</span>
342-
<span class="no">pipenv install</span>
343-
<span class="p p-Indicator">-</span> <span class="nt">name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">Export token to env and run our script</span>
344-
<span class="nt">run</span><span class="p">:</span> <span class="p p-Indicator">|</span>
345-
<span class="no">pipenv run python our-script.py</span>
346-
<span class="nt">env</span><span class="p">:</span>
347-
<span class="nt">ADMIN_GITHUB_TOKEN</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">${{ secrets.ADMIN_GITHUB_TOKEN }}</span>
322+
<div class="hll"><pre><span></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Example scheduled python action</span><span class="w"></span>
323+
<span class="nt">on</span><span class="p">:</span><span class="w"></span>
324+
<span class="w"> </span><span class="nt">schedule</span><span class="p">:</span><span class="w"></span>
325+
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">cron</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;0</span><span class="nv"> </span><span class="s">0</span><span class="nv"> </span><span class="s">*</span><span class="nv"> </span><span class="s">*</span><span class="nv"> </span><span class="s">*&#39;</span><span class="w"></span>
326+
<span class="w"> </span><span class="nt">push</span><span class="p">:</span><span class="w"></span>
327+
<span class="w"> </span><span class="nt">branches</span><span class="p">:</span><span class="w"></span>
328+
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">master</span><span class="w"></span>
329+
<span class="nt">jobs</span><span class="p">:</span><span class="w"></span>
330+
<span class="w"> </span><span class="nt">build</span><span class="p">:</span><span class="w"></span>
331+
<span class="w"> </span><span class="nt">runs-on</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ubuntu-latest</span><span class="w"></span>
332+
<span class="w"> </span><span class="nt">steps</span><span class="p">:</span><span class="w"></span>
333+
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">actions/checkout@v2</span><span class="w"></span>
334+
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Set up Python 3.7</span><span class="w"></span>
335+
<span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">actions/setup-python@v1</span><span class="w"></span>
336+
<span class="w"> </span><span class="nt">with</span><span class="p">:</span><span class="w"></span>
337+
<span class="w"> </span><span class="nt">python-version</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3.7</span><span class="w"></span>
338+
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Install dependencies</span><span class="w"></span>
339+
<span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">|</span><span class="w"></span>
340+
<span class="w"> </span><span class="no">python -m pip install --upgrade pip</span><span class="w"></span>
341+
<span class="w"> </span><span class="no">python -m pip install pipenv</span><span class="w"></span>
342+
<span class="w"> </span><span class="no">pipenv install</span><span class="w"></span>
343+
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Export token to env and run our script</span><span class="w"></span>
344+
<span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">|</span><span class="w"></span>
345+
<span class="w"> </span><span class="no">pipenv run python our-script.py</span><span class="w"></span>
346+
<span class="w"> </span><span class="nt">env</span><span class="p">:</span><span class="w"></span>
347+
<span class="w"> </span><span class="nt">ADMIN_GITHUB_TOKEN</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.ADMIN_GITHUB_TOKEN }}</span><span class="w"></span>
348348
</pre></div>
349349
<p>Internally and publicly, we use <a href="https://github.com/orgs/creativecommons/projects">GitHub Projects</a> to manage our bi-weekly sprints and backlogs. The <a href="https://github.com/subhamX/github-project-bot">GitHub Project Bot</a> action was built by <a href="https://github.com/subhamX">one of our community contributors</a> and allows us to add pull requests to our project columns. Here's an example step in such a job:</p>
350-
<div class="hll"><pre><span></span><span class="p p-Indicator">-</span> <span class="nt">name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">Handle cccatalog-frontend Repo</span>
351-
<span class="nt">uses</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">subhamX/github-project-bot@v1.0.0</span>
352-
<span class="nt">with</span><span class="p">:</span>
353-
<span class="nt">ACCESS_TOKEN</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">${{ secrets.ADMIN_GITHUB_TOKEN }}</span>
354-
<span class="nt">COLUMN_NAME</span><span class="p">:</span> <span class="s">&quot;In</span><span class="nv"> </span><span class="s">Progress</span><span class="nv"> </span><span class="s">(Community)&quot;</span>
355-
<span class="nt">PROJECT_URL</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">https://github.com/orgs/creativecommons/projects/7</span>
356-
<span class="nt">REPO_URL</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">https://github.com/creativecommons/cccatalog-frontend</span>
350+
<div class="hll"><pre><span></span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Handle cccatalog-frontend Repo</span><span class="w"></span>
351+
<span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">subhamX/github-project-bot@v1.0.0</span><span class="w"></span>
352+
<span class="w"> </span><span class="nt">with</span><span class="p">:</span><span class="w"></span>
353+
<span class="w"> </span><span class="nt">ACCESS_TOKEN</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${{ secrets.ADMIN_GITHUB_TOKEN }}</span><span class="w"></span>
354+
<span class="w"> </span><span class="nt">COLUMN_NAME</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;In</span><span class="nv"> </span><span class="s">Progress</span><span class="nv"> </span><span class="s">(Community)&quot;</span><span class="w"></span>
355+
<span class="w"> </span><span class="nt">PROJECT_URL</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://github.com/orgs/creativecommons/projects/7</span><span class="w"></span>
356+
<span class="w"> </span><span class="nt">REPO_URL</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">https://github.com/creativecommons/cccatalog-frontend</span><span class="w"></span>
357357
</pre></div>
358358
<p>We have additional scripts that sync our community team members across our open source website and GitHub, and several others that do even more of this cross-platform synchronization work. All of these scripts relive significant burden off of our engineering manager and open source community coordinator.</p>
359359
<h3 id="dependency-updates">Dependency Updates</h3><p>Modern JavaScript projects are built atop piles of 3rd party dependencies. This frees developers to focus on product code instead of writing the same utility code over and over again, but exposes projects to issues of security and dependency management. To help alleviate these issues, GitHub <a href="https://github.blog/2019-05-23-introducing-new-ways-to-keep-your-code-secure/#automated-security-fixes-with-dependabot">acquired a startup called Dependabot</a> which initially focused on automatic security updates for repositories. Dependabot creates pull requests that update third-party code with known security vulnerabilities to the latest safe and stable versions.</p>

0 commit comments

Comments
 (0)