{"id":47174,"date":"2024-10-04T06:01:56","date_gmt":"2024-10-04T06:01:56","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=47174"},"modified":"2024-10-04T06:01:56","modified_gmt":"2024-10-04T06:01:56","slug":"github-actions-terminology","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/github-actions-terminology\/","title":{"rendered":"GitHub Actions: Terminology"},"content":{"rendered":"\n<p>Here\u2019s a table that summarizes key GitHub Actions terminology, providing a clear and concise explanation of each term:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Term<\/strong><\/th><th><strong>Definition<\/strong><\/th><\/tr><\/thead><tbody><tr><td><strong>Workflow<\/strong><\/td><td>A configurable automated process made up of one or more jobs. Defined in YAML files in <code>.github\/workflows\/<\/code>.<\/td><\/tr><tr><td><strong>Job<\/strong><\/td><td>A set of steps executed sequentially. Multiple jobs can run in parallel or sequentially.<\/td><\/tr><tr><td><strong>Step<\/strong><\/td><td>A single task that runs as part of a job. It can be a shell command or an action.<\/td><\/tr><tr><td><strong>Action<\/strong><\/td><td>A reusable command or script that can be shared and used in workflows. Defined in public repositories or locally.<\/td><\/tr><tr><td><strong>Runner<\/strong><\/td><td>A server that runs jobs. It can be GitHub-hosted (runs on GitHub servers) or self-hosted (runs on your own infrastructure).<\/td><\/tr><tr><td><strong>Event<\/strong><\/td><td>Triggers that start a workflow, such as <code>push<\/code>, <code>pull_request<\/code>, <code>schedule<\/code>, or <code>workflow_dispatch<\/code>.<\/td><\/tr><tr><td><strong>Trigger<\/strong><\/td><td>The event or condition that initiates a workflow run.<\/td><\/tr><tr><td><strong>Job Matrix<\/strong><\/td><td>A way to run a job in multiple configurations (e.g., different OS, environments, or parameters) in parallel.<\/td><\/tr><tr><td><strong>Environment<\/strong><\/td><td>A collection of settings and resources (like secrets) that control how a workflow interacts with environments such as production, development, or staging.<\/td><\/tr><tr><td><strong>Artifact<\/strong><\/td><td>Files generated by jobs, such as build outputs or test results, that can be shared across jobs.<\/td><\/tr><tr><td><strong>Secret<\/strong><\/td><td>Encrypted variables used in workflows to store sensitive data like API keys, tokens, or passwords.<\/td><\/tr><tr><td><strong>Context<\/strong><\/td><td>Information available to workflows during runtime, such as GitHub metadata, environment variables, or the repository.<\/td><\/tr><tr><td><strong>Service Container<\/strong><\/td><td>Containers that can run alongside a job, typically used for databases or other services needed for the job.<\/td><\/tr><tr><td><strong>Workflow Run<\/strong><\/td><td>An instance of a workflow being executed as a result of a trigger or manual dispatch.<\/td><\/tr><tr><td><strong>Expression Syntax<\/strong><\/td><td>Special syntax (<code>${{ }}<\/code>) used in workflows to evaluate conditions, access context variables, or make decisions.<\/td><\/tr><tr><td><strong>Cache<\/strong><\/td><td>Mechanism to store dependencies or build outputs that can be reused in future workflow runs to improve performance.<\/td><\/tr><tr><td><strong>Permissions<\/strong><\/td><td>The level of access given to the GitHub Actions runner for a job, such as <code>read<\/code> or <code>write<\/code> permissions for repositories or secrets.<\/td><\/tr><tr><td><strong>Status Badge<\/strong><\/td><td>A badge that shows the current status of a workflow (e.g., success, failure) that can be embedded in a README.<\/td><\/tr><tr><td><strong>Timeout<\/strong><\/td><td>The maximum duration a job or workflow is allowed to run before it is automatically stopped.<\/td><\/tr><tr><td><strong>Checkout<\/strong><\/td><td>An action (<code>actions\/checkout<\/code>) that fetches the repository\u2019s code in a workflow so that subsequent steps can work with it.<\/td><\/tr><tr><td><strong>Cache Action<\/strong><\/td><td>An action (<code>actions\/cache<\/code>) used to cache dependencies or output between workflow runs.<\/td><\/tr><tr><td><strong>Matrix Strategy<\/strong><\/td><td>A feature allowing you to run the same job multiple times with different inputs (e.g., various operating systems, programming languages).<\/td><\/tr><tr><td><strong>Approval Workflow<\/strong><\/td><td>A manual action that requires approval from a human (typically used in deployment workflows).<\/td><\/tr><tr><td><strong>Filter<\/strong><\/td><td>Mechanism used to conditionally run workflows or jobs based on file changes, branches, or other criteria (e.g., <code>paths<\/code>, <code>branches<\/code>, <code>tags<\/code>).<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Example<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">name: CI Pipeline\n\n<span class=\"hljs-comment\"># Define the triggers (events) for this workflow<\/span>\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n  workflow_dispatch: <span class=\"hljs-comment\"># Allows manually triggering the workflow<\/span>\n\n<span class=\"hljs-comment\"># Define the jobs in the workflow<\/span>\njobs:\n  <span class=\"hljs-comment\"># A job for building the project using a matrix strategy<\/span>\n  build:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        node-version: &#91;<span class=\"hljs-number\">12.<\/span>x, <span class=\"hljs-number\">14.<\/span>x, <span class=\"hljs-number\">16.<\/span>x] <span class=\"hljs-comment\"># Run the job for different versions of Node.js<\/span>\n        os: &#91;ubuntu-latest, windows-latest] <span class=\"hljs-comment\"># Run on different operating systems<\/span>\n    steps:\n      - name: Checkout code\n        uses: actions\/checkout@v3 <span class=\"hljs-comment\"># Action to checkout the code<\/span>\n\n      - name: Set up Node.js ${{ matrix.node-version }}\n        uses: actions\/setup-node@v3\n        with:\n          node-version: ${{ matrix.node-version }}\n\n      - name: Cache node modules\n        uses: actions\/cache@v3 <span class=\"hljs-comment\"># Cache dependencies<\/span>\n        with:\n          path: ~\/.npm\n          key: ${{ runner.os }}-node-${{ hashFiles(<span class=\"hljs-string\">'package-lock.json'<\/span>) }}\n          restore-keys: |\n            ${{ runner.os }}-node-\n\n      - name: Install Dependencies\n        run: npm install\n\n      - name: Run Unit Tests\n        run: npm test\n\n      - name: Upload Test Results <span class=\"hljs-keyword\">as<\/span> Artifacts\n        <span class=\"hljs-keyword\">if<\/span>: always() <span class=\"hljs-comment\"># Upload artifacts even if the tests fail<\/span>\n        uses: actions\/upload-artifact@v3\n        with:\n          name: test-results\n          path: test-results.xml\n\n  <span class=\"hljs-comment\"># A job for deploying the application, running only when building on main<\/span>\n  deploy:\n    runs-on: ubuntu-latest\n    needs: build <span class=\"hljs-comment\"># This job will only run if the build job succeeds<\/span>\n    environment: production <span class=\"hljs-comment\"># Specifies the environment (can be 'production', 'staging', etc.)<\/span>\n    <span class=\"hljs-keyword\">if<\/span>: github.ref == <span class=\"hljs-string\">'refs\/heads\/main'<\/span> <span class=\"hljs-comment\"># Deploy only on pushes to main<\/span>\n    steps:\n      - name: Checkout code\n        uses: actions\/checkout@v3\n\n      - name: Set up Node.js <span class=\"hljs-number\">16.<\/span>x\n        uses: actions\/setup-node@v3\n        with:\n          node-version: <span class=\"hljs-number\">16.<\/span>x\n\n      - name: Install Dependencies\n        run: npm install\n\n      - name: Deploy to Production Server\n        env:\n          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} <span class=\"hljs-comment\"># Using a secret for authentication<\/span>\n        run: |\n          ssh -i $SSH_PRIVATE_KEY user@yourserver.com <span class=\"hljs-string\">\"cd \/var\/www\/app &amp;&amp; git pull &amp;&amp; npm install &amp;&amp; pm2 restart app\"<\/span>\n        \n      - name: Notify on Success\n        <span class=\"hljs-keyword\">if<\/span>: success()\n        run: <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Deployment successful!\"<\/span>\n\n      - name: Notify on Failure\n        <span class=\"hljs-keyword\">if<\/span>: failure()\n        run: <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Deployment failed!\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Explanation of Key Terminology in the Workflow<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Term<\/strong><\/th><th><strong>Explanation<\/strong><\/th><\/tr><\/thead><tbody><tr><td><strong>Workflow<\/strong><\/td><td>The entire <code>.yml<\/code> file defines a workflow. This example has two jobs: <code>build<\/code> and <code>deploy<\/code>.<\/td><\/tr><tr><td><strong>Job<\/strong><\/td><td>A collection of steps, running in a virtual machine environment. The jobs are <code>build<\/code> and <code>deploy<\/code>.<\/td><\/tr><tr><td><strong>Step<\/strong><\/td><td>Individual tasks within a job. For example, checking out the code, installing dependencies, and running tests.<\/td><\/tr><tr><td><strong>Action<\/strong><\/td><td>Reusable commands from the GitHub Marketplace. In this example, <code>actions\/checkout@v3<\/code>, <code>actions\/setup-node@v3<\/code>, etc.<\/td><\/tr><tr><td><strong>Matrix<\/strong><\/td><td>Allows running the <code>build<\/code> job in parallel for different versions of Node.js and operating systems.<\/td><\/tr><tr><td><strong>Runner<\/strong><\/td><td>The server that runs the jobs (<code>ubuntu-latest<\/code> or <code>windows-latest<\/code>).<\/td><\/tr><tr><td><strong>Event\/Trigger<\/strong><\/td><td>The workflow is triggered by events like <code>push<\/code>, <code>pull_request<\/code>, and <code>workflow_dispatch<\/code>.<\/td><\/tr><tr><td><strong>Environment<\/strong><\/td><td>Specifies the environment (in this case, <code>production<\/code>) for deployment.<\/td><\/tr><tr><td><strong>Artifact<\/strong><\/td><td>The test results are uploaded as artifacts using <code>actions\/upload-artifact@v3<\/code>.<\/td><\/tr><tr><td><strong>Cache<\/strong><\/td><td>Dependencies are cached to speed up future builds (<code>actions\/cache@v3<\/code> caches the <code>~\/.npm<\/code> directory).<\/td><\/tr><tr><td><strong>Secret<\/strong><\/td><td>A secure environment variable (<code>SSH_PRIVATE_KEY<\/code>) is used to authenticate the deployment server.<\/td><\/tr><tr><td><strong>if<\/strong><\/td><td>Conditional logic to control when certain steps or jobs are executed (e.g., <code>if: success()<\/code> or <code>if: github.ref == 'refs\/heads\/main'<\/code>).<\/td><\/tr><tr><td><strong>Context<\/strong><\/td><td>The expression syntax <code>${{ }}<\/code> allows accessing GitHub contexts such as <code>matrix<\/code>, <code>secrets<\/code>, and <code>github.ref<\/code>.<\/td><\/tr><tr><td><strong>needs<\/strong><\/td><td>Specifies that the <code>deploy<\/code> job depends on the <code>build<\/code> job, meaning it will only run if <code>build<\/code> is successful.<\/td><\/tr><tr><td><strong>Artifact<\/strong><\/td><td>Test results are stored using artifacts, which can be used in later jobs or downloaded after the workflow finishes.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Main Features Demonstrated<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Triggers<\/strong>: The workflow triggers on <code>push<\/code> and <code>pull_request<\/code> to the <code>main<\/code> branch, and can also be manually triggered via <code>workflow_dispatch<\/code>.<\/li>\n\n\n\n<li><strong>Matrix<\/strong>: The <code>build<\/code> job uses a matrix to run multiple combinations of Node.js versions (<code>12.x<\/code>, <code>14.x<\/code>, <code>16.x<\/code>) and operating systems (<code>ubuntu-latest<\/code>, <code>windows-latest<\/code>).<\/li>\n\n\n\n<li><strong>Secrets<\/strong>: The <code>deploy<\/code> job uses a secret (<code>SSH_PRIVATE_KEY<\/code>) to securely authenticate the deployment process.<\/li>\n\n\n\n<li><strong>Conditional Execution<\/strong>:\n<ul class=\"wp-block-list\">\n<li>The <code>deploy<\/code> job only runs on the <code>main<\/code> branch.<\/li>\n\n\n\n<li>The steps <code>Notify on Success<\/code> and <code>Notify on Failure<\/code> use <code>if: success()<\/code> and <code>if: failure()<\/code> to conditionally run based on the outcome of previous steps.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Artifacts<\/strong>: Test results are uploaded as an artifact so that they can be accessed after the workflow completes.<\/li>\n\n\n\n<li><strong>Caching<\/strong>: Caching is used for <code>npm<\/code> dependencies to improve performance on subsequent runs.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusion:<\/h3>\n\n\n\n<p>This workflow showcases a wide variety of GitHub Actions terminologies, demonstrating how to set up a matrix build, conditionally run jobs, use secrets, cache dependencies, upload artifacts, and trigger workflows with various events.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here\u2019s a table that summarizes key GitHub Actions terminology, providing a clear and concise explanation of each term: Term Definition Workflow A configurable automated process made up of one or more jobs. Defined in YAML files in .github\/workflows\/. Job A set of steps executed sequentially. Multiple jobs can run in parallel or sequentially. Step A&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-47174","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/47174","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=47174"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/47174\/revisions"}],"predecessor-version":[{"id":47182,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/47174\/revisions\/47182"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=47174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=47174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=47174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}