CI/CD Project using GitHub Actions and ArgoCD
Objective
Hey folks, here's another blog. In this, we are going to make our app up and running. And whenever we make changes in our GitHub file the change will update automatically.
OUTPUT:
Let's Get Started.
Install ArgoCD
Do check this blog on "Getting Started with ArgoCD" without facing errors.
Now, after installing ArgoCD, enter this command:
kubectl port-forward svc/argocd-server -n argocd 8080:443
now the ArgoCD must be running on port 8080. As specified in the Blog, change the password and enter it with the user name "admin".
Open Github
i.) Go to GitHub and fork two of Rishav Sir's repositories. One is named "gitops-01" and another is named "gitops-infra".
NOTE: Fork "gitops-infra" in master branch. Though it will be created in master branch by default. But verify once.
ii.) At this location .github
/
workflows
/ci-action.yaml
in gitops-01 directory, we have to make some changes.
In
build-and-push-docker-image:
section, there's one parameter ->- name: Build image and push to Docker Hub and GitHub Container Registry
Make changes in the "tags" parameter.
tags: | DockerHubUserName/gitops01:${{ github.sha }} ghcr.io/DockerHubUserName/gitops01:${{ github.sha }}
Below, in
update-manifest-stage:
- uses: actions/checkout@v3 with: repository: Github_Username/gitops-infra #CHANGES ref: 'master' token: ${{ secrets.G_TOKEN }} - name: setup git config run: | git config --global user.email "YOUR_EMAIL_ID" #CHANGES git config --global user.name "GITHUB_USERNAME" #CHANGES echo ${{ github.sha }} ....... ....... .......
iii.) Now, in gitops-infra directory, in the "deployment.yaml" file.
Here, in "containers:" section remove the id. and replace the username with your DockerHub Username.
And in "service.yaml" file change the nodePort from 31000 -> 32000. To avoid this error.
iv.) Now, go to settings, in the "gitops-01" repository. Once you fork it.
Go to Action as shown in the picture. Then click "New repository secret" and create the secrets.
Add these three secrets accordingly.
Create Github Token
If you know how to generate a GitHub token. You can skip this part.
Go to your Profile settings ->
Then go to Developer Settings.
Then click on, "Tokens(classic)" within "Personal Access token".
Click on Generate new Token. And Enter a password.
Enter note. Select some parameters. Set the date when you want to expire the Token.
Click Generate Token
Copy the Code.
That's all.
Cont.
Now, in Secrets add one more parameter named G_TOKEN. And paste the new Generated token into it.
Interacting with ArgoCD.
Connect gitops-infra forked repo.
Now login into ArgoCD with Username: admin and your password.
Then go to settings -> Repositories -> Click connect repo.
Name: gitopsinfra(or anything you wish), Project: default,
Repository URL: gitops-infra, forked repo URL.
CONNECT.
Connection Status must be successful.
Create application.
Go to Applications -> Click New App.
In General,
Application Name -> gitopstutorial(any you want)
Project Name -> default
SYNC POLICY -> Automatic
Select Auto Create Namespace
In Source,
Repository URL: gitops-infra repo URL itself.
Revision: HEAD
Path: ./ (which shows the path to deployment & service file.)
Cluster URL: Select the default one.
Namespace: gitopstutorial(give the name you want)
CREATE.
Here, if it does not get synced. Synchronize it manually.
It must look like this.
Note: Here, in your case, the number of pods must be 3. As I had changed the replica sets. In deployment.yaml file
Github Actions Part
Firstly, Enable action by going to the action section in GitHub "gitops-01" repo.
Here, you just need to make some changes, in the App.js file. That is in the frontend part and the GitHub actions will automatically get started. Once you commit changes.
In gitops-01 forked repo. Go to actions and see this. You may not face error.
The error you may face.
If you face this kind of error while re-running the job. Just,
Go to the deployment.yaml file in gitops-infra repo.
And delete the id which is added when you ran the job first.
And re-run the update-manifest-stage job again. You'll not face this error.
CLI Part
Run command
kubectl get ns
(namespace). Here you'll see the namespace namegitopstutorial
or whatever the name you put while creating the Application in ArgoCD.Now, run the command
kubectl get all -n gitopstutorial
. You'll see everything about the pod, deployment and services.Here, our main goal is to see the front end of our app. So, we'll port-forward our service to port 3001. Using command:
kubectl port-forward service/react-app 3001:80 -n gitopstutorial
Now, make some changes again in App.js from First Commit -> Second Commit or anything. And commit the changes.
The action will start working. Now, go to ArgoCD to sync the app(if it is not automatically synced).
In CLI, kill the port-forwarding and re-run the command,
kubectl port-forward service/react-app 3001:80 -n gitopstutorial
.Now, the changes must be reflected on the port
localhost:3001
That's all. Our app is up & running. With GitHub actions.
Creating Webhook
Here, we'll create a webhook so that the ArgoCD will be triggered automatically whenever we make and commit changes.
Go to the settings of gitops-infra repo. And go to the webhook section. Here we will create the new webhook which will trigger "ArgoCD".
Now, In CLI run command
kubectl get svc -n argocd
. Here's notice that we're watching the services of "argocd" not the application in argocd.Now, to expose our port we'll need ngrok. Ngrok Installation Guide.
After installing, run the command
ngrok http 8080
.After running the command you'll see this kind of interface.
Copy the https... link. And paste it into the Webhook's payload section followed by the "/api/webhook" part.
Content type: application/json.
SSL verification: Disable (for now).
Do not make any other changes and add webhook.
You may see, this kind of change in CLI.
Now, made some changes in the deployment file this time(by changing the replicas). And the ArgoCD will be triggered automatically. And synchronized as we had enabled AutoSync.
Final Touch
Now, to see that all the things are working perfectly. Make changes in App.js.
From Second Commit -> Third Commit.
And commit the changes.
The action should start working -> The AutoSync in ArgoCD must be done.
And on localhost:3001 where our app is running should reflect the changes we made. i.e. Second Commit -> Third Commit.
References
Rishav Sir's YouTube CI/CD video:
Gitops Infra(consists deployment and service files): https://github.com/imrishav/gitops-infra
Gitops workflow: https://github.com/imrishav/gitops-01