title
GitHub Actions Tutorial - Basic Concepts and CI/CD Pipeline with Docker
description
Complete Github Actions Tutorial | GitHub Actions CI/CD | GitHub Actions Docker Build and Push | GitHub Actions Demo
► Complete DevOps Bootcamp - full educational program 👉🏼 https://bit.ly/3MRumn2
► Follow me on IG for behind the scenes content: 👉🏼 https://bit.ly/2F3LXYJ
In this GitHub Actions Tutorial we go through the following topics:
First I explain what GitHub Actions actually is and we will look at specific developer workflow use cases that you can automate with GitHub Actions .
After that I explain the basic concepts of GitHub Actions, including the GitHub Events and Actions and workflow and HOW GitHub Actions actually automates these workflows using these components.
Having understood what GitHub Actions solves and how it makes it possible, I will go through the most common workflow, which is CI/CD pipeline.
I will explain shortly why it is not just another ci/cd tool or what are the benefits of GitHub Actions ci cd pipeline.
Finally we will go through a hands-on DEMO, where I explain the syntax of github actions workflow file, and then I show you a complete ci pipeline setup with my example Java Gradle project, which we will build into a Docker Image and push to a private Docker repository on DockerHub.
#githubactions #github #cicd #techworldwithnana
▬▬▬▬▬▬ T I M E S T A M P S ⏰ ▬▬▬▬▬▬
0:00 - Intro
01:03 - What is Github Actions?
01:29 - What are developer workflows? Use Cases for GitHub Actions
04:50 - Basic Concepts of GitHub Actions: How GitHub Actions automates those workflows? GitHub Events & Actions
06:41 - GitHub Actions CI/CD
07:18 - Why another CI/CD Tool - Benefits of Github Actions
09:50 - DEMO - Create CI Workflow or Pipeline
13:04 - Syntax of Workflow File
20:40 - Where does this Workflow Code run? GitHub Action Runner
24:35 - Build Docker Image and push to private Docker Repo
▬▬▬▬▬▬ Useful Links 🛠 ▬▬▬▬▬▬
My GitHub repository: ► https://github.com/nanuchi/my-project
GitLab repo with all relevant links: ► https://gitlab.com/nanuchi/youtube-tutorial-series/-/blob/master/github-actions/links.md
▬▬▬▬▬▬ Want to learn more? 🚀 ▬▬▬▬▬▬
Full Docker and Kubernetes tutorial ► https://bit.ly/2YGeRp9
DevOps Tools, like Terraform, Prometheus ► https://bit.ly/2W9UEq6
Jenkins Pipeline Tutorials ► https://bit.ly/2Wunx08
YAML Tutorial ► https://youtu.be/1uFVr15xDGg
▬▬▬▬▬▬ Connect with me 👋 ▬▬▬▬▬▬
Join private Facebook group ► https://bit.ly/32UVSZP
DEV ► https://bit.ly/3h2fqiO
INSTAGRAM ► https://bit.ly/2F3LXYJ
TWITTER ► https://bit.ly/3i54PUB
LINKEDIN ► https://bit.ly/3hWOLVT
▬▬▬▬▬▬ Courses & Bootcamp & Ebooks 🚀 ▬▬▬▬▬▬
► Become a DevOps Engineer - full educational program 👉🏼 https://bit.ly/45mXaer
► High-Quality and Hands-On Courses 👉🏼 https://bit.ly/3BNS8Kv
► Kubernetes 101 - compact and easy-to-read ebook bundle 👉🏼 https://bit.ly/3Ozl28x
detail
{'title': 'GitHub Actions Tutorial - Basic Concepts and CI/CD Pipeline with Docker', 'heatmap': [{'end': 646.125, 'start': 620.248, 'weight': 0.872}, {'end': 1170.774, 'start': 1131.595, 'weight': 1}, {'end': 1466.971, 'start': 1444.441, 'weight': 0.714}], 'summary': 'This tutorial on github actions covers basic concepts, benefits, and ci/cd pipeline use cases, with a hands-on demo for a java gradle project. it emphasizes automation of management tasks, ci/cd pipeline advantages, integration with various tools, workflow creation, and syntax explanation. additionally, it delves into github workflow automation, actions explanation, parallel execution, customization, server testing, and docker image deployment to a private repository using github actions.', 'chapters': [{'end': 225.774, 'segs': [{'end': 89.152, 'src': 'embed', 'start': 0.689, 'weight': 0, 'content': [{'end': 4.17, 'text': "In this GitHub Actions tutorial, we'll go through the following topics.", 'start': 0.689, 'duration': 3.481}, {'end': 13.894, 'text': "First I'm going to explain what GitHub Actions actually is and we're going to look at specific developer workflow use cases that you can automate with GitHub Actions.", 'start': 4.611, 'duration': 9.283}, {'end': 21.236, 'text': 'After that, I will explain the basic concepts of GitHub Actions, including the events and actions and workflow,', 'start': 14.494, 'duration': 6.742}, {'end': 26.098, 'text': 'and how GitHub Actions actually automates these workflows using these components.', 'start': 21.236, 'duration': 4.862}, {'end': 35.604, 'text': 'Having understood what GitHub Actions solves and how it makes it possible, I will go through the most common workflow, which is CI CD pipeline.', 'start': 26.758, 'duration': 8.846}, {'end': 43.869, 'text': "I will explain shortly why it's not just another CI CD tool or what are the benefits of GitHub Actions CI CD pipeline.", 'start': 35.824, 'duration': 8.045}, {'end': 50.673, 'text': 'Finally, we will go through a hands on demo where I explain the syntax of GitHub Actions workflow file,', 'start': 44.329, 'duration': 6.344}, {'end': 56.217, 'text': 'and then we will go through a complete CI pipeline set up with my example, Java Gradle project.', 'start': 50.673, 'duration': 5.544}, {'end': 62.633, 'text': 'which we will build into a Docker image and push to a private Docker repository on Docker Hub.', 'start': 56.738, 'duration': 5.895}, {'end': 72.764, 'text': 'So what is GitHub Actions? GitHub Actions is a platform to automate developer workflows, so software development workflows.', 'start': 63.78, 'duration': 8.984}, {'end': 79.587, 'text': "Many of the tutorials that I've seen seem to convey that GitHub Actions is a CI CD platform.", 'start': 73.444, 'duration': 6.143}, {'end': 89.152, 'text': "But as I said, it's for automating developer workflows and CI CD pipeline is just one of the many workflows that you can automate with GitHub Actions.", 'start': 80.027, 'duration': 9.125}], 'summary': 'Github actions automates developer workflows, including ci/cd, for software development.', 'duration': 88.463, 'max_score': 0.689, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI689.jpg'}], 'start': 0.689, 'title': 'Github actions for automating developer workflows', 'summary': "Covers the basic concepts, benefits, and use cases of github actions for ci/cd workflow, including a hands-on demo for a java gradle project. it also emphasizes github actions' broader applications for managing open source projects on github.", 'chapters': [{'end': 62.633, 'start': 0.689, 'title': 'Github actions for ci/cd workflow', 'summary': 'Covers what github actions is, automating developer workflow use cases, basic concepts of github actions, the benefits of github actions ci/cd pipeline, and a hands-on demo of setting up a complete ci pipeline for a java gradle project, including building and pushing to a private docker repository.', 'duration': 61.944, 'highlights': ['Explaining GitHub Actions and its developer workflow use cases Covers specific developer workflow use cases that can be automated with GitHub Actions.', 'Understanding the basic concepts of GitHub Actions Explains the basic concepts of GitHub Actions, including events, actions, and workflow, and how it automates workflows using these components.', "Benefits of GitHub Actions CI/CD pipeline Explains the benefits of GitHub Actions CI/CD pipeline and why it's not just another CI/CD tool.", 'Hands-on demo of setting up a complete CI pipeline for a Java Gradle project Involves explaining the syntax of GitHub Actions workflow file and setting up a complete CI pipeline for a Java Gradle project, including building and pushing to a private Docker repository.']}, {'end': 225.774, 'start': 63.78, 'title': 'Understanding github actions', 'summary': 'Introduces github actions as a platform for automating developer workflows, emphasizing that it is not solely a ci cd platform and provides examples of organizational tasks that can be automated using github actions for managing open source projects on github.', 'duration': 161.994, 'highlights': ['GitHub Actions automates developer workflows, including CI CD pipelines, for managing open source projects on GitHub.', 'GitHub Actions is not just a CI CD platform but also automates organizational tasks for managing open source projects.', 'Examples of tasks that can be automated with GitHub Actions include managing issues, pull requests, and releases for open source projects on GitHub.', 'Developers can use GitHub Actions to automate tasks such as issue sorting, pull request review, and release management for their open source projects on GitHub.']}], 'duration': 225.085, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI689.jpg', 'highlights': ['Explaining GitHub Actions and its developer workflow use cases Covers specific developer workflow use cases that can be automated with GitHub Actions.', 'Understanding the basic concepts of GitHub Actions Explains the basic concepts of GitHub Actions, including events, actions, and workflow, and how it automates workflows using these components.', "Benefits of GitHub Actions CI/CD pipeline Explains the benefits of GitHub Actions CI/CD pipeline and why it's not just another CI/CD tool.", 'Hands-on demo of setting up a complete CI pipeline for a Java Gradle project Involves explaining the syntax of GitHub Actions workflow file and setting up a complete CI pipeline for a Java Gradle project, including building and pushing to a private Docker repository.', 'GitHub Actions automates developer workflows, including CI CD pipelines, for managing open source projects on GitHub.', 'GitHub Actions is not just a CI CD platform but also automates organizational tasks for managing open source projects.', 'Examples of tasks that can be automated with GitHub Actions include managing issues, pull requests, and releases for open source projects on GitHub.', 'Developers can use GitHub Actions to automate tasks such as issue sorting, pull request review, and release management for their open source projects on GitHub.']}, {'end': 576.745, 'segs': [{'end': 316.2, 'src': 'embed', 'start': 246.81, 'weight': 0, 'content': [{'end': 254.693, 'text': 'So all these things are workflow examples of what you have to do as a maintainer of such repository.', 'start': 246.81, 'duration': 7.883}, {'end': 259.454, 'text': 'So you can imagine, the bigger the project gets and the more contributors you get,', 'start': 254.793, 'duration': 4.661}, {'end': 266.456, 'text': 'and the more features and issues they fix and more pull requests they create, and the more people use your project,', 'start': 259.454, 'duration': 7.002}, {'end': 269.277, 'text': 'the more organizational effort it is going to be.', 'start': 266.456, 'duration': 2.821}, {'end': 275.481, 'text': "So obviously, as a developer, you don't want to be sitting there doing all these tedious organizational stuff.", 'start': 269.637, 'duration': 5.844}, {'end': 287.428, 'text': 'You want to automate as much as possible of those management tasks so that you can also concentrate on programing and developing new features and new functionalities in the project.', 'start': 275.621, 'duration': 11.807}, {'end': 290.99, 'text': 'And for that purpose, GitHub Actions was created.', 'start': 287.648, 'duration': 3.342}, {'end': 293.03, 'text': 'So with GitHub actions.', 'start': 291.61, 'duration': 1.42}, {'end': 301.753, 'text': 'every time something happens in your repository or to your repository, you can configure automatic actions to get executed in response.', 'start': 293.03, 'duration': 8.723}, {'end': 310.337, 'text': 'And these things that are happening in your repository or to your repository are events in the GitHub space.', 'start': 302.794, 'duration': 7.543}, {'end': 313.858, 'text': 'So someone creating a pull request is an event.', 'start': 310.837, 'duration': 3.021}, {'end': 316.2, 'text': 'Someone creating an issue is an event.', 'start': 314.199, 'duration': 2.001}], 'summary': 'Github actions automates repository management tasks, allowing developers to focus on programming, as illustrated by workflow examples and the increasing organizational effort with more contributors, features, and users.', 'duration': 69.39, 'max_score': 246.81, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI246810.jpg'}, {'end': 486.88, 'src': 'embed', 'start': 438.899, 'weight': 3, 'content': [{'end': 443.58, 'text': 'Now, why is it a big deal to have just another CI CD tool?', 'start': 438.899, 'duration': 4.681}, {'end': 453.842, 'text': "Well, the first and obvious advantage is that if you're already hosting your code on GitHub now, you can use the same tool for CI CD pipeline as well.", 'start': 444.32, 'duration': 9.522}, {'end': 458.773, 'text': "You don't have to set up another third party tool and manage it separately.", 'start': 454.428, 'duration': 4.345}, {'end': 462.417, 'text': 'You have that integrated into your code repository.', 'start': 459.273, 'duration': 3.144}, {'end': 469.484, 'text': 'Another advantage of GitHub actions that I see is that it makes it really easy to build your pipeline.', 'start': 463.418, 'duration': 6.066}, {'end': 473.108, 'text': 'So the setup process of the city pipeline is really easy.', 'start': 469.524, 'duration': 3.584}, {'end': 476.074, 'text': 'It is actually meant to be a tool for developers.', 'start': 473.533, 'duration': 2.541}, {'end': 478.936, 'text': "So they made it so that if you have a developer's team,", 'start': 476.535, 'duration': 2.401}, {'end': 486.88, 'text': "you don't need an extra devops person who is dedicated to setting up and maintaining that city pipeline in your project.", 'start': 478.936, 'duration': 7.944}], 'summary': 'Github actions simplifies ci/cd setup for developers, integrating with code repository, reducing need for additional tools or personnel.', 'duration': 47.981, 'max_score': 438.899, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI438899.jpg'}], 'start': 226.155, 'title': 'Github actions for ci/cd pipeline', 'summary': 'Discusses the automation of management tasks using github actions, enabling developers to focus more on programming. it also explains the advantages of using github actions for ci/cd pipelines, emphasizing its ease of setup and integration with various development tools.', 'chapters': [{'end': 388.9, 'start': 226.155, 'title': 'Github actions automation', 'summary': 'Discusses the automation of management tasks using github actions, highlighting the benefits of automating workflows in response to repository events, such as creating pull requests and issues, to enable developers to focus more on programming and developing new features.', 'duration': 162.745, 'highlights': ['GitHub Actions enables automatic execution of workflows in response to repository events, such as creating pull requests and issues. GitHub Actions allows for the automation of tasks in response to specific events in the repository, such as creating pull requests, issues, or other integrated tools, freeing up developers to focus on programming and new feature development.', 'Automation of tasks reduces the organizational effort required as the project grows with more contributors, features, and pull requests. As the project size and contributors increase, the automation of tasks through GitHub Actions reduces the organizational effort needed to manage pull requests, issues, and releases, allowing developers to concentrate on programming and developing new functionalities.', 'Tasks such as testing code, building artifacts, preparing release notes, and adjusting version numbers can be automated using GitHub Actions. GitHub Actions can automate tasks such as testing code, building artifacts, preparing release notes, and adjusting version numbers, streamlining the maintenance of the repository and enabling developers to automate these tedious organizational tasks.']}, {'end': 576.745, 'start': 389.32, 'title': 'Github actions for ci cd pipeline', 'summary': 'Explains the concept of github actions and highlights the advantages of using it for ci cd pipelines, emphasizing its ease of setup and integration with various development tools, making it an attractive option for developers.', 'duration': 187.425, 'highlights': ['GitHub actions make it really easy to build CI CD pipelines, eliminating the need for an extra devops person and integrating with various development tools. Ease of setup, integration with various tools', 'The integration and compatibility of GitHub actions with different tools and environments simplify the setup process, making it more convenient for developers. Compatibility with different tools and environments', 'Using GitHub actions for CI CD pipeline eliminates the need to set up and manage a third-party tool separately if the code is already hosted on GitHub. Eliminates need for separate third-party tool']}], 'duration': 350.59, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI226155.jpg', 'highlights': ['GitHub Actions enables automatic execution of workflows in response to repository events, such as creating pull requests and issues.', 'Automation of tasks reduces the organizational effort required as the project grows with more contributors, features, and pull requests.', 'Tasks such as testing code, building artifacts, preparing release notes, and adjusting version numbers can be automated using GitHub Actions.', 'GitHub actions make it really easy to build CI CD pipelines, eliminating the need for an extra devops person and integrating with various development tools.', 'The integration and compatibility of GitHub actions with different tools and environments simplify the setup process, making it more convenient for developers.', 'Using GitHub actions for CI CD pipeline eliminates the need to set up and manage a third-party tool separately if the code is already hosted on GitHub.']}, {'end': 820.467, 'segs': [{'end': 604.363, 'src': 'embed', 'start': 576.745, 'weight': 0, 'content': [{'end': 583.55, 'text': 'I wanted to do the deployment part easily by simply connecting to the target environment and deploying the application there.', 'start': 576.745, 'duration': 6.805}, {'end': 589.976, 'text': "And that's exactly the advantage that you have when you're using CI CD pipeline in GitHub actions.", 'start': 584.291, 'duration': 5.685}, {'end': 599.515, 'text': 'And of course I will show you and explain how this works in the next demo part with my example Java Gradle project,', 'start': 591.482, 'duration': 8.033}, {'end': 604.363, 'text': 'which we will build into a Docker image and push to our private Docker repository.', 'start': 599.515, 'duration': 4.848}], 'summary': 'Using ci/cd pipeline in github actions for easy deployment and docker image push.', 'duration': 27.618, 'max_score': 576.745, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI576745.jpg'}, {'end': 646.125, 'src': 'heatmap', 'start': 620.248, 'weight': 0.872, 'content': [{'end': 626.532, 'text': 'So, whenever you create a new project, you have these actions tab integrated into the project.', 'start': 620.248, 'duration': 6.284}, {'end': 630.535, 'text': 'that lets you get started with automating one of your workflows.', 'start': 626.532, 'duration': 4.003}, {'end': 636.663, 'text': 'So now I can push my local code to the remote repository.', 'start': 631.681, 'duration': 4.982}, {'end': 639.223, 'text': "So let's go back and refresh it.", 'start': 637.563, 'duration': 1.66}, {'end': 644.765, 'text': 'And here I have my Java application which uses Gradle project.', 'start': 640.464, 'duration': 4.301}, {'end': 646.125, 'text': "So let's go to actions.", 'start': 644.805, 'duration': 1.32}], 'summary': 'Actions tab in the project allows automating workflows and pushing local code to remote repository.', 'duration': 25.877, 'max_score': 620.248, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI620248.jpg'}, {'end': 683.317, 'src': 'embed', 'start': 655.988, 'weight': 1, 'content': [{'end': 660.41, 'text': 'You can use one of the templates that matches technology your project uses.', 'start': 655.988, 'duration': 4.422}, {'end': 664.357, 'text': 'And these are actually grouped in three main categories.', 'start': 661.414, 'duration': 2.943}, {'end': 671.885, 'text': 'Here we see the deployment workflows to deploy your code to cloud services or using some automation tools.', 'start': 664.698, 'duration': 7.187}, {'end': 675.909, 'text': 'And here we have a big section of continuous integration workflows.', 'start': 672.245, 'duration': 3.664}, {'end': 683.317, 'text': "And here, if you look at the list, a lot of options based on what programming language you're using,", 'start': 676.53, 'duration': 6.787}], 'summary': 'Three main categories of templates for technology projects, including deployment workflows and continuous integration options.', 'duration': 27.329, 'max_score': 655.988, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI655988.jpg'}, {'end': 733.668, 'src': 'embed', 'start': 701.704, 'weight': 3, 'content': [{'end': 707.847, 'text': "And that's where I was talking about when I mentioned that different applications use different combination of tools.", 'start': 701.704, 'duration': 6.143}, {'end': 718.1, 'text': "And it's important for a city tool to have an easy integration with many different tools so that it works for different projects all the way down.", 'start': 708.087, 'duration': 10.013}, {'end': 722.642, 'text': 'These are the workflow examples that I mentioned at the beginning like greeting someone.', 'start': 718.46, 'duration': 4.182}, {'end': 733.668, 'text': 'For example if a contributor joins your project you might want to send an automated greeting message to welcome or labeling your issues and so on.', 'start': 722.762, 'duration': 10.906}], 'summary': 'City tool must integrate easily with different applications for various project workflows, such as greeting new contributors with automated messages and labeling issues.', 'duration': 31.964, 'max_score': 701.704, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI701704.jpg'}, {'end': 820.467, 'src': 'embed', 'start': 769.697, 'weight': 4, 'content': [{'end': 779.842, 'text': "And what's great with this list of workflow suggestions is that you get a preconfigured workflow that you may need to adjust just a little bit,", 'start': 769.697, 'duration': 10.145}, {'end': 784.783, 'text': "but most of the stuff is already here, so you don't have to start from blank file.", 'start': 779.842, 'duration': 4.941}, {'end': 792.905, 'text': "So let's go through the syntax of this workflow file in detail so that we understand how to write our own workflows.", 'start': 785.203, 'duration': 7.702}, {'end': 797.547, 'text': "So I'm going to copy this in my editor so we can see better.", 'start': 793.206, 'duration': 4.341}, {'end': 801.188, 'text': 'So first of all, we have the name of the workflow.', 'start': 798.227, 'duration': 2.961}, {'end': 805.879, 'text': 'This is basically for you to describe what the workflow is doing.', 'start': 801.715, 'duration': 4.164}, {'end': 808.421, 'text': 'These are the events that are mentioned.', 'start': 806.76, 'duration': 1.661}, {'end': 815.364, 'text': 'So every time an event happens or events happen, we can trigger a certain workflow.', 'start': 808.881, 'duration': 6.483}, {'end': 820.467, 'text': 'So this is a section where we define events that should trigger the following workflow.', 'start': 815.524, 'duration': 4.943}], 'summary': 'Workflow suggestions provide preconfigured file, detailing events and triggers.', 'duration': 50.77, 'max_score': 769.697, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI769697.jpg'}], 'start': 576.745, 'title': "Ci cd pipeline and city tool's integration", 'summary': 'Discusses the advantages of using ci cd pipeline in github actions, demonstrating deployment of a java gradle project into a docker image and its integration with different tools for various projects, including a detailed explanation of workflow creation and syntax.', 'chapters': [{'end': 701.164, 'start': 576.745, 'title': 'Ci cd pipeline in github actions', 'summary': 'Discusses the advantages of using ci cd pipeline in github actions, demonstrating how to deploy a java gradle project into a docker image and push it to a private docker repository through github actions.', 'duration': 124.419, 'highlights': ['GitHub actions provide an advantage for easy deployment to the target environment, demonstrated through a Java Gradle project being built into a Docker image and pushed to a private Docker repository.', 'GitHub actions offer a variety of workflow templates, including deployment, continuous integration, build and test, and publish workflows, tailored to different programming languages and tools.', 'The actions tab integrated into the project allows for automating workflows and provides a list of workflow templates grouped by deployment, continuous integration, and other categories.']}, {'end': 820.467, 'start': 701.704, 'title': "City tool's integration with different tools", 'summary': 'Discusses the importance of a city tool having easy integration with different tools for various projects, giving examples of workflow and mentioning the creation of a build workflow for a java gradle application using preconfigured templates and explaining the syntax of the workflow file in detail.', 'duration': 118.763, 'highlights': ['The importance of a city tool having easy integration with different tools for various projects is emphasized with examples of workflow and the creation of a build workflow for a Java gradle application. (Relevance: 5)', 'The workflow file is written in YAML format and contains preconfigured suggestions, reducing the need to start from a blank file. (Relevance: 4)', 'The chapter explains the syntax of the workflow file in detail, covering the name of the workflow, events triggering the workflow, and the structure of the file. (Relevance: 3)']}], 'duration': 243.722, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI576745.jpg', 'highlights': ['GitHub actions provide an advantage for easy deployment to the target environment, demonstrated through a Java Gradle project being built into a Docker image and pushed to a private Docker repository.', 'GitHub actions offer a variety of workflow templates, including deployment, continuous integration, build and test, and publish workflows, tailored to different programming languages and tools.', 'The actions tab integrated into the project allows for automating workflows and provides a list of workflow templates grouped by deployment, continuous integration, and other categories.', 'The importance of a ci cd tool having easy integration with different tools for various projects is emphasized with examples of workflow and the creation of a build workflow for a Java gradle application.', 'The workflow file is written in YAML format and contains preconfigured suggestions, reducing the need to start from a blank file.', 'The chapter explains the syntax of the workflow file in detail, covering the name of the workflow, events triggering the workflow, and the structure of the file.']}, {'end': 1131.214, 'segs': [{'end': 850.702, 'src': 'embed', 'start': 821.208, 'weight': 0, 'content': [{'end': 822.868, 'text': "And I think it's pretty intuitive.", 'start': 821.208, 'duration': 1.66}, {'end': 832.614, 'text': 'Every time someone pushes to master branch, we want to trigger this workflow or every time a pull request gets created with master branch as a target.', 'start': 823.209, 'duration': 9.405}, {'end': 836.772, 'text': 'this workflow will get executed, which in this case makes sense,', 'start': 833.65, 'duration': 3.122}, {'end': 843.597, 'text': 'because every time something gets pushed into a master or you want to merge something into master,', 'start': 836.772, 'duration': 6.825}, {'end': 850.702, 'text': "it makes sense to run tests or to test our application to make sure that it's mergeable, so to say,", 'start': 843.597, 'duration': 7.105}], 'summary': 'Workflow triggers on push to master branch or creation of pull request with master as target, to run tests on application for mergeability.', 'duration': 29.494, 'max_score': 821.208, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI821208.jpg'}, {'end': 947.95, 'src': 'embed', 'start': 893.069, 'weight': 1, 'content': [{'end': 901.256, 'text': 'So you can name it yourself and job basically groups a set of actions that will be executed.', 'start': 893.069, 'duration': 8.187}, {'end': 909.593, 'text': 'Right So as I mentioned, events trigger a chain of actions or combination of actions, and these are defined here.', 'start': 901.677, 'duration': 7.916}, {'end': 911.394, 'text': "So let's look at the first one.", 'start': 910.194, 'duration': 1.2}, {'end': 912.615, 'text': 'Pretty logical.', 'start': 911.814, 'duration': 0.801}, {'end': 920.197, 'text': 'Whenever we want to build application or run tests, we need to check out the repository or the code first.', 'start': 912.755, 'duration': 7.442}, {'end': 932.162, 'text': 'So how does this get executed or what is behind these syntax? So actions path in GitHub is where pre created or predefined actions are hosted.', 'start': 920.737, 'duration': 11.425}, {'end': 940.847, 'text': 'So basically, you can assume that everybody who uses a CI CD pipeline in GitHub actions will need to use checkout command.', 'start': 932.283, 'duration': 8.564}, {'end': 947.95, 'text': 'Right So instead of letting everybody do that on their own, they create an action called Checkout that people can use.', 'start': 940.927, 'duration': 7.023}], 'summary': 'Github actions automates tasks, e.g. checkout, for ci/cd pipelines.', 'duration': 54.881, 'max_score': 893.069, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI893069.jpg'}, {'end': 1058.968, 'src': 'embed', 'start': 1029.29, 'weight': 2, 'content': [{'end': 1030.571, 'text': 'So these are the official ones.', 'start': 1029.29, 'duration': 1.281}, {'end': 1038.638, 'text': 'But whenever someone creates an action, basically a repository with action YAML file, you can use it here.', 'start': 1031.413, 'duration': 7.225}, {'end': 1041.343, 'text': 'using the uses attribute.', 'start': 1039.619, 'duration': 1.724}, {'end': 1051.765, 'text': 'So the second one, second step is action called Setup Java, which is another repository in this actions list.', 'start': 1042.164, 'duration': 9.601}, {'end': 1058.968, 'text': 'And what it does is basically prepares your environment with Java, with a version that you defined here.', 'start': 1052.265, 'duration': 6.703}], 'summary': 'Using action yaml files to set up java environment with defined version.', 'duration': 29.678, 'max_score': 1029.29, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI1029290.jpg'}], 'start': 821.208, 'title': 'Github workflow automation and actions explanation', 'summary': 'Discusses automating github workflows, including triggering tests on push or pull request events, and explains github actions usage, defining jobs, using pre-created actions, setting up environment with java, and reducing configuration efforts.', 'chapters': [{'end': 868.753, 'start': 821.208, 'title': 'Github workflow automation', 'summary': "Discusses the automation of workflows on github, where triggering a workflow on pushing to the master branch or creating a pull request to the master branch ensures the testing of the application's mergeability, with examples including creating an issue or a contributor joining events.", 'duration': 47.545, 'highlights': ["Triggering a workflow on pushing to the master branch or creating a pull request to the master branch ensures the testing of the application's mergeability, making it essential for maintaining the stability of the master branch.", 'Examples of other events that could trigger workflows include creating an issue or contributor joining, providing a comprehensive list of such events for documentation and reference.']}, {'end': 1131.214, 'start': 869.113, 'title': 'Github actions workflow explanation', 'summary': 'Explains the usage of github actions to automate workflows, including defining jobs, using pre-created actions, setting up environment with java, and executing commands, providing insights into the logic and benefits of reusing actions and reducing configuration efforts.', 'duration': 262.101, 'highlights': ['GitHub Actions enable defining jobs and executing a chain of actions or combination of actions triggered by events.', "Using pre-created actions hosted in GitHub's actions path helps in reusing logic and reducing configuration efforts, such as the Checkout action for checking out the repository.", 'The Setup Java action from a separate repository prepares the environment with the defined Java version, eliminating the need for manual installation and configuration.', "Executing commands using 'run' attribute and running Gradle build in the same environment streamlines the workflow for building Java applications."]}], 'duration': 310.006, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI821208.jpg', 'highlights': ["Triggering a workflow on pushing to the master branch or creating a pull request ensures application's mergeability testing, essential for maintaining master branch stability.", "Using pre-created actions hosted in GitHub's actions path helps in reusing logic and reducing configuration efforts.", 'The Setup Java action from a separate repository prepares the environment with the defined Java version, eliminating the need for manual installation and configuration.', 'GitHub Actions enable defining jobs and executing a chain of actions triggered by events.']}, {'end': 1369.32, 'segs': [{'end': 1186.827, 'src': 'heatmap', 'start': 1131.595, 'weight': 2, 'content': [{'end': 1133.555, 'text': 'We can actually call it C.I.', 'start': 1131.595, 'duration': 1.96}, {'end': 1135.896, 'text': 'and start commit.', 'start': 1134.116, 'duration': 1.78}, {'end': 1137.337, 'text': "Let's create a new branch.", 'start': 1136.216, 'duration': 1.121}, {'end': 1145.48, 'text': 'And create a pull request that will be merged into master branch.', 'start': 1141.478, 'duration': 4.002}, {'end': 1156.704, 'text': 'And here you see that the workflow got triggered because our event matched to what just happened.', 'start': 1148.661, 'duration': 8.043}, {'end': 1161.724, 'text': 'So we created a pull request against master branch and that triggered the workflow.', 'start': 1156.784, 'duration': 4.94}, {'end': 1163.186, 'text': 'This is in progress.', 'start': 1162.145, 'duration': 1.041}, {'end': 1168.451, 'text': "And if I go into details, we're going to see what is actually happening.", 'start': 1163.306, 'duration': 5.145}, {'end': 1170.774, 'text': 'So the bill completed.', 'start': 1169.793, 'duration': 0.981}, {'end': 1174.378, 'text': "So let's actually look at the steps that got executed.", 'start': 1171.294, 'duration': 3.084}, {'end': 1180.82, 'text': 'set up job, which basically prepares the job environment for executing the workflow.', 'start': 1175.493, 'duration': 5.327}, {'end': 1186.827, 'text': 'Here you see, for example, these action repositories got downloaded so that it can be used.', 'start': 1181.28, 'duration': 5.547}], 'summary': 'C.i. workflow triggered by pull request to master branch.', 'duration': 55.232, 'max_score': 1131.595, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI1131595.jpg'}, {'end': 1255.087, 'src': 'embed', 'start': 1229.325, 'weight': 0, 'content': [{'end': 1238.051, 'text': "So in my opinion, for an initial set up of workflow or such a workflow, it's actually pretty straightforward and easy to set up.", 'start': 1229.325, 'duration': 8.726}, {'end': 1240.243, 'text': "And it's pretty difficult to mess this up.", 'start': 1238.482, 'duration': 1.761}, {'end': 1245.944, 'text': 'So now you may be asking where do all these things get actually executed?', 'start': 1241.083, 'duration': 4.861}, {'end': 1248.505, 'text': 'Because you see that the code got checked out.', 'start': 1246.244, 'duration': 2.261}, {'end': 1255.087, 'text': 'then you see some commands got executed, Java version got installed and the Gradle build actually happened.', 'start': 1248.505, 'duration': 6.582}], 'summary': 'Setting up the workflow is straightforward and difficult to mess up, with code checked out, commands executed, java version installed, and gradle build executed.', 'duration': 25.762, 'max_score': 1229.325, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI1229325.jpg'}, {'end': 1313.591, 'src': 'embed', 'start': 1284.733, 'weight': 1, 'content': [{'end': 1295.018, 'text': 'And important to note here is that whenever you create a new job or whenever you create a new workflow with a set of jobs for every single job,', 'start': 1284.733, 'duration': 10.285}, {'end': 1303.363, 'text': 'a fresh new GitHub server will be prepared or used to execute all those steps inside the job.', 'start': 1295.018, 'duration': 8.345}, {'end': 1309.228, 'text': 'So one job will run on a single server at a time.', 'start': 1304.084, 'duration': 5.144}, {'end': 1313.591, 'text': 'So, for example, if you have a list of jobs here,', 'start': 1310.048, 'duration': 3.543}], 'summary': 'Each job runs on a separate github server, ensuring one server per job.', 'duration': 28.858, 'max_score': 1284.733, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI1284733.jpg'}], 'start': 1131.595, 'title': 'Github actions workflow', 'summary': "Explains the setup process of a github actions workflow, enabling parallel execution and customization using 'needs' for dependencies. it also describes the ci process, including branch creation, pull request, and workflow execution steps.", 'chapters': [{'end': 1211.207, 'start': 1131.595, 'title': 'Workflow and ci process', 'summary': 'Describes the ci process, including creating a new branch, making a pull request, and triggering a workflow upon the pull request creation. it also explains the steps of the workflow, such as setting up the job environment and executing commands with options and flags.', 'duration': 79.612, 'highlights': ['The bill completed, and the steps that got executed include setting up the job environment and downloading action repositories.', 'Creating a pull request against the master branch triggered the workflow.', 'The transcript explains the process of creating a new branch and making a pull request that will be merged into the master branch.']}, {'end': 1369.32, 'start': 1211.448, 'title': 'Github actions workflow setup', 'summary': "Explains the straightforward setup process of a github actions workflow, where each job runs on a separate github server, allowing for parallel execution and customization using 'needs' for dependencies.", 'duration': 157.872, 'highlights': ['The workflow setup process is straightforward and difficult to mess up, making it easy for initial setup with built-in post build actions and cleanup.', 'Workflows on GitHub Actions get executed on separate GitHub servers, managed by GitHub, eliminating the need for setting up and configuring servers or build tools.', "Each job within a workflow runs on a separate GitHub server, allowing for parallel execution by default, with the option to customize dependencies using 'needs'."]}], 'duration': 237.725, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI1131595.jpg', 'highlights': ['The workflow setup process is straightforward and difficult to mess up, making it easy for initial setup with built-in post build actions and cleanup.', "Each job within a workflow runs on a separate GitHub server, allowing for parallel execution by default, with the option to customize dependencies using 'needs'.", 'Creating a pull request against the master branch triggered the workflow.', 'The bill completed, and the steps that got executed include setting up the job environment and downloading action repositories.', 'The transcript explains the process of creating a new branch and making a pull request that will be merged into the master branch.']}, {'end': 1949.194, 'segs': [{'end': 1396.716, 'src': 'embed', 'start': 1369.86, 'weight': 0, 'content': [{'end': 1377.526, 'text': 'So the servers that I mentioned that GitHub makes available for the workflows to run come in three categories.', 'start': 1369.86, 'duration': 7.666}, {'end': 1381.809, 'text': 'So you can choose either Ubuntu, Windows or Mac OS.', 'start': 1377.546, 'duration': 4.263}, {'end': 1394.274, 'text': 'So, for example, if you have an application that you are shipping out to customers that have all three operating systems, you can test each release,', 'start': 1382.409, 'duration': 11.865}, {'end': 1396.716, 'text': 'for example, or each commit to master.', 'start': 1394.274, 'duration': 2.442}], 'summary': 'Github offers servers for workflows in ubuntu, windows, and mac os for testing applications across different operating systems.', 'duration': 26.856, 'max_score': 1369.86, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI1369860.jpg'}, {'end': 1475.183, 'src': 'heatmap', 'start': 1444.441, 'weight': 0.714, 'content': [{'end': 1446.122, 'text': 'So I have merged my pull request.', 'start': 1444.441, 'duration': 1.681}, {'end': 1454.447, 'text': 'So here you see in the master branch, we have this dot GitHub slash workflows path with the YAML file inside.', 'start': 1446.562, 'duration': 7.885}, {'end': 1457.409, 'text': 'So now this has become part of the application code.', 'start': 1454.747, 'duration': 2.662}, {'end': 1466.971, 'text': "So I can adjust it here and let's actually commit straight to master branch and let's see our workflow.", 'start': 1458.76, 'duration': 8.211}, {'end': 1475.183, 'text': 'And here you see three bills are getting executed in parallel on all three operating systems.', 'start': 1467.612, 'duration': 7.571}], 'summary': 'Merged pull request, added workflows to app code, ran 3 parallel builds on 3 os', 'duration': 30.742, 'max_score': 1444.441, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI1444441.jpg'}, {'end': 1671.303, 'src': 'embed', 'start': 1642.077, 'weight': 2, 'content': [{'end': 1643.678, 'text': 'And here you see the usage example.', 'start': 1642.077, 'duration': 1.601}, {'end': 1649.242, 'text': "So what's important with actions is that you have a possibility to pass in the parameters.", 'start': 1643.999, 'duration': 5.243}, {'end': 1654.599, 'text': 'So it basically does all those Docker login, Docker build, et cetera, commands.', 'start': 1649.522, 'duration': 5.077}, {'end': 1657.22, 'text': 'But obviously we want to set our own credentials.', 'start': 1654.919, 'duration': 2.301}, {'end': 1660.54, 'text': 'We want to tell which Docker registry it should connect to.', 'start': 1657.52, 'duration': 3.02}, {'end': 1665.642, 'text': 'In this case, we have a Docker hub registry and of course, the image name.', 'start': 1660.62, 'duration': 5.022}, {'end': 1668.182, 'text': 'So we can actually pass all those as parameters.', 'start': 1665.802, 'duration': 2.38}, {'end': 1671.303, 'text': 'Here you see it supports multiple Docker registries.', 'start': 1668.802, 'duration': 2.501}], 'summary': 'Actions allow passing parameters for docker commands, supporting multiple registries.', 'duration': 29.226, 'max_score': 1642.077, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI1642077.jpg'}, {'end': 1749.297, 'src': 'embed', 'start': 1723.546, 'weight': 3, 'content': [{'end': 1728.512, 'text': 'And here you see credentials for username and password because, as I mentioned,', 'start': 1723.546, 'duration': 4.966}, {'end': 1733.699, 'text': "GitHub needs to authenticate itself with the private registry because it's obviously secured.", 'start': 1728.512, 'duration': 5.187}, {'end': 1736.628, 'text': 'And we need to provide credentials here.', 'start': 1734.967, 'duration': 1.661}, {'end': 1745.014, 'text': "And since this YAML file, this workflow YAML file is part of the code, we can't just put plain text credentials here.", 'start': 1737.049, 'duration': 7.965}, {'end': 1747.556, 'text': "So we're using placeholders instead.", 'start': 1745.634, 'duration': 1.922}, {'end': 1749.297, 'text': 'So these are referencing secret.', 'start': 1747.576, 'duration': 1.721}], 'summary': 'Github authentication requires secret placeholders for securing credentials.', 'duration': 25.751, 'max_score': 1723.546, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI1723546.jpg'}, {'end': 1938.326, 'src': 'embed', 'start': 1908.035, 'weight': 4, 'content': [{'end': 1908.655, 'text': 'tech param.', 'start': 1908.035, 'duration': 0.62}, {'end': 1911.836, 'text': 'So that was our continuous integration workflow.', 'start': 1909.215, 'duration': 2.621}, {'end': 1917.278, 'text': 'We built Java artifact, we built a Docker image and we pushed it to Docker repository.', 'start': 1912.136, 'duration': 5.142}, {'end': 1926.801, 'text': 'I will make a full course on the GitHub actions for multiple other use cases, including deploying the Docker image on cloud or Kubernetes,', 'start': 1917.758, 'duration': 9.043}, {'end': 1932.943, 'text': 'environment testing and building with no jazz application as well, and also automating some other workflows.', 'start': 1926.801, 'duration': 6.142}, {'end': 1935.504, 'text': "So if you're interested, stay tuned for that.", 'start': 1933.263, 'duration': 2.241}, {'end': 1938.326, 'text': 'So hope you learned a lot in this video.', 'start': 1936.184, 'duration': 2.142}], 'summary': 'Continuous integration workflow: built java artifact, docker image, and deployed to docker repository. future course on github actions for deploying docker image on cloud or kubernetes, environment testing, and automating workflows.', 'duration': 30.291, 'max_score': 1908.035, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI1908035.jpg'}], 'start': 1369.86, 'title': 'Github workflow servers and testing', 'summary': 'Discusses the three categories of servers available for github workflows - ubuntu, windows, and mac os, enabling the testing of applications on multiple operating systems and technologies, using strategies and metrics. it also covers the process of building and pushing a java artifact as a docker image to a docker hub private repository using github actions, including setting up the workflow, using docker hub, creating and using secrets, and executing the continuous integration workflow.', 'chapters': [{'end': 1423.256, 'start': 1369.86, 'title': 'Github workflow servers and testing', 'summary': 'Discusses the three categories of servers available for github workflows - ubuntu, windows, and mac os, enabling the testing of applications on multiple operating systems and technologies, using strategies and metrics.', 'duration': 53.396, 'highlights': ['The servers available for GitHub workflows come in three categories: Ubuntu, Windows, and Mac OS, enabling testing of applications on multiple operating systems.', 'The ability to test applications on all three operating systems is facilitated by using attributes like strategy and metrics.', 'Metrics are used when utilizing multiple operating systems or versions of technology for an application, thereby enhancing the testing process.']}, {'end': 1949.194, 'start': 1424.017, 'title': 'Github actions for java docker workflow', 'summary': 'Covers the process of building and pushing a java artifact as a docker image to a docker hub private repository using github actions, including setting up the workflow, using docker hub, creating and using secrets, and executing the continuous integration workflow.', 'duration': 525.177, 'highlights': ['The process involves building and pushing a Java artifact as a Docker image to a Docker Hub private repository using GitHub Actions, resulting in successful execution of the continuous integration workflow.', 'The workflow concurrently executes three builds on all three operating systems: Windows, macOS, and Linux Ubuntu.', 'The usage of GitHub Actions simplifies the process by providing the ability to pass parameters and override default settings, such as Docker registry name, image repository name, image name, and credentials for authentication with the private registry.', 'The workflow YAML file includes placeholders for referencing secrets, which are created and stored in the GitHub repository settings, ensuring secure authentication with the private registry.', 'The usage of Ubuntu as the operating system for building and pushing the Docker image is convenient due to Docker being pre-installed, eliminating the need to write out Docker commands for building and pushing the image.', 'The continuous integration workflow results in the creation and successful push of the Java artifact as a Docker image to the Docker Hub private repository, demonstrating the effectiveness of the GitHub Actions for this use case.']}], 'duration': 579.334, 'thumbnail': 'https://coursnap.oss-ap-southeast-1.aliyuncs.com/video-capture/R8_veQiYBjI/pics/R8_veQiYBjI1369860.jpg', 'highlights': ['The servers available for GitHub workflows come in three categories: Ubuntu, Windows, and Mac OS, enabling testing of applications on multiple operating systems.', 'The workflow concurrently executes three builds on all three operating systems: Windows, macOS, and Linux Ubuntu.', 'The usage of GitHub Actions simplifies the process by providing the ability to pass parameters and override default settings, such as Docker registry name, image repository name, image name, and credentials for authentication with the private registry.', 'The workflow YAML file includes placeholders for referencing secrets, which are created and stored in the GitHub repository settings, ensuring secure authentication with the private registry.', 'The continuous integration workflow results in the creation and successful push of the Java artifact as a Docker image to the Docker Hub private repository, demonstrating the effectiveness of the GitHub Actions for this use case.']}], 'highlights': ['GitHub Actions automates developer workflows, including CI CD pipelines, for managing open source projects on GitHub.', 'Explaining GitHub Actions and its developer workflow use cases Covers specific developer workflow use cases that can be automated with GitHub Actions.', 'Understanding the basic concepts of GitHub Actions Explains the basic concepts of GitHub Actions, including events, actions, and workflow, and how it automates workflows using these components.', "Benefits of GitHub Actions CI/CD pipeline Explains the benefits of GitHub Actions CI/CD pipeline and why it's not just another CI/CD tool.", 'Hands-on demo of setting up a complete CI pipeline for a Java Gradle project Involves explaining the syntax of GitHub Actions workflow file and setting up a complete CI pipeline for a Java Gradle project, including building and pushing to a private Docker repository.', 'GitHub actions make it really easy to build CI CD pipelines, eliminating the need for an extra devops person and integrating with various development tools.', 'GitHub actions provide an advantage for easy deployment to the target environment, demonstrated through a Java Gradle project being built into a Docker image and pushed to a private Docker repository.', 'The workflow setup process is straightforward and difficult to mess up, making it easy for initial setup with built-in post build actions and cleanup.', "Each job within a workflow runs on a separate GitHub server, allowing for parallel execution by default, with the option to customize dependencies using 'needs'.", 'The servers available for GitHub workflows come in three categories: Ubuntu, Windows, and Mac OS, enabling testing of applications on multiple operating systems.']}