<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Git | Haobin Tan</title><link>https://haobin-tan.netlify.app/tags/git/</link><atom:link href="https://haobin-tan.netlify.app/tags/git/index.xml" rel="self" type="application/rss+xml"/><description>Git</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Fri, 06 Jan 2023 00:00:00 +0000</lastBuildDate><image><url>https://haobin-tan.netlify.app/media/icon_hu7d15bc7db65c8eaf7a4f66f5447d0b42_15095_512x512_fill_lanczos_center_3.png</url><title>Git</title><link>https://haobin-tan.netlify.app/tags/git/</link></image><item><title>GitHub Profile</title><link>https://haobin-tan.netlify.app/docs/coding/git/git-recipes/github_profile/</link><pubDate>Mon, 21 Mar 2022 00:00:00 +0000</pubDate><guid>https://haobin-tan.netlify.app/docs/coding/git/git-recipes/github_profile/</guid><description>&lt;h2 id="what-is-github-profile-readme">What is GitHub Profile README?&lt;/h2>
&lt;ul>
&lt;li>A feature of GitHub&lt;/li>
&lt;li>A personalizable introduction section which allows the user to write details about themselves and showcase on his/her GitHub repository&lt;/li>
&lt;li>Appears at the top of your GitHub home page (above the pinned repositories)&lt;/li>
&lt;/ul>
&lt;h2 id="how-to-create-a-github-profile-readme">How to create a GitHub profile README?&lt;/h2>
&lt;ol>
&lt;li>Create a new repository and name it with the username of your GitHub account
&lt;ul>
&lt;li>After entering the username, GitHub displays a message describing that you’re about to create a GitHub special repository.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Add a &lt;code>README.md&lt;/code> in the repository&lt;/li>
&lt;li>Write details/interests/skills about yourself in &lt;code>README.md&lt;/code>&lt;/li>
&lt;li>Set the repository &lt;strong>public&lt;/strong> if it is private during the development&lt;/li>
&lt;/ol>
&lt;h2 id="useful-linkstools">Useful links/tools&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://rahuldkjain.github.io/gh-profile-readme-generator/">GitHub Profile README Generator&lt;/a>&lt;/li>
&lt;li>Icons: &lt;a href="https://github.com/devicons/devicon">devicon&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/anuraghazra/github-readme-stats#github-stats-card">github-readme-stats&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://github-readme-streak-stats.herokuapp.com/demo/">GitHub Readme Streak Stats&lt;/a>&lt;/li>
&lt;li>Collection of some interesting GitHub Profile README: &lt;a href="https://github.com/abhisheknaiidu/awesome-github-profile-readme">awesome-github-profile-readme&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="reference">Reference&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://www.sitepoint.com/github-profile-readme/">How to Create an Impressive GitHub Profile README&lt;/a>&lt;/li>
&lt;li>Video tutorial:
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ECuqb5Tv9qI?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"
>&lt;/iframe>
&lt;/div>
&lt;/li>
&lt;/ul></description></item><item><title>GitHub Actions</title><link>https://haobin-tan.netlify.app/docs/coding/git/github_actions/</link><pubDate>Thu, 05 Jan 2023 00:00:00 +0000</pubDate><guid>https://haobin-tan.netlify.app/docs/coding/git/github_actions/</guid><description/></item><item><title>Getting Started</title><link>https://haobin-tan.netlify.app/docs/coding/git/github_actions/quick_start/</link><pubDate>Thu, 05 Jan 2023 00:00:00 +0000</pubDate><guid>https://haobin-tan.netlify.app/docs/coding/git/github_actions/quick_start/</guid><description>&lt;h2 id="what-is-github-actions">What is GitHub Actions?&lt;/h2>
&lt;p>GitHub Actions is a continuous integration and continuous delivery (CI/CD) platform that &lt;strong>allows you to automate your build, test, and deployment pipeline&lt;/strong>. You can create workflows that build and test every pull request to your repository, or deploy merged pull requests to production.&lt;/p>
&lt;p>GitHub Actions use &lt;strong>yaml&lt;/strong> files to define event, jobs, and steps.&lt;/p>
&lt;p>These yaml files are stored in &lt;code>.github/workflows&lt;/code> directory.&lt;/p>
&lt;p>An &lt;strong>event&lt;/strong> automatically triggers the workflow, which contains a &lt;strong>job&lt;/strong>. The job then uses the &lt;strong>step&lt;/strong>s to control the order, in which the &lt;strong>action&lt;/strong>s are run. These actions are the commands that automate the software testing.&lt;/p>
&lt;h2 id="github-actions-components">GitHub Actions Components&lt;/h2>
&lt;figure>&lt;img src="https://raw.githubusercontent.com/EckoTan0804/upic-repo/master/uPic/1*8mUtip6z_oydfLi4P86KUw.png"
alt="Source: Getting started with GitHub Actions">&lt;figcaption>
&lt;p>Source: &lt;a href="https://itnext.io/getting-started-with-github-actions-fe94167dbc6d">Getting started with GitHub Actions&lt;/a>&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>You can configure a GitHub Actions &lt;em>&lt;strong>workflow&lt;/strong>&lt;/em> to be triggered when an &lt;em>&lt;strong>event&lt;/strong>&lt;/em> occurs in your repository, such as a pull request being opened or an issue being created. Your workflow contains one or more &lt;em>&lt;strong>jobs&lt;/strong>&lt;/em> which can run in sequential order or in parallel. Each job will run inside its own virtual machine &lt;em>&lt;strong>runner&lt;/strong>&lt;/em>, or inside a container, and has one or more &lt;em>&lt;strong>steps&lt;/strong>&lt;/em> that either run a script that you define or run an &lt;em>&lt;strong>action&lt;/strong>&lt;/em>, which is a reusable extension that can simplify your workflow.&lt;/p>
&lt;h3 id="workflow">Workflow&lt;/h3>
&lt;p>A workflow is a configurable automated process that will run one or more jobs.&lt;/p>
&lt;ul>
&lt;li>Defined by YAML files in the &lt;code>.github/workflows&lt;/code> directory in a repository. A repository can have multiple workflows, each of which can perform a different set of tasks.&lt;/li>
&lt;li>Runs when triggered by an event in your repository, or they can be triggered manually, or at a defined schedule.&lt;/li>
&lt;li>You can reference a workflow within another workflow, see &amp;ldquo;&lt;a href="https://docs.github.com/en/actions/learn-github-actions/reusing-workflows">Reusing workflows&lt;/a>.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>(For more information about workflows, see &amp;ldquo;&lt;a href="https://docs.github.com/en/actions/using-workflows">Using workflows&lt;/a>.&amp;rdquo;)&lt;/p>
&lt;h3 id="events">Events&lt;/h3>
&lt;p>An event is a specific activity in a repository that triggers a workflow run.&lt;/p>
&lt;ul>
&lt;li>For example, activity can originate from GitHub when someone creates a pull request, opens an issue, or pushes a commit to a repository.&lt;/li>
&lt;/ul>
&lt;p>For a complete list of events that can be used to trigger workflows, see &lt;a href="https://docs.github.com/en/actions/reference/events-that-trigger-workflows">Events that trigger workflows&lt;/a>.&lt;/p>
&lt;h3 id="jobs">Jobs&lt;/h3>
&lt;p>A job is a set of &lt;strong>steps&lt;/strong> in a workflow that execute on the same runner.&lt;/p>
&lt;ul>
&lt;li>Each step is either a shell script that will be executed, or an &lt;em>action&lt;/em> that will be run.&lt;/li>
&lt;li>Steps are executed &lt;em>in order&lt;/em> and are dependent on each other.&lt;/li>
&lt;li>Each step is executed on the same runner. (you can share data from one step to another. )&lt;/li>
&lt;/ul>
&lt;p>By default, jobs have no dependencies and run in &lt;em>parallel&lt;/em> with each other.&lt;/p>
&lt;p>When a job takes a dependency on another job, it will wait for the dependent job to complete before it can run.&lt;/p>
&lt;h3 id="actions">Actions&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>An &lt;em>action&lt;/em> is a custom application for the GitHub Actions platform that performs a complex but frequently repeated task.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Use an action to help reduce the amount of repetitive code that you write in your workflow files.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>You can write your own actions (see &amp;ldquo;&lt;a href="https://docs.github.com/en/actions/creating-actions">Creating actions&lt;/a>&amp;rdquo;), or you can find actions to use in your workflows in the GitHub Marketplace.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3 id="runners">Runners&lt;/h3>
&lt;p>A runner is a server that runs your workflows when they&amp;rsquo;re triggered.&lt;/p>
&lt;ul>
&lt;li>A runner is a server that runs your workflows when they&amp;rsquo;re triggered.&lt;/li>
&lt;li>GitHub provides Ubuntu Linux, Microsoft Windows, and macOS runners to run your workflows. Each workflow run executes in a fresh, newly-provisioned virtual machine.&lt;/li>
&lt;/ul>
&lt;h2 id="understanding-the-workflow-file">Understanding the Workflow File&lt;/h2>
&lt;p>Let&amp;rsquo;s say we have created a &lt;code>learn-github-actions.yml&lt;/code> in the &lt;code>.github/workflows/&lt;/code> directory in the repository:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Optional&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># The name of the workflow &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># as it will appear in the &amp;#34;Actions&amp;#34; tab of the GitHub repository. &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">learn-github-actions&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># Optional&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># The name for workflow runs generated from the workflow, &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># which will appear in the list of workflow runs on your repository&amp;#39;s &amp;#34;Actions&amp;#34; tab.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">run-name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ github.actor }} is learning GitHub Actions&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># Trigger for this workflow.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># Here we use the `push` event, so a workflow run is triggered every time&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># someone pushes a change to the repository or merges a pull request.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">push]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># Group together all the jobs that run in this workflow&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">check-bats-version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># Define a job named `check-bats-version`&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># specify the runner on which this job runs&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># Group together all the steps that run in this job&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># The `uses` keyword specifies that this step will run `v3` of the `actions/checkout` action. &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># This is an action that checks out your repository onto the runner,`&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># allowing you to run scripts or other actions against your code.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># You should use the checkout action any time your workflow will run against the repository&amp;#39;s code.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/checkout@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/setup-node@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">node-version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;14&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># The `run` keyword tells the job to execute a command on the runner.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">npm install -g bats&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">bats -v&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Visualize the workflow we created in a hierarchy:&lt;/p>
&lt;p>&lt;img src="https://raw.githubusercontent.com/EckoTan0804/upic-repo/master/uPic/overview-actions-event.png" alt="Workflow overview">&lt;/p>
&lt;p>As we can see, each step executes a single action or shell script. Steps 1 and 2 run actions, while steps 3 and 4 run shell scripts.&lt;/p>
&lt;h2 id="view-the-activity-for-a-workflow-run">View the Activity for a Workflow Run&lt;/h2>
&lt;p>When your workflow is triggered, a &lt;em>workflow run&lt;/em> is created that executes the workflow. After a workflow run has started, you can see a visualization graph of the run&amp;rsquo;s progress and view each step&amp;rsquo;s activity on GitHub.&lt;/p>
&lt;p>A step by step guide see: &lt;a href="https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions#viewing-the-activity-for-a-workflow-run">Viewing the activity for a workflow run&lt;/a>&lt;/p>
&lt;h2 id="quick-start-demo">Quick Start Demo&lt;/h2>
&lt;p>See &lt;a href="https://docs.github.com/en/actions/quickstart">Quickstart for GitHub Actions&lt;/a>&lt;/p>
&lt;h2 id="reference">Reference&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://docs.github.com/en/actions">GitHub Actions documentation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions">Understanding GitHub Actions&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://itnext.io/getting-started-with-github-actions-fe94167dbc6d">Getting started with GitHub Actions&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Actions Usage</title><link>https://haobin-tan.netlify.app/docs/coding/git/github_actions/actions/</link><pubDate>Thu, 05 Jan 2023 00:00:00 +0000</pubDate><guid>https://haobin-tan.netlify.app/docs/coding/git/github_actions/actions/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>Actions are the building blocks that power your workflow.&lt;/p>
&lt;p>A workflow can contain actions created by the &lt;a href="https://github.com/marketplace?category=&amp;amp;query=&amp;amp;type=actions&amp;amp;verification=">community&lt;/a> or customized directly within your repository.&lt;/p>
&lt;h2 id="adding-an-action-to-workflow">Adding an Action to Workflow&lt;/h2>
&lt;h3 id="adding-an-action-from-github-marketplace">Adding an action from GitHub Marketplace&lt;/h3>
&lt;p>You can find a number of useful actions in &lt;a href="https://github.com/marketplace?category=&amp;amp;query=&amp;amp;type=actions&amp;amp;verification=">GitHub Marketplace&lt;/a>.&lt;/p>
&lt;p>An action&amp;rsquo;s listing page includes the action&amp;rsquo;s version and the workflow syntax required to use the action. To keep your workflow stable even when updates are made to an action, you can reference the version of the action to use by specifying the Git or Docker tag number in your workflow file.&lt;/p>
&lt;p>Steps:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Navigate to the action you want to use in your workflow.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Choose the version you want to use and copy the workflow syntax&lt;/p>
&lt;p>&lt;img src="https://raw.githubusercontent.com/EckoTan0804/upic-repo/master/uPic/%E6%88%AA%E5%B1%8F2023-01-06%2014.12.07-20230106145904658.png" alt="截屏2023-01-06 14.12.07">&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Paste the syntax as a new step in your workflow. (For more information, see &amp;ldquo;&lt;a href="https://docs.github.com/en/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#jobsjob_idsteps">Workflow syntax for GitHub Actions&lt;/a>.&amp;rdquo;)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>If the action requires you to provide inputs, set them in your workflow. (For information on inputs an action might require, see &amp;ldquo;&lt;a href="https://docs.github.com/en/actions/learn-github-actions/finding-and-customizing-actions#using-inputs-and-outputs-with-an-action">Using inputs and outputs with an action&lt;/a>.&amp;rdquo;)&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="adding-an-action-from-the-same-repository">Adding an action from the same repository&lt;/h3>
&lt;p>If an action is defined in the same repository where your workflow file uses the action, you can reference the action with either the ‌&lt;code>{owner}/{repo}@{ref}&lt;/code> or &lt;code>./path/to/dir&lt;/code> syntax in your workflow file.&lt;/p>
&lt;p>Example:&lt;/p>
&lt;p>Repository file structure:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-txt" data-lang="txt">&lt;span class="line">&lt;span class="cl">|-- hello-world (repository)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| |__ .github
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| └── workflows
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| └── my-first-workflow.yml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| └── actions
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| |__ hello-world-action
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| └── action.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Workflow file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">build&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># This step checks out a copy of your repository.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/checkout@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># This step references the directory that contains the action.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">./.github/actions/hello-world-action&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="adding-an-action-from-a-different-repository">Adding an action from a different repository&lt;/h3>
&lt;p>If an action is defined in a different repository than your workflow file, you can reference the action with the &lt;code>{owner}/{repo}@{ref}&lt;/code> syntax in your workflow file. The action must be stored in a public repository.&lt;/p>
&lt;p>Example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">my_first_job&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">My first step&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/setup-node@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="referencing-a-container-on-docker-hub">Referencing a container on Docker Hub&lt;/h3>
&lt;p>If an action is defined in a published Docker container image on Docker Hub, you must reference the action with the &lt;code>docker://{image}:{tag}&lt;/code> syntax in your workflow file.&lt;/p>
&lt;p>To protect your code and data, it is strongly recommend you verify the integrity of the Docker container image from Docker Hub before using it in your workflow.&lt;/p>
&lt;p>Example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">my_first_job&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">My first step&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">docker://alpine:3.8&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="using-release-management-for-your-custom-actions">Using Release Management for Your Custom Actions&lt;/h2>
&lt;p>Similar to any dependency, you should indicate the version of the action you&amp;rsquo;d like to use based on your comfort with automatically accepting updates to the action.&lt;/p>
&lt;p>You will designate the version of the action in your workflow file. Check the action&amp;rsquo;s documentation for information on their approach to release management, and to see which tag, branch, or SHA value to use.&lt;/p>
&lt;h3 id="using-tags">Using tags&lt;/h3>
&lt;p>Tags are useful for letting you decide when to switch between major and minor versions, but these are more ephemeral and can be moved or deleted by the maintainer.&lt;/p>
&lt;p>Example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/javascript-action@v1.0.1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="using-shas">Using SHAs&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>If you need more reliable versioning, you should use the SHA value associated with the version of the action, as SHAs are immutable and therefore more reliable than tags or branches.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>However this approach means you will not automatically receive updates for an action, including important bug fixes and security updates.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>You must use a commit&amp;rsquo;s full SHA value, and not an abbreviated value. This example targets an action&amp;rsquo;s SHA.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/javascript-action@172239021f7ba04fe7327647b213799853a9eb89&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="using-branches">Using branches&lt;/h3>
&lt;p>Specifying a target branch for the action means it will always run the version currently on that branch. However, this approach can create problems if an update to the branch includes breaking changes.&lt;/p>
&lt;p>Example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/javascript-action@main&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># targets a branch name `main`&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="using-inputs-and-outputs-with-an-action">Using Inputs and Outputs with an Action&lt;/h2>
&lt;ul>
&lt;li>An action often accepts or requires inputs and generates outputs that you can use.
&lt;ul>
&lt;li>E.g., an action might require you to specify a path to a file, the name of a label, or other data it will use as part of the action processing.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>To see the inputs and outputs of an action, check the &lt;code>action.yml&lt;/code> or &lt;code>action.yaml&lt;/code> in the root directory of the repository.&lt;/li>
&lt;/ul>
&lt;p>Example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Example&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Receives file and generates output&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">inputs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">file-path&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># id of input&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Path to test script&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">required&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">default&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;test-file.js&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">outputs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">results-file&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># id of output&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Path to results file&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>The &lt;code>inputs&lt;/code> keyword defines a required input called &lt;code>file-path&lt;/code>, and includes a default value that will be used if none is specified.&lt;/li>
&lt;li>The &lt;code>outputs&lt;/code> keyword defines an output called &lt;code>results-file&lt;/code>, which tells you where to locate the results.&lt;/li>
&lt;/ul>
&lt;h2 id="reference">Reference&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://docs.github.com/en/actions/learn-github-actions/finding-and-customizing-actions">Finding and customizing actions&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Customization Techniques</title><link>https://haobin-tan.netlify.app/docs/coding/git/github_actions/essential_features/</link><pubDate>Fri, 06 Jan 2023 00:00:00 +0000</pubDate><guid>https://haobin-tan.netlify.app/docs/coding/git/github_actions/essential_features/</guid><description>&lt;p>GitHub Actions allow you to customize your workflows to meet the unique needs of your application and team.&lt;/p>
&lt;h2 id="using-variables-in-workflow">Using Variables in Workflow&lt;/h2>
&lt;p>GitHub Actions include default environment variables for each workflow run. If you need to use custom environment variables, you can set these in your YAML workflow file.&lt;/p>
&lt;p>Example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">example-job&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Connect to PostgreSQL&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">node client.js&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">env&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">POSTGRES_HOST&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">postgres&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">POSTGRES_PORT&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">5432&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>In this example, we create custom variables named &lt;code>POSTGRES_HOST&lt;/code> and &lt;code>POSTGRES_PORT&lt;/code>. These variables are then available to the &lt;code>node client.js&lt;/code> script.&lt;/p>
&lt;h2 id="add-scripts-to-workflow">Add Scripts to Workflow&lt;/h2>
&lt;p>You can use actions to run scripts and shell commands, which are then executed on the assigned runner.&lt;/p>
&lt;p>Example: use the &lt;code>run&lt;/code> keyword to execute &lt;code>npm install -g bats&lt;/code> on the runner.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">example-job&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">npm install -g bats&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To run a script as an action, you can store the script in your repository and supply the path and shell type. Example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">example-job&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Run build script&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">./.github/scripts/build.sh&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">shell&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">bash&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="sharing-data-between-jobs">Sharing Data between Jobs&lt;/h2>
&lt;p>If your job generates files that you want to share with another job in the same workflow, or if you want to save the files for later reference, you can store them in GitHub as &lt;em>&lt;strong>artifacts&lt;/strong>&lt;/em>.&lt;/p>
&lt;p>Artifacts are the files created when you build and test your code.&lt;/p>
&lt;ul>
&lt;li>Might include binary or package files, test results, screenshots, or log files.&lt;/li>
&lt;li>Are associated with the workflow run where they were created and can be used by another job.&lt;/li>
&lt;/ul>
&lt;p>All actions and workflows called within a run have write access to that run&amp;rsquo;s artifacts.&lt;/p>
&lt;p>Example: create a file and then upload it as an artifact&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">example-job&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Save output&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">shell&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">bash&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">| expr 1 + 1 &amp;gt; output.log&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Upload output file&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/upload-artifact@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">output-log-file&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">path&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">output.log&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To download an artifact from a separate workflow run, you can use the &lt;code>actions/download-artifact&lt;/code> action. To download an artifact from the same workflow run, your download job should specify &lt;code>needs: upload-job-name&lt;/code> so it doesn&amp;rsquo;t start until the upload job finishes.&lt;/p>
&lt;p>Example: download the artifact named &lt;code>output-log-file&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">example-job&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Download a single artifact&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/download-artifact@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">output-log-file&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="reference">Reference&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://docs.github.com/en/actions/learn-github-actions/essential-features-of-github-actions">Essential features of GitHub Actions&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Expressions</title><link>https://haobin-tan.netlify.app/docs/coding/git/github_actions/expressions/</link><pubDate>Fri, 06 Jan 2023 00:00:00 +0000</pubDate><guid>https://haobin-tan.netlify.app/docs/coding/git/github_actions/expressions/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>You can use expressions to &lt;em>programmatically&lt;/em> set environment variables in workflow files and access contexts. An expression can be any combination of literal values, references to a context, or functions. You can combine literals, context references, and functions using operators.&lt;/p>
&lt;p>Expressions are commonly used with the conditional &lt;code>if&lt;/code> keyword in a workflow file to determine whether a step should run. When an &lt;code>if&lt;/code> conditional is &lt;code>true&lt;/code>, the step will run.&lt;/p>
&lt;p>You need to use specific syntax&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="l">${{ &amp;lt;expression&amp;gt; }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>to tell GitHub to evaluate an expression rather than treat it as a string.&lt;/p>
&lt;ul>
&lt;li>When you use expressions in an &lt;code>if&lt;/code> conditional, you may omit the expression syntax (&lt;code>${{ }}&lt;/code>) because GitHub automatically evaluates the &lt;code>if&lt;/code> conditional as an expression.&lt;/li>
&lt;/ul>
&lt;h4 id="example-expression-in-an-if-conditional">Example expression in an &lt;code>if&lt;/code> conditional&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/hello-world-javascript-action@v1.1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">if&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ &amp;lt;expression&amp;gt; }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="example-setting-an-environment-variable">Example setting an environment variable&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">env&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">MY_ENV_VAR&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ &amp;lt;expression&amp;gt; }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="literals">Literals&lt;/h2>
&lt;p>You can use &lt;code>boolean&lt;/code>, &lt;code>null&lt;/code>, &lt;code>number&lt;/code>, or &lt;code>string&lt;/code> data types.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Data type&lt;/th>
&lt;th style="text-align:left">Literal value&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;code>boolean&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;code>true&lt;/code> or &lt;code>false&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>null&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;code>null&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>number&lt;/code>&lt;/td>
&lt;td style="text-align:left">Any number format supported by JSON.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>string&lt;/code>&lt;/td>
&lt;td style="text-align:left">You don&amp;rsquo;t need to enclose strings in &lt;code>${{&lt;/code> and &lt;code>}}&lt;/code>. However, if you do, you must use single quotes (&lt;code>'&lt;/code>) around the string. To use a literal single quote, escape the literal single quote using an additional single quote (&lt;code>''&lt;/code>). Wrapping with double quotes (&lt;code>&amp;quot;&lt;/code>) will throw an error.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">env&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">myNull&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ null }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">myBoolean&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ false }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">myIntegerNumber&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ 711 }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">myFloatNumber&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ -9.2 }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">myHexNumber&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ 0xff }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">myExponentialNumber&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ -2.99e-2 }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">myString&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Mona the Octocat&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">myStringInBraces&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ &amp;#39;It&amp;#39;&amp;#39;s open source!&amp;#39; }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="operators">Operators&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Operator&lt;/th>
&lt;th style="text-align:left">Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;code>( )&lt;/code>&lt;/td>
&lt;td style="text-align:left">Logical grouping&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>[ ]&lt;/code>&lt;/td>
&lt;td style="text-align:left">Index&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>.&lt;/code>&lt;/td>
&lt;td style="text-align:left">Property de-reference&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>!&lt;/code>&lt;/td>
&lt;td style="text-align:left">Not&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>&amp;lt;&lt;/code>&lt;/td>
&lt;td style="text-align:left">Less than&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>&amp;lt;=&lt;/code>&lt;/td>
&lt;td style="text-align:left">Less than or equal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>&amp;gt;&lt;/code>&lt;/td>
&lt;td style="text-align:left">Greater than&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>&amp;gt;=&lt;/code>&lt;/td>
&lt;td style="text-align:left">Greater than or equal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>==&lt;/code>&lt;/td>
&lt;td style="text-align:left">Equal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>!=&lt;/code>&lt;/td>
&lt;td style="text-align:left">Not equal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>&amp;amp;&amp;amp;&lt;/code>&lt;/td>
&lt;td style="text-align:left">And&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">`&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>GitHub performs loose equality comparisons.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>If the types do not match, GitHub coerces the type to a number. GitHub casts data types to a number using these conversions:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Type&lt;/th>
&lt;th style="text-align:left">Result&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">Null&lt;/td>
&lt;td style="text-align:left">&lt;code>0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Boolean&lt;/td>
&lt;td style="text-align:left">&lt;code>true&lt;/code> returns &lt;code>1&lt;/code> &lt;code>false&lt;/code> returns &lt;code>0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">String&lt;/td>
&lt;td style="text-align:left">Parsed from any legal JSON number format, otherwise &lt;code>NaN&lt;/code>. Note: empty string returns &lt;code>0&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Array&lt;/td>
&lt;td style="text-align:left">&lt;code>NaN&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Object&lt;/td>
&lt;td style="text-align:left">&lt;code>NaN&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/li>
&lt;li>
&lt;p>A comparison of one &lt;code>NaN&lt;/code> to another &lt;code>NaN&lt;/code> does not result in &lt;code>true&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>GitHub ignores case when comparing strings.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Objects and arrays are only considered equal when they are the &lt;em>same instance&lt;/em>.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="functions">Functions&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>GitHub offers a set of built-in functions that you can use in expressions.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Some functions cast values to a string to perform comparisons. GitHub casts data types to a string using these conversions:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Type&lt;/th>
&lt;th style="text-align:left">Result&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">Null&lt;/td>
&lt;td style="text-align:left">&lt;code>''&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Boolean&lt;/td>
&lt;td style="text-align:left">&lt;code>'true'&lt;/code> or &lt;code>'false'&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Number&lt;/td>
&lt;td style="text-align:left">Decimal format, exponential for large numbers&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Array&lt;/td>
&lt;td style="text-align:left">Arrays are not converted to a string&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Object&lt;/td>
&lt;td style="text-align:left">Objects are not converted to a string&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/li>
&lt;/ul>
&lt;h3 id="conatins">conatins&lt;/h3>
&lt;p>&lt;code>contains( search, item )&lt;/code>&lt;/p>
&lt;ul>
&lt;li>Returns &lt;code>true&lt;/code> if &lt;code>search&lt;/code> contains &lt;code>item&lt;/code>.&lt;/li>
&lt;li>If &lt;code>search&lt;/code> is an array, this function returns &lt;code>true&lt;/code> if the &lt;code>item&lt;/code> is an element in the array.&lt;/li>
&lt;li>If &lt;code>search&lt;/code> is a string, this function returns &lt;code>true&lt;/code> if the &lt;code>item&lt;/code> is a substring of &lt;code>search&lt;/code>. This function is not case sensitive. Casts values to a string.&lt;/li>
&lt;/ul>
&lt;h4 id="example">Example&lt;/h4>
&lt;p>&lt;code>contains('Hello world', 'llo')&lt;/code> returns &lt;code>true&lt;/code>.&lt;/p>
&lt;h3 id="startswith">startsWith&lt;/h3>
&lt;p>&lt;code>startsWith( searchString, searchValue )&lt;/code>&lt;/p>
&lt;p>Returns &lt;code>true&lt;/code> when &lt;code>searchString&lt;/code> starts with &lt;code>searchValue&lt;/code>. This function is not case sensitive. Casts values to a string.&lt;/p>
&lt;h4 id="example-1">Example&lt;/h4>
&lt;p>&lt;code>startsWith('Hello world', 'He')&lt;/code> returns &lt;code>true&lt;/code>.&lt;/p>
&lt;h3 id="endswith">endsWith&lt;/h3>
&lt;p>&lt;code>endsWith( searchString, searchValue )&lt;/code>&lt;/p>
&lt;p>Returns &lt;code>true&lt;/code> if &lt;code>searchString&lt;/code> ends with &lt;code>searchValue&lt;/code>. This function is not case sensitive. Casts values to a string.&lt;/p>
&lt;h4 id="example-2">Example&lt;/h4>
&lt;p>&lt;code>endsWith('Hello world', 'ld')&lt;/code> returns &lt;code>true&lt;/code>.&lt;/p>
&lt;h3 id="format">format&lt;/h3>
&lt;p>&lt;code>format( string, replaceValue0, replaceValue1, ..., replaceValueN)&lt;/code>&lt;/p>
&lt;ul>
&lt;li>Replaces values in the &lt;code>string&lt;/code>, with the variable &lt;code>replaceValueN&lt;/code>.&lt;/li>
&lt;li>Variables in the &lt;code>string&lt;/code> are specified using the &lt;code>{N}&lt;/code> syntax, where &lt;code>N&lt;/code> is an integer. You must specify at least one &lt;code>replaceValue&lt;/code> and &lt;code>string&lt;/code>. There is no maximum for the number of variables (&lt;code>replaceValueN&lt;/code>) you can use.&lt;/li>
&lt;li>Escape curly braces using double braces.&lt;/li>
&lt;/ul>
&lt;h4 id="example-3">Example&lt;/h4>
&lt;p>&lt;code>format('{{Hello {0} {1} {2}!}}', 'Mona', 'the', 'Octocat')&lt;/code> returns &amp;lsquo;{Hello Mona the Octocat!}&amp;rsquo;.&lt;/p>
&lt;h3 id="join">join&lt;/h3>
&lt;p>&lt;code>join( array, optionalSeparator )&lt;/code>&lt;/p>
&lt;ul>
&lt;li>The value for &lt;code>array&lt;/code> can be an array or a string.&lt;/li>
&lt;li>All values in &lt;code>array&lt;/code> are concatenated into a string.
&lt;ul>
&lt;li>If you provide &lt;code>optionalSeparator&lt;/code>, it is inserted between the concatenated values. Otherwise, the default separator &lt;code>,&lt;/code> is used. Casts values to a string.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="tojson">toJSON&lt;/h3>
&lt;p>&lt;code>toJSON(value)&lt;/code>&lt;/p>
&lt;ul>
&lt;li>Returns a pretty-print JSON representation of &lt;code>value&lt;/code>.&lt;/li>
&lt;li>You can use this function to debug the information provided in contexts.&lt;/li>
&lt;/ul>
&lt;h3 id="fromjson">fromJSON&lt;/h3>
&lt;p>&lt;code>fromJSON(value)&lt;/code>&lt;/p>
&lt;ul>
&lt;li>Returns a JSON object or JSON data type for &lt;code>value&lt;/code>.&lt;/li>
&lt;li>You can use this function to provide a JSON object as an evaluated expression or to convert environment variables from a string.&lt;/li>
&lt;/ul>
&lt;h3 id="hashfiles">hashFiles&lt;/h3>
&lt;p>&lt;code>hashFiles(path)&lt;/code>&lt;/p>
&lt;ul>
&lt;li>Returns a single hash for the set of files that matches the &lt;code>path&lt;/code> pattern.
&lt;ul>
&lt;li>You can provide a single &lt;code>path&lt;/code> pattern or multiple &lt;code>path&lt;/code> patterns separated by commas.&lt;/li>
&lt;li>The &lt;code>path&lt;/code> is relative to the &lt;code>GITHUB_WORKSPACE&lt;/code> directory and can only include files inside of the &lt;code>GITHUB_WORKSPACE&lt;/code>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>This function calculates an individual SHA-256 hash for each matched file, and then uses those hashes to calculate a final SHA-256 hash for the set of files.
&lt;ul>
&lt;li>If the &lt;code>path&lt;/code> pattern does not match any files, this returns an empty string.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="status-check-functions">Status Check Functions&lt;/h2>
&lt;p>You can use the following status check functions as expressions in &lt;code>if&lt;/code> conditionals. A default status check of &lt;code>success()&lt;/code> is applied unless you include one of these functions.&lt;/p>
&lt;h3 id="success">success&lt;/h3>
&lt;p>Returns &lt;code>true&lt;/code> when none of the previous steps have failed or been canceled.&lt;/p>
&lt;h4 id="example-4">Example&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">The job has succeeded&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">if&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ success() }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="always">always&lt;/h3>
&lt;p>Causes the step to always execute, and returns &lt;code>true&lt;/code>, even when canceled. A job or step will not run when a critical failure prevents the task from running. For example, if getting sources failed.&lt;/p>
&lt;h4 id="example-5">Example&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">if&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ always() }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="cancelled">cancelled&lt;/h3>
&lt;p>Returns &lt;code>true&lt;/code> if the workflow was canceled.&lt;/p>
&lt;h4 id="example-6">Example&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">if&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ cancelled() }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="failure">failure&lt;/h3>
&lt;p>Returns &lt;code>true&lt;/code> when any previous step of a job fails. If you have a chain of dependent jobs, &lt;code>failure()&lt;/code> returns &lt;code>true&lt;/code> if any ancestor job fails.&lt;/p>
&lt;h4 id="example-7">Example&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">The job has failed&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">if&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ failure() }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="ailure-with-conditions">ailure with conditions&lt;/h4>
&lt;p>You can include extra conditions for a step to run after a failure, but you must still include &lt;code>failure()&lt;/code> to override the default status check of &lt;code>success()&lt;/code> that is automatically applied to &lt;code>if&lt;/code> conditions that don&amp;rsquo;t contain a status check function.&lt;/p>
&lt;h5 id="example-8">Example&lt;/h5>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Failing step&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">demo&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">exit 1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">The demo step has failed&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">if&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ failure() &amp;amp;&amp;amp; steps.demo.conclusion == &amp;#39;failure&amp;#39; }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="object-filters">Object filters&lt;/h2>
&lt;p>You can use the &lt;code>*&lt;/code> syntax to apply a filter and select matching items in a collection.&lt;/p>
&lt;p>E.g., let&amp;rsquo;s say we have an array of objects named &lt;code>fruits&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;apple&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;quantity&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;orange&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;quantity&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;pear&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;quantity&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The filter &lt;code>fruits.*.name&lt;/code> returns the array &lt;code>[ &amp;quot;apple&amp;quot;, &amp;quot;orange&amp;quot;, &amp;quot;pear&amp;quot; ]&lt;/code>.&lt;/p>
&lt;p>You may also use the &lt;code>*&lt;/code> syntax on an object. For example, suppose you have an object named &lt;code>vegetables&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;scallions&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;colors&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;green&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;white&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;red&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ediblePortions&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;roots&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;stalks&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;beets&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;colors&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;purple&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;red&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;gold&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;white&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;pink&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ediblePortions&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;roots&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;stems&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;leaves&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;artichokes&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;colors&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;green&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;purple&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;red&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;black&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ediblePortions&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;hearts&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;stems&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;leaves&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The filter &lt;code>vegetables.*.ediblePortions&lt;/code> could evaluate to:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;roots&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;stalks&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;hearts&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;stems&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;leaves&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;roots&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;stems&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;leaves&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Since objects don&amp;rsquo;t preserve order, the order of the output can not be guaranteed.&lt;/p>
&lt;h2 id="reference">Reference&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://docs.github.com/en/actions/learn-github-actions/expressions#object-filters">Expressions&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Git</title><link>https://haobin-tan.netlify.app/docs/coding/git/</link><pubDate>Mon, 21 Mar 2022 00:00:00 +0000</pubDate><guid>https://haobin-tan.netlify.app/docs/coding/git/</guid><description/></item></channel></rss>